(9강) Self-Supervised Pre-Training Models

💡
Transfer Learning, Self-Supervised Learning, Transformer를 사용한 GPT-1과 BERT에 대해 알아본다.

Recent Trends

Transformer의 기능을 사용하면서, 동시의 대규모 데이터를 미리 학습한 Model들로 인해 NLP의 다양한 Task에서 좋은 성과를 거두고 있다. Transformer에서 제시한 Self-Attention Block은 아주 좋은 성능을 보여주고 있으며, 현재는 모든 Encoder와 Decoder의 기본 형태로 사용되고 있다. 요새에는 이 모델을 아주 깊게 쌓아서 사용하는 형태로 발전하고 있다. Self-Supervised Learning Framework를 통해 대규모로 학습을 수행한 Model을 원하는 Task에 따라 Fine Tuning함으로써 사용되고, 현재는 이러한 모델이 아주 높은 성능을 보이고 있다. 대표적으로 GPT-X와 BERT가 있다.

ELMo는 먼저 제시된 Pre-Trained Model로 LSTM을 사용하였다. Transformer 구조를 사용한 GPT와 BERT보다 성능이 떨어지는 것으로 알려져 있다.

단, 이와 같은 모델은 자연어 생성이라는 Task에서 여전히 Greedy Decoding을 사용하고 있다는 한계를 가지고 있다. 이와 같은 부분이 위 모델의 개선점으로 남아있다.

GPT-1

OpenAI에서 제시한 모델로, Pre-Trained Model의 시초격인 모델이다. 현재는 GPT-3까지 제시되었으며, 자연어 생성에서 놀라운 성과를 보이고 있다. GPT 모델은 큰 변형 없이 여러 Task에 대해서 범용적으로 사용될 수 있다는 점이 가장 큰 특징이다. 이런 범용적인 활용을 위해 Special Token의 개념을 추가한 것이 핵심적인 아이디어이다.

좌측은 모델의 형태를 의미하고, 우측은 다양한 Task를 의미한다.

GPT의 학습과정을 자세히 살펴보자.

먼저, 모델은 12개의 Attention Block으로 구성되어 있다. 학습은 Text Prediction의 형태로 진행된다. 즉, Input에 대해 다음 단어를 예측하는 Language Modeling Task로 학습하는 것이다. 이는 학습을 위해 특별한 Labeling 없이 다양한 Data를 사용할 수 있다는 장점이 있다.

이와 동시에, Task Classifier는 Special Token을 통해서 수행하고자 하는 Task가 무엇인지 파악한다. 예를 들어, Classification Task를 수행하는 경우에는 <Start><Extract> Token만 존재하는 것으로 Task를 알리고, Entailment Task는 <Delimiter> Token으로 문장을 분할하는 등으로 Task를 알린다.

Classification Task의 예시를 자세히 알아보자.

Classification Task 작동 예시

먼저, Task Classifier에 의해 해당 Task가 Classification인 것이 인식된다. <Extract>Token은 End Token 대신 특별한 의미를 갖는 Token으로 사용된다. <Start>Token부터 <Extract>Token 까지 Text의 Word를 Encoding한다. <Extract>Token의 Encoding Vector만이 Linear Layer를 통과하고, 해당 값을 통해 Classification이 수행된다.

Entailment Task의 예시를 자세히 알아보자.

Entailment Task 작동 예시

이와 같은 Task를 수행하기 위해 두 문장을 구분해주는 <Delimiter>Token이 사용된다. 이 토큰에 의해서 다른 두 문장이 하나의 Sequence 형태로 입력될 수 있다. Classification과 같이 Encoding 과정을 거친 이후에, <Extract>Token의의 Encoding Vector만 Linear Layer를 통과하여 해당 문장간의 관계를 출력한다. 즉, <Extract>Token은 단순히 문장의 끝을 알리는 기능을 하는 것이 아니고, 앞 단어로부터 Task에 맞는 정보를 잘 저장하여 결과를 내는 역할을 수행한다.

