본문 바로가기

boostcamp AI tech/boostcamp AI

Self-Supervised Pre-training Model (GPT-1, BERT)

728x90

self-attention block으로 구성된 encoder-decoder모델은 nlp의 다양한 분야에서 놀라운 성능을 보여주었다.

pre-training model로 gpt-1, bert를 알아본다.

더 깊게 attention block을 쌓았다는 점을 제외하면 구조적으로 차별화되는 큰 점은 없다. 다만 self supervised learning framework를 활용한 대규모 데이터로 학습되었다.

general purpose로 동작하는 모델인 gpt-1, bert를 가지고 특정 task를 위해 이 pretraining model을 가지고 한번 더 fine-tuning하는 transfer learning이 대세가 되었다.

1. GPT-1

special token들을 제안함으로써 모델이 여러 목적의 nlp task를 한번에 학습할 수 있게 했다. 그 결과 한개의 모델이 여러 task에 큰 구조 변경 없이 활용될 수 있도록 하였다. (통합 모델 제안)

Prediction task는 순차적으로 다음 단어를 뱉는 Language Modeling task를 말한다.

Classification task 의 경우 end of sentence에 해당하는 EOS토큰 대신 Extract라는 token을 제안했다. Extract token을 맨 뒤에 붙여서 문장을 모델에 통과시킨다. 나온 결과의 맨 마지막(extract token의 결과)만 Linear layer를 통과하게 하여 감정분류 같은 분류기로 모델이 동작할 수 있다.

Entailment : 다수의 문장으로 구성된 Input이 있을 때, 각 문장 사이에 delim token을 추가해서 두 문장의 논리적 관계가 옳은지를 검사하는 task이다. 이 경우도 extract token의 결과를 Linear layer에 통과하게 하여 분류기로 동작할 수 있다.

attention을 거치면서 extract token이 query로 활용되어 전체 문장 구조에 대한 판단을 가능하게하기 때문이다.

1-1. self-supervised learning, Transfer learning

만약에 새로운 목적을 위해 pretrained model을 활용하려면 어떻게 해야할까?

gpt1, bert를 가져온다고 했을때, 맨 위에 task를 위한 layer는 떼어내고 12개의 transformer block만을 유지한채 우리 목적에 맞는 새로운 Layer를 위에 추가한다. 새롭게 추가된 레이어는 충분한 학습이 필요하지만 이미 pretrained된 transformer block들은 큰 학습이 필요없으므로 Learning rate를 작게 준다. 이대로 우리가 준비한 데이터로 모델을 학습시킨다. 이게 Transfer learning이다.

 

우리가 특정 목적을 위한 분류작업을 한다고 하면 data, label이 한 쌍으로 구성된 데이터가 필요하다. label이 있는 데이터의 경우는 상대적으로 소량인 경우가 많다. 반면에 word prediction을 위한 language model task는 대량의 데이터를 self-supervised learning으로 학습이 가능하다.

즉 비록 우리가 원하는 task에 부합하는 데이터가 적다하더라도 대량으로 학습된 language model이 갖는 정보(일반화된 정보)를 transfer해서 활용하게 되는 셈이다. 

 

2. BERT

두번쩨 pretraining model로 BERT를 소개한다. BERT는 gpt와 마찬가지로 다음에 올 단어를 예측하는 모델로 대량의 학습 데이터를 가지고 학습한 모델이다. 

gpt1은 <SOS>로 시작해서 현재 단어를 예측할 때 뒤에 나올 단어들을 보지 않고 예측하도록 학습되어있는다.

하지만 우리가 전화를 할때 중간에 잡음으로 인해 내용을 듣지 못 했더라도 뒤에 이어서 나오는 말을 듣고 중간 내용을 맞추기도 한다. 혹은 모르는 단어가 나오더라도 뒤에 글을 마저 읽다보면 그 단어의 뜻을 깨닫기도 한다.

이처럼 BERT는 이 점을 고려하여 bi-direction의 정보를 다 보고 예측하는 bi-directional language model이다. 

 

2-1. BERT학습 : Masked Language Model (MTM)

BERT 학습을 위한 입력 문장에서 모델이 에측해야 하는 단어를 MASK로 가린다. 

그럼 몇%에 MASK를 씌울 것인가를 정해야 하는데 이는 사용자가 정하는 하이퍼파라미터 값이다.

마스크로 치환한 비율이 너무 높으면 학습이 어렵고 반대로 너무 낮으면 학습 효율이 떨어질 수 있다. BERT는 15%를 권장하고 있다.

 

이에 추가로 여러 기법을 추가하는데 예를들어 100개의 단어로 구성된 문장이 있다고 하자. k=15%로 15개는 가려야할 단어이다.

- 15개 중에 80%는 [MASK]로 가린다.

- 10%는 random한 단어로 교체한다.

- 10%는 그대로 보존한다.

 

즉 BERT는 [Mask]에 해당하는 encoding vector를 가지고 내가 어떤 단어일지 모델이 예측하게 될 것이다.

2-2. BERT학습 : Next sentence prediction

gpt가 다음 단어 예측 task에 학습되었다는 점에 대응하기 위해 BERT도 next sentence prediction을 위해 학습된다.

