[NLP] 9. Self-Supervised Pre-Training Models
- -
Recent Trend
Transformer는 self-attention block을 6개 쌓아서 사용했다면,
최근 모델의 발전 동향은 모델 구조 자체에 대한 변경은 없이 Transformer에서 제시된 self-attention block을 deep하게 쌓은 형태이다. 이런 모델을 만들고 대규모 학습 데이터를 통해 Self-supervised learning 후 특정한 task들의 transfer learning 하는 방식으로 좋은 성능을 내고 있다.
그러나 Transformer의 self-attention에 기반한 모델들도, 자연어 생성이라는 task에서 단어를 <SoS>토큰 부터 시작해서 하나 하나씩 순차적으로 생성하는 greedy decoding framework에서 벗어나지 못하고 있다는 한계점이 존재한다.
GPT-1
- 다양한 special token(<S>, <E>, $ 등..)을 제안하여 다양한 task들을 동시에 커버할 수 있는 통합된 모델
GPT-1 모델 구조 및 학습 방식
Text sequence에 position Embedding을 더한 후 Self-attention block을 12개 쌓은 구조이다.
12개의 block 후에 Text Prediction이나 Task Classifier같은 task를 수행한다.
Seq2Seq 모델처럼 입력과 출력 Sequence가 별도로 존재하는 것이 아니라
예를 들어 웹페이지들로부터 크롤링한 영어 문장들에서 "I go home"이라는 문장이 있었다면 "I"라는 단어를 입력받으면 다음 단어인 "go"를 생성하는 Language Modeling Task를 학습한다.
문장 레벨의 Sentiment Classification의 경우 <Start>토큰 + 문장 + <Extract>토큰 sequence를 layer를 통해 encoding한 후
최종적으로 나온 <Extract> 토큰에 해당하는 encoding 벡터를 최종 output layer에 입력벡터로 줌으로써 이 문장이 긍정/부정인지를 분류하는 task로 학습한다.
예를 들어 “어제 존이 결혼했다” 라는 문장 그리고 “어제 최소한 한명은 결혼했다” 라는 문장이 주어지는 경우 첫번째 문장이 참이면 두번째 문장은 당연히 참이어야 하는 논리적인 내포관계가 있다.
Entailment prediction task에서는 다수의 문장으로 이루어진 입력을 받아서 예측을 수행해야하는데,
GPT-1 모델에서는 2개의 문장을 단순하게 하나의 sequence 로 만들되 Start 토큰을 넣고 문장 사이에는 특수 word 에 해당하는 delim 토큰을 추가하고 마지막에 Extract 토큰을 추가한다.
그리고서 encoding 과정을 통해서 얻어진 Extract 토큰의 encoding 벡터를 최종적인 output laye 에 통과를 시켜 논리적으로 내포관계인지 논리적으로 모순관계인지에 대한 분류 task 를 수행하게 된다.
⇒ Extract라는 토큰은 처음에는 문장의 마지막부분에 추가한 단어일 뿐이었지만 결국 문장을 잘 이해하고 문장이 긍정인지 부정인 혹은 두 개의 문장간의 관계를 잘 이해해서 두 문장이 논리적으로 내포관계에 있는지 모순관계에 있는지를 예측할 수 있게 된다.
self-attention을 통한 encoding 과정 중에 Extract 토큰이 Query로 사용되어서 task에 필요로하는 여러 정보들을 주어진 입력 문장들로부터 적절하게 정보를 추출하기에 위와 같은 task가 가능하다.
Pre-training / Transfer learning
모델을 통해서 주제분류를 한다거나 어떤 document 가 정치면인지, 경제면인지, 사회면에 실려야되는가에 대한 정보를 예측하는 등의 down-stream task를 수행하는 모델을 만들고자 한다면,
기존의 긍부정 분류를하는 task와는 다르기 때문에 긍부정 예측을 위한 output layer는 떼어내버리고
down-stream task를 위한 추가적인 layer를 붙이고 그 layer를 random initialization한다.
즉, 학습된 Transformer encoder와 down-stream task를 위한 추가적인 layer 하나를 덧붙이고 그 다음엔 down-stream task를 위한 학습 데이터를 통해 전체 network 를 학습하는 과정을 거치게 된다.
마지막 layer는 random initialization되기 때문에 학습이 충분히 되어야 하지만
이전에 있는 이미 학습된 layer에는 learning rate를 상대적으로 굉장히 작게 줌으로써 큰 변화가 일어나지 않도록 한다.
⇒ 기존의 학습하던 task를 통해서 배운 지식들을 충분히 잘 담고 있으면서 그 정보를 우리가 원하는 task에 활용할 수 있는 이런 형태로 Pre-training 및 down-stream task를 위한 fine-tuning 과정이 일어난다.
Pre-training :
Language Modeling task는 별도의 label이 필요로 하지 않는 데이터이기 때문에 굉장히 많은 양의 데이터를 통해서 다음 단어 예측 하는 task를 통해 학습한다.
transfer learning :
task에 해당하는 label이 일일히 부여되어 있어야 하고 상대적으로 소량의 데이터만이 존재하기 때문에, 앞서 Pre-training step에서 별도의 label 이 필요하지 않는 대규모 데이터를 통해 self-supervised learning를 통해 대규모 데이터로부터 얻을 수 있는 지식을 소량의 데이터만 있는 target task에 전이학습의 형태로 지식을 활용해서 성능을 올린다.
BERT
- 문장에 있는 일부 단어를 맞추도록 하는 task로 Pre-training을 수행한 모델
- Transformer 이전에는 다음 단어를 예측하는 등의 self-supervised learning을 LSTM 기반의 Encoder로 Pre-training하는 방법이 존재하였다. → ELMo
지금은 이런 LSTM 인코더를 Transformer로 대체한 모델로 점점 고도화 되었다.
Masked Language Model
GPT-1의 경우 "I study math"라고 문장의 경우 <SoS>라는 정보만을 주고 I 라는 단어를 맞추고 I 까지를 보고 study를 맞추는 과정으로 Pre-training을 진행했는데 이 경우는 전후 문맥을 보지 못하고 앞쪽에 있는 문맥만을 보고 다음 단어를 예측해야 하는 한계점이 존재한다.
⇒ 왼쪽 뿐만 아니라 오른쪽에 해당하는 정보를 다 보고 예측했을 때 좀 더 유의미한 예측과정 및 그리고 거기서 배울 수 있는 지식들이 더 많지 않을까?
Pre-training Tasks in BERT
위 motivation으로부터 나온 것이 Masked Language Modeling이라고 하는 BERT에서의 Pre-training task이다.
“I study math” 라는 문장이 주어졌을 때, 각각의 세 단어의 대해 일정한 확률로 각 단어를 [MASK] 라는 단어로 치환하고 그 단어가 무엇인지를 맞추도록 모델의 학습이 진행된다.
몇 %의 단어를 [MASK] 단어로 치환해서 그 단어를 맞추도록 할지에 대한 부분은 사전에 잘 결정해주어야 하는 하이퍼파라미터이다.
- [MASK]로 치환하는 비율을 크게 설정하면 주어진 문장에서 너무 많은 부분을 [MASK]로 처리하게 되어서 [MASK]에 해당하는 단어를 맞추기에 충분한 정보가 제공되지 않는 문제점이 있다.
- [MASK]로 치환하는 비율을 작게하는 경우에는
100 단어 중에서 한 단어만을 [MASK]로 처리해서 맞추도록 학습을 진행하면 Transformer 모델이 전체 정보를 다 encoding하는 과정은 많은 계산을 필요로 하는데 단 한문제만 출제해서 task를 수행하기 때문에 학습이 전체적으로 효율이 떨어진다거나 학습속도가 충분히 빠르지 않은 형태가 나타날 수 있다.
BERT에서 찾은 적절한 비율은 15% 정도이다.
주어진 문장에서 평균적으로 15%의 단어가 [MASK] 라는 단어로 치환이 되어있는 상황에 익숙해진 모델이
다른 down-stream task 를 수행할 때는 [MASK] 라는 토큰은 더이상 존재하지 않기 때문에
Pre-training 당시에 주어지는 입력벡터의 양상이나 패턴이 실제 down-stream main task 를 수행할 때에 주어지는 입력문장과는 다른 특성을 보일수가 있는데, 이러한 차이점이 학습을 방해할 수 있다.
⇒ [MASK]로 치환하기로 한 15%의 단어들 내에서도 서로 다른 형태로 단어들을 변경한다.
- 15% 중에서 80%는 [MASK] 토큰으로 치환하고 이를 맞추도록 한다
- 15% 중에서 10%는 random한 단어로 바꾼다.
- 15% 중에서 10%는 원래 단어 그대로 둔 채 그 단어가 다른 단어로 바뀌어야 하는지, 동일해야하는지를 예측할 수 있도록 한다.
Pre-training Tasks in BERT: Next Sentence Prediction
BERT는 Masked-Language Model을 통해 word 별로 원래 있어야 하는 단어를 예측하는 task 이외에 GPT처럼 문장 레벨의 task에 대응하기 위해 Next Sentence Prediction라는 Pre-training 기법도 제안한다.
- 주어진 하나의 글에서 2개의 문장을 뽑은 뒤 연속적으로 이어주고 문장 사이에는 [SEP] 토큰 혹은 문장이 끝날때에도 [SEP] 토큰을 추가해서 이 문장이 끝났다는 것을 알려준다.
- 문장 / 다수의 문장 레벨에서의 예측 task를 수행하는 역할을 담당하는 토큰으로서 [CLS] 토큰 혹은 Classification 토큰을 문장의 앞에 추가한다.
(GPT의 Extract 토큰의 역할을 한다고 볼 수 있다.: 문장 마지막에 등장하고 그 Extract 토큰을 통해서 문장이나 다수 문장 레벨의 예측 task를 수행할 수 있도록 함) - 연속적으로 주어진 2개의 문장이 순서대로 나와야 하는 문장인지 혹은 연속적인 문장이 아닌지에 대한 Binary Classification 을 수행하는 task 를 추가하였다.
BERT Summary
- 모델 구조 자체는 Trnasformer 에서 제안된 self-attention block 을 그대로 사용했고 그것을 두가지 버전으로 학습된 모델을 제안
- BERT BASE :
self-attention block = 12개
각 layer 별로 정의되는 attention head 의 숫자 = 12개
self-attention block의 encoding vector 의 차원 수 = 768 - BERT LARGE :
self-attention block = 24개
각 layer 별로 정의되는 attention head 의 숫자 = 16개
self-attention block의 encoding vector 의 차원 수 = 1024
- BERT BASE :
- 입력 sequence를 넣어줄 때 word 별 embedding vector를 사용하는 것이 아니라 word 를 좀 더 잘게 쪼개서 각각의 sequence의 단위를 sub-word 라 불리는 단위로 먼저 embedding 을 하고 그것을 입력 벡터로 넣어주는 방식을 취한다.
(WordPiece embedding : Pretraining → Pre / training) - Leanred Positional Embedding
- Transformer에서는 사전에 미리 특정한 방식을 통해 정의된 sin, cos 값으로 position에 해당하는 embedding 벡터를 사용했다면
- BERT는 positional embedding 자체도 학습에 의해서 결정
- [CLS]토큰 - Classification embedding
- [SEP]토큰 - 문장 끝에 나오는 토큰
- Segmentation Embedding
- 두개의 문장을 [SEP] 토큰으로 구별해서 넣는 경우 각각에 해당하는 word embedding vector에 postional embedding 이 추가적으로 더해질텐데
아래 그림처럼 `he` 라는 단어의 경우는 전체 sequence에서 6번째 position에 위치한 단어는 맞지만 문장을 하나의 독립된 정보를 나타내는 단위로 본다면 이 경우는 첫번째 단어로서 보되 두번째 문장에 속하는 그런 문장이다라는 정보를 분리해서 넣어줘야 할 필요성이 있다.
→ positional embedding은 순차적으로 반영하되 또 다른 종류의 positional embedding으로서 segment embedding 을 넣는다.
첫번째 문장과 두번째 문장이 문장 레벨에서의 어떤 position 혹은 index를 반영한 vector라고 볼 수 있다. - embedding vector가 2차원이라고 하면 2차원의 postional embedding vector를 더해주는 것 뿐만 아니라
첫번째 문장에서는 첫번째 segment 혹은 첫번째 문장이다라는 것을 나타낼 수 있는 첫번째 문장에서는 모든 word 들에 대해서 동일한 2 dimensional embedding vector를 더해 주고
두번째 segment를 나타내는 벡터를 또 학습에 의해서 최적화를 해서 그 벡터를 embedding vector에 더해주는 형태로 동작한다.
- 두개의 문장을 [SEP] 토큰으로 구별해서 넣는 경우 각각에 해당하는 word embedding vector에 postional embedding 이 추가적으로 더해질텐데
BERT와 GPT의 차이점
- GPT의 경우 바로 다음 단어를 예측해야하는 task를 수행해야 하기 때문에 주어진 sequence를 encoding할 때 특정한 timestep에서 다음에 나타난 단어를 접근을 허용하면 안된다.
- 그래서 GPT 모델은 sequence 인코딩을 위한 attention block은 Transformer의 decoder 부분에서 사용되던 Masked self-attention 을 사용한다.
- BERT의 경우 [MASK] 로 치환된 토큰들을 주로 예측하기 때문에 [MASK] 단어를 포함하여 전체 주어진 모든 단어들에 접근이 가능하도록 허용함으로써 Transformer의 encoder에서 사용되던 self-attention 모듈을 사용한다.
BERT: Fine-tuning Process
논리적으로 내포관계 혹은 모순관계를 예측하는 등의 Sentence pair Classification task
2개의 문장을 [SEP] 토큰으로 구별 지은 하나의 sequence로 만든 후
BERT를 통해 encoding 을 하고나서
각각의 word들에 대한 encoding vector 를 얻었다면 [CLS] 토큰에 해당하는 encoding vector를 output layer의 입력으로 주어서 다수 문장의 대한 예측 task를 수행한다.
Single Sentence Classification Task는
입력으로 주는 문장이 한번에 하나씩 밖에 없기 때문에 첫번째 위치에 [CLS] 토큰과 그 뒤에 한 문장을 입력으로 넣어주고
[CLS] 토큰의 encoding output을 최종 output layer에 넣어주어서 classification 을 수행한다.
POS 태깅처럼 각각의 단어별로 classification 해줘야하는 Single Sentence Tagging Task의 경우,
[CLS] 토큰을 포함해서 각 단어의 encoding 벡터를 얻으면 그 벡터를 공통의 output layer를 통과해서 각 word 별로 classification을 수행한다.
BERT vs GPT-1
- training data size
- GPT-1는 대략 800M 개수의 토큰을 가지는 학습데이터를 사용해서 학습
- BERT는 대략 GPT-1의 3배정도의 2,500M 개의 달하는 토큰수로 이루어진 데이터로 학습을 진행
- Training Special tokens
BERT는 GPT-1과는 달리 [Extract ]토큰 대신 [CLS] 토큰을 사용하고 문장 간의 분류하는 [SEP] 토큰과 이와 더불어 여러문장이 주어졌을 때 각 문장별로 인덱스를 나타낼 수 있는 segment embedding 혹은 sentence A 냐 B 냐에 대한 각기 다른 embedding 을 입력단에서 더해줌으로써 두 문장을 좀 더 잘 구분할 수 있도록 하였다. - Batch size
BERT 와 GPT 간의 한번에 학습하는 배치사이즈를 하이퍼파라미터로서 서로 다르게 사용하였다.
하이퍼파라미터는 일반적으로 더 큰 사이즈의 배치를 사용하게되면 최종 모델 성능이 더 좋아지고 학습도 더 안정화가 되는 그런 현상을 보여준다. 그렇지만 배치사이즈를 키우기 위해서는 한번에 load해야 하는 입력데이터 뿐만 아니라 Forward propagation과 Back propagation 상에서 필요로하는 memory도 비례해서 증가하기 때문에 더 많은 GPU memory 그리고 그에 따른 더 고성능의 GPU를 필요로 한다.
BERT : 128,000 words
GPT-1 : 32,000 words - Task-specific fine-tuning
- GPT-1은 fine-tuning 당시의 learning rate을 여러 donwstream에서 동일한 값을 사용한다.
- BERT 는 각 task 별로 서로 다른 learning rate 를 사용한다.
Machine Reading Comprehension (MRC), Question Answering
- 질의응답에 한 형태로, 질문만 주어지고 그 질문에 대한 답을 예측하는 task가 아니라 기계독해에 기반한 즉, 주어진 지문이 있을 때 지문을 잘 이해하고 질문에서 필요로 하는 정보를 잘 추출해서 해당 정답을 예측해내는 task이다.
BERT : SQuAD 1.1
- SQuAD는 크라우드소싱을 통해 많은 사람들로부터의 task를 수행하여 구축된 데이터로 1.1 ver과 2.0 ver이 있다.
SQuAD 1.1은 아래 그림처럼 각각의 crowd worker들에게 wikipeida에서 random하게 뽑은 한 document를 읽고 풀 수 있는 문제와 정답을 만들도록 한 데이터셋이다.
주어진 지문과 답을 필요로 하는 질문을 [SEP] 토큰을 통해 concat하여 하나의 sequence로 만들어서 BERT의 입력으로 사용한다.
정답의 위치는 지문상에서의 특정한 문구로 보통 정답이 주어지는데 그 문구의 위치를 기본적으로 예측하도록 이 모델을 수행하게 된다.
각 word 별로 encoding 벡터가 output으로 나왔을 때 공통된 output layer를 통해서 scalar 결과값을 얻게된다.
예를 들어 각각의 word 가 2차원 벡터로 최종 encoding 벡터가 나온 경우 output layer는 2차원 벡터를 scalar 값으로 변경해주는 Fully connected layer가 된다. 이 때, Fully connected layer의 파라미터는 random initlaization에서 부터 fine-tuning 되는 파라미터이다.
정답 구문이 시작되는 단어와 끝나는 단어를 예측해야하므로 각각의 Fully-connected layer로부터 출력한 각 word의 scalar 값을 softmax에 통과시키고 그 softmax의 ground-truth값으로서 첫 번째 시작하는단어(끝나는 단어)의 확률이 100%에 가까워지도록 loss를 통해 Fully-connected layer를 학습한다.
BERT : SQuAD 2.0
- 주어진 지문에 대해서 항상 정답이 있을 법한 질문을 뽑아놓고 질문에 대한 답이 없는 경우의 데이터셋들 까지도 포함을 한 버전의 데이터셋이다.
- 이 질문에 대해서 먼저 답이 있는지 없는지를 판단하고 그 다음에 답이 있다면 위에서 본 방식대로 답에 해당하는 문구를 예측한다.
- 주어진 지문과 질문에 대해 답이 있다 없다를 예측하는 task는 High-Level에서 보면 문단과 질문을 종합적으로 보고 판단해야 하는 task이다.
지문과 질문을 concat해서 하나의 sequence로 만들고 BERT를 통해 encoding을 한다.
거기서 나온 [CLS] 토큰에서 주어진 질문과 지문에 대한 쌍에서 답이 실제로 없는 ground-truth 가 “No answer” 라고 표시된 경우는 [CLS] 토큰을 binary classification 하는 output layer 를 둬서 그 결과값이 “No answer” 로 적절히 예측되도록 하는 CrossEntropyLoss를 통해서 학습한다. - 최종적으로 예측에 이 모델을 사용할 때는 먼저 [CLS] 토큰을 통해 답이 있는지 없는지를 예측하고 답이 있는 것으로 예측결과가 나온 경우 위에서 설명한 starting 및 ending position 을 예측하는 output layer를 구동함으로써 답에 해당하는 문구를 예측한다.
BERT : On SWAG
다수 문장을 다뤄야하는 task 의 BERT 를 사용한 사례로는 아래 그림처럼 주어진 문장이 있을 때, 그 다음에 나타날법한 적절한 문장을 고르는 task가 있다.
가능한 경우가 4가지가 있기 때문에 조금 비효율적일 수 있지만 첫문장과 가능한 4개의 선택지 중 첫번째를 concat 해서 BERT 를 통해 encoding 을 한다. 거기서 나온 [CLS] 토큰에 Fully connected layer를 output layer로 사용하여 scalar 값을 예측하게 한다.
나머지 문장들도 위와 같은 동일한 과정을 거쳐서 4개의 scalar 값이 나오게 되면 softmax에 입력으로 주고 그 다음에 정답이 가령 1번이라고 하면 그 4개 중에 ground-truth 확률을 첫번째가 100%에 가깝도록 softmax loss를 통해 학습한다.
BERT : Ablation study
모델사이즈를 더 키울 수 있다면 Pre-training을 통한 여러 다양한 down-stream task에 적용했을때의 성능이 점점 더 오를 것이라는 결과를 보여준다.
'부스트캠프 AI Tech 4기' 카테고리의 다른 글
[WEEK05] 회고 (2) | 2022.10.21 |
---|---|
[NLP] 10. Other Self-supervised Pre-training Models (0) | 2022.10.21 |
[NLP] 8. Transformer (0) | 2022.10.19 |
[NLP] 7. Transformer - Scaled Dot-Product Attention (0) | 2022.10.18 |
[NLP] 6. Beam Serach and BLEU score (0) | 2022.10.17 |