GPT-1 Transfer Learning

위와 같은 과정으로 Pre-Training 된 모델을 우리의 Task에 적용하기 위해선 Transfer Learning 과정이 필요하다.

먼저, 학습에 사용되었던 Linear Layer를 떼어내고 우리의 목적에 맞는 Layer를 추가한다. 해당 Layer는 Random Initialization한다. 이후 우리의 Task에 필요한 Data와 Label을 입력하여 학습 시킨다. 우리가 추가한 Layer는 충분한 학습이 필요하기 때문에 높은 Learning Rate를 부여한다. Pre-Training 된 Attention Block에는 낮은 Learning Rate를 부여하여 큰 변화가 생기지 않도록 한다.

위와 같은 과정을 통해서 Pre-Training Model이 가지고 있는 정보를 활용하면서 우리의 Task를 적절하게 수행할 수 있다. Self-Supervised를 통해 Pre-Training한 Model은 기존의 다른 모델에 비해 매우 많은 Data를 학습한 것으로, 기존에 Task만을 위해 개발된 Model에 비해서 높은 성능을 내고 있다.

Pre-Trained Model은 기존의 Model보다 월등히 높은 성능을 보이고 있다.

BERT

BERT는 현재까지도 매우 널리 많이 사용되고 있는 Pre-Trained Model이다. BERT 역시 Language Modeling을 통해 Self-Supervised Learning한다. GPT와의 차이점은, 학습을 위해 앞 뒤의 Word를 모두 사용한다는 것이다. 직관적인 예시로, 우리는 못들은 단어가 있는 경우 앞 뒤 모두의 단어를 듣고 문맥을 파악한다. 이와 같은 방법을 학습에 사용하기 위해, Mask라는 개념을 추가한다.

BERT의 Pre-Training Task는 Masked Language Model이라 칭한다. 주어진 Sequence에 대해서 특정 확률로 Word를 변경한다. BERT에서는 특정 확률을 15%로 사용한다. 확률일 너무 높을 경우에는 예측을 수행하는데 Data가 부족할 수 있고, 너무 낮을 경우에는 학습 시간에 비해 최적화가 적게 될 수 있는데, 이에 대한 적절한 값을 15%로 판단한 것이다.

storegallon[MASK]로 치환되었다.

실제 우리의 Task의 Data는 [MASK]Token이 등장하지 않고, 모델이 여러 Task에 적용될 수 있도록 다양하게 치환하여 학습을 진행한다. 특정확률의 80%에 대해서는 [MASK]로 치환하고, 10%에 대해서는 전혀 다른 Word로 치환하고, 나머지 10%는 그대로 유지한다.

각 확률에 따른 치환 예시

Word 단위 Task 외에도 GPT의 아이디어에 착안하여, Sentence 단위의 학습을 동시에 진행한다. 뒤의 문장이 앞의 문장 뒤에 오기에 적절한지 아닌지에 대한 Task로 학습을 진행하는 것이다. 문장 앞에 [CLS]Token을 추가하여 Task를 알리고, [SEP]Token을 통해 두 문장을 하나의 Sequence로 연결하여 Input으로 전달한다.

뒤의 문장은 앞의 문장과 적절하다.
뒤의 문장은 앞의 문장과 적절하지 않다.

Input Data에 대한 출력은 [CLS]Token과 [MASK]Token의 Encoding Vector를 통해 출력된다. [CLS]Token의 Encoding Vector는 Sentence 단위의 Task의 예측값으로 사용되고, [MASK]Token의 Encoding Vector는 Word 단위의 Task의 예측값으로 사용된다. 이 값들과 Ground Truth의 비교를 통해 학습이 진행된다.