두 문장이 [SEP]토큰으로 이어져 있다. [SEP] 토큰은 문장의 끝을 나타낸다. (gpt의 Extract token 역할과 유사)

[CLS] 토큰이 맨 앞에 추간된 것이 보인다. 이 토큰으로 문장 분류를 수행할 수 있다. 두 문장이 연속되는 문장이 맞는지 아닌지를 결정하는 binary classification에 [CLS]가 활용된다. 또 방금 전에 설명한 MTM을 위한 [MASK] 토큰도 보인다.

 

즉 정리하면 주어진 문장에 token을 추가하여 BERT 학습에 사용하는데. [CLS]에 해당하는 encoding vector를 가지고 추가로 붙인 layer에 통과시켜서 두 문장이 이어지는게 맞는지? 아닌지? 예측한다.

 

2-3. Segment embedding

next sentence prediction을 위해서 bert는 두 문장을 [SEP]로 붙여서 하나의 input으로 받는다. 

bert역시 positional embedding을 사용한다. 그런데 두번째 문장의 경우 he는 사실상 첫 단어인데 positional embedding으로 인해 6번째 단어로만 취급된다.

따라서 문장을 segment로 분류해서 첫번째 문장에게는 동일한 벡터를 더해주고 두번째 문장의 단어들에게는 다른 동일한 벡터를 더해준다. 이 벡터는 학습을 통해 결정된다.

 

2-4. Fine tuning

자 그럼 이렇게 general purpose를 위한, 대규모의 데이터로 학습된 pre-training model을 만들었다. 이 모델이 세부 task를 위한 모델로 어떻게 동작하는지 알아보자.

a) 두 문장의 모순 관계를 분류하는 task의 경우, 두개의 문장을 [sep]로 구분하여 하나의 문장을 만들어 인풋으로 넣는다. output 결과중 [cls] 토큰에 해당하는 부분만 다음 layer의 입력으로 주어 분류를 수행할 수 있다.

b) 단일 문장의 감정분류, 주제 분류 의 경우, 마찬가지로 문장을 인풋으로 넣고 output의 [cls]만 가지고 classification 수행

c) question & answering의 경우 맨 밑에서 추가로 설명

d) pos, 품사 태깅등 각 단어의 속성을 결정해야 하는 경우, 각 단어들의 output을 다음 layer를 거치도록 하여 품사를 결정한다.

 

2-5. Bert Summary

bert도 self attention block을 그대로 사용했다.

- BERT LARGE의 경우 24개의 attention block을 쌓았고 각 16개의 head를 사용했다. encoding vector의 크기는 1024로 설정했다.

- subword level embedding과 positional embedding을 활용했다.

- [cls], [sep] 토큰 사용

- segment embedding 기법 활용

 

3. BERT vs GPT

GPT는 다음 단어를 예측하는 task를 학습하므로 E2 시점에서 단어를 예측할때 E1만 살펴보지 뒤에 E3부터는 보지 않는다. 그래서 gpt는 Transformer 모델의 decoder 부분을 사용한다.

반면 BERT는 [MASK]에 해당하는 단어를 예측하기 때문에 input의 모든 단어를 매 시점에 살펴본다. 그래서 BERT는 Transformer 모델의 Encoder부분을 사용한다.

 

Bert는 gpt-1에 사용된 학습데이터의 약 3배 더 큰 데이터로 학습되었고 학습 시 사용한 batch_size도 더 크다.

 

4. Machine Reading Comprehension (MRC), Question Answering

기계 독해 기반 질의응답 task를 말한다. 단순히 질문에 대답하는게 아니라 주어진 글을 읽고 얻은 정보를 기반으로 주어지는 질문에 정답을 찾는 것이다. (참고로 이 task를 위해 사용할 수 있는 데이터셋으로 SQuAD 데이터셋이 있다. )

모델이 주어진 질문의 정답이 존재하는 위치를 예측하도록 학습시킨다.

 

질문과 지문을 서로 다른 문장인 것처럼 [sep]로 연결하여 input으로 준다. output은 각 단어들 마다 encoding vector로 나올 것이다. encoding vector를 linear layer를 통과시켜서 하나의 scalar 값(혹은 낮은 차원의 vector)으로 바꾼다.

그럼 총 단어 개수 만큼의 scalar 값이 나올 것이다. 지문에 단어가 총 100개가 있다면 100개의 scalar 값을 softmax에 통과시켜서 확률이 제일 높은 하나를 선택한다. 그 곳이 질문의 답이 시작되는 곳이다.

 

자 정답이 시작되는 지점은 찾았다. 그런데 끝나는 지점도 찾아야 하지 않겠나?

그래서 다시 100개의 encoding vector를 100개의 scalar로 변환시키는 layer를 하나 더 만들어서 위 과정을 반복한다.

 

만약 질문에 대한 답을 찾을 수 없는 경우는 어떻게 학습할까? 주어진 질문과 지문에 대해 종합적으로 살펴본 [cls]토큰을 가지고 '답이 존재한다 vs 답이 없다'를 학습한다.

728x90
반응형