본문 바로가기

AI/NLP Paper

[NLP] BERT : Pre-training of Deep Bidirectional Transformer for Language Understanding 리뷰

 

Introduction

언어 모델의 사전 학습(pre-training)은 많은 자연어 처리 task에서 효과적인 성능 향상을 보였습니다. sentence level task는 언어 추론(NLI)이나 paraphrasing처럼 전체 sentences를 분석하여 sentence 간의 관계를 예측합니다. token level task는 고유명사 인식이나 QA 등이 있습니다.

 

이처럼 많은 task에서 효과적인 사전 학습된 언어 표현을 down-stream tasks에 적용하기 위한 2가지 방법이 있습니다. 바로 Feature-based approachFine-tuning approach입니다.

 

  • Feature based : 학습된 임베딩은 그대로 두고 그 위의 레이어만 학습하는 방법(대표적으로 ELMO)

  • Fine-tuning : 학습된 임베딩을 바탕으로 task에 맞게 임베딩 포함 모두를 학습하는 방법(대표적으로 GPT)

이러한 두 방식은 같은 목적함수를 이용하여 사전 학습됩니다. 또한, 단방향 언어 모델을 사용합니다.

 

논문에서는 이러한 기술들이 사전 학습된 표현의 power를 제한한다고 주장합니다. 특히나 fine-tuning에서 가장 큰 제한사항은 기본적으로 단방향 언어 모델을 사용한다는 점입니다.

 

이에 논문에서는 fine-tuning 기반 접근법을 BERT를 제시함으로써 향상했습니다. 

Bidirectional Encoder Representations from Transformer(BERT)는 앞서 언급된 단방향성에 의한 한계를 masked language model(MLM)을 사용함으로써 완화시켰습니다. MLM은 input으로 들어오는 token 중 몇 개를 랜덤으로 마스킹하고 마스킹된 원래 token을 context를 기반으로 예측하는 기법입니다. MLM은 left and right context를 융화시킨 표현으로 deep bidirectional Transformer의 사전학습을 가능하게 했습니다. 뿐만 아니라 Next Sentence Prediction task(NSP)도 사용합니다.

 

BERT

논문에서 소개한 framework에는 2개의 단계가 있습니다. 바로 pre-training과 fine-tuning입니다.

 

pre-training단계에서는 unlabeled data를 학습합니다. fine-tuning에서는 모델이 먼저 사전 학습된 파라미터를 이용해서 초기화되고, 그다음 모든 파라미터들이 downstream tasks로부터 가져온 labeled data를 이용해서 fine-tuned 됩니다.

 

Model Architecture

BERT는 multi-layer bidirectional Transformer encoder구조를 가지고 있습니다. 상세 구조는 트랜스포머 구조와 거의 동일하기 때문에 따로 자세한 설명은 하지 않습니다. 

 

논문에서는 레이어의 수를 $L$, hidden size를 $H$, self-attention heads의 수를 $A$로 표기합니다. 그리고 결과 비교는 주로 $\text{BERT}_{\text{BASE}}(L = 12, H = 768, A = 12, \text{Total Parameters} = 110M)$와 $\text{BERT}_{\text{LARGE}}(L = 24, H = 1024, A = 16, \text{Total Parameters} = 340M)$두 모델의 비교로 이루어집니다. 

 

$\text{BERT}_{\text{BASE}}$는 OpenAI GPT와의 비교를 위해 같은 사이즈로 설계되었습니다. 두 모델의 가장 큰 차이점은 BERT는 양방향 셀프 어텐션을 사용했고, GPT는 모든 토큰이 자신보다 이전(왼쪽) 정보만을 참고할 수 있는 contrained self-attention을 사용했다는 점입니다.

 

Input / Output Representation

BERT가 다양한 down-stream task를 다루게 만들기 위해서는 input representation이 단일 문장과 문장 쌍(sentence pari)을 하나의 token sequence로 분명하게 표현할 수 있어야 합니다. 

 

BERT에서의 sentence는 일반적으로 알고 있는 sentence가 아니라 연속적인 text에 대한 임의의 span입니다. 다르게 말하면 텍스트 덩어리..?? 정도가 됩니다.

 