BERT는 Transformer의 구조를 그대로 사용하기 때문에, Input Sequence에 대한 순서 정보를 따로 입력해야 한다. Transformer에서는 Unique한 Position Embedding을 미리 생성해두었다가 더하는 형식이었으나, BERT는 이 Position Embedding까지 학습하여 추가한다. 또한, Sequence내에서 각각의 문장을 구별하기 위해 Segment Embedding의 개념을 추가하여 활용한다. 즉, 최종 Encoding Vector에는 Token의 정보, 속한 문장의 정보, 순서의 정보가 포함되는 것이다.

이와 같이 Pre-Training된 BERT는 BASE와 LARGE로 구분된 두개의 Architecture를 제공한다. 구조는 동일하게 Transformer의 구조를 사용하고, Model의 크기만 차이가 있다. 위에서 살펴본 BERT의 정보를 종합하면 다음과 같다.

L은 Attention Block의 갯수를 의미한다. H는 Encoding Vector의 Dimension을 의미한다. A는 Multi-Head Attention의 Head 갯수를 의미한다.

BERT Transfer Learning

위와 같이 Pre-Training 된 BERT Model은 각 우리의 Task에 맞게 Transfer Learning되어 사용된다. Task에 맞게 각 Output이 달라지는데, 이를 자세히 살펴보자.

한 문장이 어디에 속하는지 혹은 두 문장의 관계가 어떤 관계인지 분류하는 Classification에 대해서는 [CLS]Token의 Encoding Vector만을 사용하여 Output을 출력한다.

각 Word의 품사를 구별하는 Task의 경우에는 Token을 제외한 모든 Word에 대한 Encoding Vector로만 Output을 출력한다.

Question And Answering과 같은 Task에 대해서는, 새로운 문장의 형태로 Output을 출력한다.

BERT vs GPT-1

BERT는 새로운 Masking의 형태로 Data를 학습하고, GPT는 Transformer의 Masking을 사용해 학습한다.

GPT는 좌측으로 이동하는 화살표가 존재하지 않는다.

Model의 형태로 비교했을 때, BERT는 GPT-1보다 더 복잡하고 크다.

BERT가 Data, Batch size등이 더 크며, Sentence Position Embedding, LR Scheduler 등이 추가되어 더 복잡한 형태의 Model이다.

전체적인 NLP Task의 결과 역시 BERT의 성능이 뛰어나다.

NLP의 여러 Task를 한 곳에 모아놓은 Dataset(Benchmark set)을 GLUE라고 한다.

BERT를 활용한 다른 모델들도 더 많은 Parameter와 Batch Size를 사용할 수록 성능이 좋아지는 현상을 보이고 있다.

앞으로도 더 큰 모델이 계속 좋은 성능을 보일 것으로 예측된다.

Machine Reading Comprehension Task

BERT는 특히 Machine Reading Comprehension과 같은 복잡한 Task에서 GPT보다 더 뛰어난 성능을 보인다.

MCR Task의 예시 해당 Task의 대표적인 Dataset으로 Stanford에서 제공하는 SQuAD나 SWAG가 있다.

BERT는 이와 같은 Task를 수행하기 위해서, 주어진 지문과 질문을 모두 Concatenate하여 하나의 Sequence로 입력으로 받는다. 각 Word에 대한 Encoding Vector를 만든 이후에, Fully Connected Layer를 통과시켜 Scalar 값으로 만든다. 즉, Word와 1:1 대응하는 Scalar값을 만드는 것이다. 각 Word에 대한 Scalar값을 Vector로 묶어서 Softmax를 통과시키고, 확률 값을 얻어낸다. 이 과정은 서로 다르게 두 번 진행된다. 한 번은 정답에 해당하는 Word의 시작 위치를 찾는 것이고, 한 번은 끝나는 위치를 찾는 것이다.

SQuAd 1.1의 Task는 위와 같이 정답에 해당하는 위치 정보 두개를 반환한다.

SQuAd 1.1 예시

SQuAd 2.0의 Task는 한 가지가 더 추가되어, [CLS]Token의 Encoding Vector를 통해 정답이 지문 내에 있는지 없는지에 대한 내용도 결과로 반환한다.

SQuAD 2.0 예시

SWAG은 주어진 문장 여러 중에 가장 적절한 문장을 고르는 Task이다. 이 경우에는, 각 문장과 한 번씩 Concatenate하여 Input으로 사용한다. 각 Sequence로부터 생성된 [CLS]Token의 Encoding Vector를 Scalar값으로 치환하고, 위와 마찬가지로 Softmax에 통과시켜 확률이 가장 높은 문장을 고른다.

SWAG 예시

실습

GitHub Gist Link


(10강) Advanced Self-Supervised Pre-Training Models

💡
GPT-1과 BERT 이후에 등장한 Self-Supervised Pre-Training Model의 특징과 모델의 발전 방향성에 대해 알아본다.

GPT-2

GPT-2는 이전 버전인 GPT-1의 후속으로 등장한 모델이다. 구조적으로 크게 달라진 것은 없다. 단순히 Transformer의 Block이 늘어났으며, 학습의 Task도 동일하게 Language Model을 사용했다. 단, 학습시키는 Data에 중점을 두었다. 이전에는 Wikipedia의 Text 등을 사용했으나, 이번에는 조금 더 질이 높은 Text를 사용해 학습을 진행했다. 이 모델은 어떤 추가적인 학습 없이 Down-Stream Task에서 좋은 성능을 보여 큰 화제가 되었다.

GPT-2가 Zero-Shot상태에서 수행한 Down-Stream Task의 결과물 예시

GPT-2는 NLP의 다양한 Task를 모두 Question and Answering으로 수행할 수 있다는 동기로부터 개발되었다. 이전 강의에서 보았듯 NLP의 다양한 Task는 어떤 토큰에서 어떤 값을 취해야하는지 등의 큰 차이를 가지고 있다. GPT-2는 이 다양한 모든 Task를 Input Sequence에 질문을 추가하는 것으로 Task를 일원화 할 수 있다는 가능성을 보여주었다. 예를 들어, Segment Classification의 경우에 문장 끝에 'So, do you think whether this sentence is positive or negative?'와 같이 추가하여, 생성되는 문장을 Task의 결과값으로 사용하는 것이다.

GPT-2는 이전 버전과 달리, 학습에 사용할 Dataset에 관심을 가졌다.

먼저, 학습에 사용될 Data를 선별적으로 선택해서 사용했다. 예를 들어, Reddit에서 Up-Vote를 3개 이상 받은 외부 Link 문서의 정보나 News의 Text 등을 추가했다. 반대로, Wikipedia의 8M개의 문서는 오히려 삭제했다. 결론적으로는 선별된 질 좋은 Data를 더 많이 사용하여 학습을 진행했다.

기술적 특징으로는, Byte Pair Encoding을 통해서 Sub-Word Level의 Word Embedding을 도출하고 사전을 구축하는 알고리즘을 사용했다.

GPT-2의 구조는 GPT-1과 크게 다르지 않지만, 초기화 방법에서는 차이를 가진다. Layer가 상단에 있을 수록 더 작은 값을 갖도록 초기화하여 학습을 진행했다. 이를 통해서 상단에 있는 Layer의 영향을 줄이고 하단에 있는 Layer일 수록 영향을 더 많이 행사할 수 있도록 구성했다.

GPT-2는 Fine Tuning 없이 Zero-Shot인 상태에서 각종 Task에서 좋은 성능을 낼 수 있었다.

QA Task 예시
Summarization Task 예시 Input Sequence에 'TL;DR:'을 추가해, 문장을 요약할 수 있도록 한다.
Translation 예시

GPT-3