먼저 30,000개의 token vocabulary를 이용해서 WordPiece embedding을 진행해줍니다. 또한, 모든 sequence의 첫 시작은 특별한 classification token ([CLS])가 들어갑니다. 그리고 sentence pairs는 단일 sequence로 묶이는데, 이때 두 sentence를 구분하기 위해서 두 가지 방법을 사용합니다. 첫 번째로 [SEP] 토큰을 이용해서 두 개의 sentence를 구분해줍니다. 다음으로 token이 문장 A에 속하는지 B에 속하는지를 나타내는 embedding을 구합니다.

 

Figure 1에서 보이는 것처럼, input embedding은 $E$, [CLS] 토큰의 final hidden state는 $C \in \mathbb{R}^H$, $i^{th}$ input token에 대한 final hidden state는 $T_i \in \mathbb{R}^{H}$로 표기합니다.

 

마지막으로 token embedding, segment embedding, position embedding을 전부 더하여 input embedding을 완성해줍니다.

 

Pre-training BERT

논문에서는 BERT를 사전 학습시킬 때 두 개의 비지도 학습을 사용하여 학습시켰습니다.

 

Task #1 : Masked LM(MLM)

 

다음에 나올 단어를 예측해야 하는 기존의 LM은 그 task의 특성상 한 방향(uni-direction) 일 수밖에 없습니다. 이와 달리, BERT는 마스크 된 토큰([MASK])만 예측하면 되는 masked LM(MLM)을 제안했습니다. 이는 input sequence의 순서에 상관없이 전체 문장을 모두 고려하여 예측합니다.

 

MLM의 과정을 살펴보면 먼저 deep bidirectional representation을 학습하기 위해 input tokens 중에서 랜덤 하게 몇 개를 마스킹합니다. 그리고 전체 input을 다시 생성(마스킹되지 않은 원래의 문장)하는 게 아닌 마스크 된 토큰만 예측합니다. 이러한 방법이 bidirectional pre-trained model을 얻게 하지만, pre-training과 fine-tuning사이의 mismatch를 만든다는 단점이 있습니다. [MASK] 토큰은 fine-tuning에는 사용되지 않기 때문입니다.

 

이러한 문제를 완화하기 위해 랜덤으로 뽑은 토큰을 전부 [MASK]로 바꾸지 않습니다. 먼저 training data에서 15%의 토큰을 랜덤으로 선택합니다. 이렇게 선택된 토큰이 $i$개가 있다고 하겠습니다. 이 $i$개의 토큰 중에서 80%를 [MASK] 토큰으로 바꿔주고, 10%는 랜덤한 다른 토큰으로 바꿔줍니다. 나머지 10%의 토큰은 원래의 토큰을 그대로 사용합니다. 그러고 나면 $T_i$는 cross entropy loss를 이용하여 원래의 토큰을 예측하기 위해 사용될 것입니다.

 

2. Task #2 : Next Sentence Prediction (NSP)

 

Question Answering(QA)과 Natural Language Inference(NLI) 같은 downstream tasks는 두 개의 sentence사이의 관계를 이해하는 것에 기반을 두고 있습니다. 이러한 문장 간의 관계를 모델이 이해할 수 있도록 학습하게 하기 위해서, 이진화된 next sentence prediction task를 학습합니다.

 

먼저 pre-training example에서 문장 A와 B를 선택합니다. B 중에 50%는 실제로 A 다음으로 따라 나오는 문장입니다(IsNext로 라벨링 함). 그리고 나머지 50%는 corpus에서 뽑은 랜덤 한 문장입니다(NotNext로 라벨링함). Figure 1에서 봤던 $C$가 NSP에 사용됩니다. 

 

Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext

전체 Pre-training과정은 위 2개의 task를 동시에 진행합니다.

 

Fine-tunning BERT

위 그림은 task에 따라 다르게 fine-tuning 하는 것을 나타낸 그림입니다.

 

Conclusion

이 논문은 BERT의 deep bidirectional architecture를 통해 동일한 pre-trained 모델이 다양한 NLP task를 성공적으로 수행할 수 있게 하였습니다.