GPT-2를 개선한 모델이나, 구조적인 특징보다는 Model의 Size를 증폭시키는데에 중점을 두었다. 비교할 수 없이 많은 Parameter와 Data, Batch Size를 사용해 학습을 진행시켰다.

GPT-3의 Parameter 갯수 예시

GPT-3는 GPT-2에서 보여주었던, 모든 Task를 일원화 할 수 있다는 가능성을 더 짙게 보여주었다. GPT-2에서는 Zero-Shot의 상태로 어떤 추가적인 학습없이, 질문에 대한 Down-Stream으로 Task에 맞는 Output을 생성했다. GPT-3는 Inference해야하는 질문에 예시를 추가하는 방식을 사용할 수 있게 되었다. 이를 통해 우리는 그 어떤 Fine Tuning 과정 없이, Task에 필요한 정보를 모델에 입력할 수 있게 된 것이다. 이를 통해 Zero-Shot일 때의 성능보다 훨씬 더 좋은 성능을 발휘할 수 있게 되었다.

One-Shot의 예시
Few-Shot의 예시

또한, Parameter가 클수록 이러한 예시에 동적으로 적응하는 능력이 더 좋게 작용하는 결과가 도출되었다.

Parameter가 큰 모델일수록, Shot이 많을수록 성능이 좋다.

ALBERT

ALBERT는 A Lite BERT의 줄임말로, 기존의 BERT모델을 경량화하는 방향으로 발전시킨 모델이다. 경량화를 통해 더 빠른 학습과 적은 자원을 필요로 하면서, 동시에 더 좋은 성능을 낼 수 있도록 개발되었다.

ALBERT 모델의 성능 예시

이와 같은 성과를 낸 아이디어를 알아보자.

Transformer는 Residual Connection의 사용 등으로 늘 동일한 Dimension을 유지해야 한다. 이때, Dimension을 그저 줄이게 되면 담을 수 있는 정보의 다양성이 줄어들게 된다. Dimension을 늘리면, Parameter의 증가로 모델이 무거워지게 된다. ALBERT는 Factorized Embedding Parameterization 방법을 제시했다.

Dimension을 유지시켜주는 선형변환을 추가했다.

낮은 값인 EE를 Word Embedding Vector의 Dimension으로 사용하고, 이후 선형변환을 통해 원래의 Dimension인 HH로 변환하여 전달하는 방식을 의미한다. 예를 들어, V=500, H=100, E=15라고 가정하면, Parameter는 41000개의 차이를 갖게 된다. 이를 통해 필요한 Parameter의 개수를 크게 줄이게 되었다.

한 개의 Transformer Block에서 학습되는 주된 Parameter는 {WQ,WK,WV}×H+WO\{ W^Q, W^K, W^V \} \times H + W^O이다. ALBERT는 학습이 필요한 Parameter의 갯수를 줄이고자, 서로 다른 Attention Block이 Parameter를 공유하는 형태를 제시했다. Cross-Layer Parameter Sharing을 통해 성능의 적은 저하로 모델의 경량화를 크게 달성했다.

FFN은 Feed-Forward Network의 Parameter를 공유하는 방안이다. Attention은 Attention Model 내의 Parameter를 공유하는 방안이다. E는 Word Embedding Vector를 기존에서 축소한 차원이다.

ALBERT는 학습에 있어서도 새로운 방법을 제시했다. 기존의 BERT 모델 Sentence단위 Task가 성능 향상에 큰 도움을 주지 못한다고 판단했다. 전혀 다른 문장의 결합은 문제의 난이도 자체가 쉽기 때문이다. 이에 대한 대안으로, 같은 지문 내에서 문장의 순서만 바꾸고 이에 대한 예측을 수행하는 Task를 제시했다. 즉, 문장의 순서가 바뀌었는지 검토하는 Task를 의미한다. 이 Task를 사용해 학습한 Model은 각종 Task에서 더 좋은 성능을 발휘했다.

NSP는 Next Sentence Prediction의 줄임말로, 기존 BERT 모델의 Task이다. SOP는 Sentence Order Prediction의 줄임말로, ALBERT 모델의 Task이다.

ELECTRA

이 모델은 'Efficiently Learning an Encoder that Classifies Token Replacements Accurately'라는 제목을 가진 논문으로부터 제시되었다. 가장 큰 특징은, Masking을 그럴듯한 Word로 치환하는 Generator와, 이를 확인하는 Discriminator를 사용해 학습을 진행하는 것이다.

Input Sequence를 Generator가 Masking하고, Discriminator가 이를 예측한 값을 출력한다. 원래의 Input Sequence를 Label로 하여, 학습을 수행한다.

이와 같은 학습의 방법론을 Adversarial Learning이라 한다. 이는 GAN에서 제시한 방법을 NLP의 Pre-Training 모델로 구현한 형태이다. 여기에서 사용된 Discriminator는 Transformer를 사용한 모델이며, 학습이 완료된 후에 실제로 사용되는 모델이다.

ELECTRA는 다른 Model에 비해서, 계산량 대비 성능이 높게 나오는 것을 확인할 수 있다.

ELECTRA Model의 성능 예시

Light-weight Models

Pre-Trained Model은 다양한 방향으로 발전해나가고 있다. 이 중 경량화라는 발전 방향이 있다. 비대한 Size의 Model을 작은 Device에서도 사용할 수 있도록 경량화하면서, 성능의 저하를 줄이는 방향이다.

DistilBERT는 Knowledge Distillation 기법을 사용한다. 이는 Layer가 더 적고 가벼운 모델이 무거운 모델과 유사한 성능을 낼 수 있으면서 더 빠르게 학습하는 방법이다. 경량화 된 모델인 Student-Model과 무거운 모델인 Teacher-Model을 사용한다. Student-Model은 Teacher-Model의 Output Pattern을 모사하는 방식으로 학습을 진행한다. 즉, Teacher-Model이 특정 Word를 통해 도출한 확률분포를 그대로 Student-Model의 Label로 활용하여, 이 패턴과 유사하도록 학습하는 방식을 의미한다.

TinyBERT는 DistilBERT와 동일한 방법론을 사용하고, 더 나아가 Hidden State Vector의 패턴 까지도 학습하는 방법을 사용한다. Student-Model은 중간 레이어의 결과도 Teacher-Model과 대조하게 된다. 이때, Dimension의 Miss Match 이슈를 해결하기 위해서 중간에 학습 가능한 Fully Connected Layer를 사용했다. 동일한 차원의 Vector이므로, MSE Loss를 적용하여 학습해, 중간결과까지 모사한다.

Fusing Knowledge Graph into Language Model

최근 NLP의 연구 방향에는 외부의 정보를 적용하는 모델을 개발하고자하는 뱡향이 있다. BERT와 같은 모델은 지문 내에 정보가 단어로 드러나있으면 아주 잘 작동하지만, 그렇지 않은 경우에는 잘 작동하지 않는다. 예를 들면, '꽃을 심기 위해, 땅을 팠다.'라는 문장 혹은 '집을 짓기 위해, 땅을 팠다.' 라는 문장이 있는 경우 '어떤 도구를 사용했는가?'에 대한 질문에는 잘 답변하지 못하는 것이다.

이처럼 상식과 가까운 외부적인 정보를 이해하고 사용하는 것은 NLP에 있어서 매우 중요한 분야라고 할 수 있다. 이러한 실제 세계의 여러 개체간의 관계를 잘 정의하고 사용할 수 있도록 Knowledge Graph를 설계하고 Language Model에 적용하는 다양한 연구가 진행되고 있다.

실습

GitHub Gist Link


Reference

OpenAI Self-Supervised Learning

BERT Paper

SQuAD Homepage

SWAG Homepage

XLNet Paper

Explain GPT-2

GPT-2 Paper

+ Recent posts