BERT(Bidirectional Encoder Representations from Transformer)라는 새로운 language representation model을 제시
당시에 나온 language represtation model들과는 다르게 BERT는 모든 layer에서 left/right context를 동시에 고려하는 방식으로 unlabeled text로부터Deep Bidirectional Representation을 pre-train 하도록 설계
BERT는 추가적인 1개의 output layer를 통해 fine-tuning할 수 있으며, 이를 통해 question answering, language inference와 같은 넓은 범위의 task들에서 실질적인 task-specific architecture에 대한 수정 없이 SOTA 달성
language model을 pre-training시키는 것이 다양한 NLP task에서 효과적인 사실이 다양한 연구를 통해 입증
pre-trained language representation을 downstream task에 적용하기 위한 방법은 2가지
feature-based : 특정 task를 수행하는 network에 pre-trained representation을 하나의 feature처럼 추가, 즉 2개의 network을 붙여서 사용 → ELMo
fine-tuning : task-specific한 parameter는 줄이고, pre-trained된 parameter들을 downstream task 학습을 통해 조금씩 바꿔주는 fine-tuning 방식 → Generative Pre-trained Transformer(OpenAI GPT)
두 방식 모두 unidirectional language model을 사용하여 general language representation을 학습하는 pre-training 동안 같은 objective function을 공유
💡 여기서 ELMo의 경우 forward, backward LM을 모두 사용하기 때문에 bidirecitonal LM이라고 생각할 수 있지만, ELMo는 forward와 backward 각각의 unidirectional language model을 사용해 이를 concate하기 때문에 모델 자체는 단반향이어서 pre-train 과정에서 bidirectional language model을 사용한다 볼 수 없음
지금의 방법론들, 특히 fine-tuning approach에 관한 기술은 unidirectional 때문에 pre-trained representation의 효과를 제한
단방향으로 학습하기 때문에 architecture가 pre-training 동안 선택할 수 있는 부분을 제한
OpenAI GPT의 경우에도 left-to-right architecture이기 때문에 Transformer 내 self-attention layer에서 모든 토큰들이 이전의 토큰에만 attend 할 수 있음(Decoder의 Masked Self-Attention)
sentence-level의 task에서 최선의 선택지가 아니며, 양방향에서의 context를 통합해야 하는 question answering과 같은 token-level task에서는 이러한 fine-tuning에 기반한 방법은 매우 위험
BERT에서는 이러한 unidirectionality에 대한 문제점을 Masked Language Model(MLM)을 통해 완화
랜덤으로 input token의 일부를 masking하고, 오로지 context만을 기반으로 masked된 단어의 original vocabulary id를 예측하는 것이 목적
MLM은 left-to-right language model을 활용한 pre-training 방식과 다르게 left와 right context를 융합하여 representation을 생성하여 Deep Bidirectional Transformer을 pre-train 가능
masked language model에 더해 Next Sentence Prediction(NSP)을 사용해 text-pair representation을 pre-train
BERT의 contribution
masked language model을 활용한 deep bidirectional representation을 통해 language model의 pre-training에 있어 bidirectional pre-training의 중요성을 입증
pre-trained representation을 사용하면 고도로 엔지니어링된 task-specific architecture의 필요성을 줄임
BERT는 대규모 sentence-level 및 token-level task에서 task-specific architecture들보다 좋은 성능으로 SOTA를 달성한 첫 fine-tuning based representation model
BERT는 총 11개의 NLP task에서 SOTA 달성
💡 BERT, ELMo, OpenAI GPT 비교
BERT는 기존에 유명한 representation learning model인 ELMo, OpenAI GPT와 비교했을 때 다음과 같은 특징이 있다. 참고로, fine-tuning approach인 GPT와 비교했으며 구체적인 내용은 뒤에 포함되어 있다.
- GPT는 BookCorpus(800M words), BERT는 BookCorpus(800M) + Wikipedia(2,500M words)로 pre-training - GPT는 sentence separator([SEP])와 classification token([CLS])를 오직 fine-tuning에만 사용했지만, BERT는 [SEP], [CLS], sentence A/B embedding을 pre-training에도 사용 - GPT는 1M step(with a batch size of 32,000 words)으로 훈련되었으며, BERT는 1M step(with a batch size of 128,000 words)로 훈련 - GPT는 5e-5에 해당하는 동일한 learning rate을 모든 fine-tuning experiment에 사용했으며, BERT는 development set에서 가장 성능이 좋았던 task-specific한 learning rate를 사용
그러나 가장 핵심적인 차이점은 ELMo는 독립적으로 훈련된 left-to-right과 right-to-left LSTM을 concate하여 downstrea task에 사용할 feature를 생성했으며, GPT는 Transformer Decoder block을 통해 left-to-right Transformer를 사용한 것에 비해 BERT는 Transformer Encoder를 통해 bidirectional Transformer를 사용했다는 점이다.
pre-training : 다양한 pre-training task를 통해 unlabeled data로부터 학습 및 초기 parameter 설정
fine-tuning : 처음엔 pre-trained parameter들로 초기화되며 downstream task로부터의 labeled data를 사용하여 모든 parameter들을 fine-tuning
각 downstream task는 동일한 pre-trained parameter들로 초기화되어도 분리된 fine-tuned model를 가짐
본 논문에선 question-answering에 해당하는 예시(Figure 1)를 통해 모델을 설명
BERT는 다양한 task들에 대해 통합된 아키텍쳐이며, 최종 downstream architecture와 pre-trained architecture 사이에는 미세한 차이점이 존재
Model Architecture
BERT의 architecture는 multi-layer bidirectional Transformer Encoder 구조
Denotation
L : number of layers(Transformer blocks)
H : hidden size
A : number of self-attention head
BERT_BASE : L = 12, H = 768, A = 12, Total Parameters = 110M
BERT_LARGE : L = 24, H = 1024, A = 16, Total Parameters = 340M
BERT_BASE 모델은 OPenAi GPT와의 비교를 위해 동일한 model size를 선택
GPT Transformer : 모든 token이 그 이전 time step의 token에만 attend 하는 제한된 self-attention 사용
BERT Transformer : bidirectional self-attention을 사용
Input/Output Representations
BERT가 다양한 downstream task를 다룰 수 있게 하나의 문장, 혹은 한 쌍의 문장(< Question, Answer > 등)은모두 하나의 token sequence로 표현되어 분명하게 input representation을 표현
본 논문에서의 'sentence'는 실제 언어적으로 사용하는 문장뿐만 아니라 단어의 연속적인 집합(완벽한 언어학적 문장이 아니어도 됨)도 포함
30,000 token vocabulary를 활용해 WordPiece Embedding 적용
💡 WordPiece Embedding 단어를 Embedding하는 과정에서 가장 큰 문제점은 데이터가 많이 없는 단어는 토큰화시키기 어렵고, 이로 인해 모델의 OOV(Out of Vocabulary)가 발생하는 것이다. Subword segmentation이란 하나의 단어가 더 작은 단위의 의미 있는 여러 subword들의 조합으로 구성되는 경우가 많아 하나의 단어를 여러 subword로 분리해서 단어를 Encoding 및 Embedding하는 것을 말한다.(ex> Birthday = Birth + day) 이러한 subword segmentation의 대표적인 방법론이 바로 BPE(Byte Pair Encoding)이다. BPE는 기본적으로 연속적으로 가장 많이 등장한 글자의 쌍을 찾아 하나의 글자로 병합하는 방식을 말한다. 즉, 단어를 쪼갤 수 있는 가장 작은 단위로 분리(영어의 경우 알파벳)한 후, 가장 많이 반복하는 쌍을 찾아 이를 vocab set에 추가한다.
WordPiece Tokenizer는 BPE의 변형 알고리즘으로, 먼저 단어를 가장 작은 단위로 분리한 후 빈도수에 기반하는 것이 아닌 병합되었을 때 Corpus의 우도(Likelihood)를 가장 높이는 쌍을 병합한다. 이후 모든 단어의 맨 앞에 언더바(_)를 붙이고 단어는 subword로 통계에 기반하여 띄어쓰기로 분리하여 subword의 구분자 역할을 한다. 기존에 있던 띄어쓰기와 subword를 분리하는 데 사용한 띄어쓰기는 언더바(_)를 통해 구별하며, 결과를 다시 돌릴 경우 모든 띄어쓰기를 제거하고 언더바를 띄어쓰기로 변경한다.
모든 sequence의 첫 번째 token은 항상 classification token([CLS])으로, CLS 토큰에 대응하는 최종 hidden state는 classification task의 aggregate sequence representation
sentence pair는 single sequence로 들어가며 이를 2개의 sentence로 나눔(sentence A, sentence B)
special token [SEP]을 통해 구분
sentence A 혹은 sentence B 중 어느 곳에 포함되는지를 나타내는 Segmentation Embedding 추가
ELMo, GPT와는 다르게 전통적인 left-to-right 혹은 right-to-left의 LM이 아닌 Maksed-Language Model(MLM) 및 Next Sentence Prediction(NSP) 2가지의 unsupervised task을 사용
💡 Language Model Language Model이란 단어 sequence에 확률을 할당하여 가장 자연스러운 단어 sequence를 찾아내는 모델을 말한다. 여기서 확률을 할당하는 데에는 이전 단어들이 주어졌을 때 단어를 예측하도록 하는 방법이 보편적으로 사용된다. Language Modeling이란 결국 주어진 단어들로부터 아직 모르는 단어를 예측하는 작업을 의미한다. BERT에서는 Masked Language Model을 활용하여 deep bidirectional representation을 pre-train한다.
Task #1 : Masekd LM
표준적인 conditional language model은 left-to-right 혹은 right-to-left 방식으로만 훈련이 가능한데, 이는 bidirectional conditioning 방식에서 각 단어들이 간접적으로 자기 자신에 대한 정보를 알 수 있기 때문
이로 인해 모델이 multi-layered context에서 쉽게 예측을 수행하여 제대로 학습이 안됨
deep bidirectional representation을 훈련하기 위해 input token의 일부(15%)를 랜덤으로 가리고, masked token에 대한 예측을 수행
Denoising auto-encoder와 달리 전체 input에 대해 재구성하는 것이 아닌 오직 masked word에 대해서만 예측
Multi-layered Transformer Encoder는 Masking된 토큰을 포함하여 실제 input sentence와 동일한 output을 예측하기 위해 학습
나머지 non-masked 단어들의 context를 기반으로 오로지 masked token에 대한 예측 값 W'4실제 토큰 값 W4 이 일치하게끔 학습 진행
MLM을 통해 bidirectional pre-trained model을 얻을 수 있지만, fine-tuning 과정에선 [MASK] token이 없기 때문에 pre-trainng과 fine-tuning 사이에 mismatch가 발생한다는 단점 존재
즉, input sentence에 [MASK] token이 있어야만 예측을 수행하여 실제 상황에서는 모델 활용이 불가
이를 완화하기 위해 training generator가 15%에 해당하는 token position을 선택하면 i-th 번째 token을 다음과 같이 대체
80%의 경우 [MASK] token으로 변경
10%의 경우 random token으로 변경
10%의 경우 바꾸지 않고 그대로 사용
💡 10%에 해당하는 token을 random하게 바꾸는 것이 모델의 성능을 저하시킬 수 있다고 생각할 수 있지만, 실제 비율은 전체 데이터의 약 1.5%에 해당하는 데이터이기 때문에 실제 성능에는 크게 영향을 미치지 않는다. 💡 또한 10% token을 바꾸지 않는 것은 representation을 실제 단어에 편향되게 하기 위함이다.
이러한 방식의 장점은 Transformer의 Encoder가 어떤 단어를 예측해야 하는지, 어떤 단어가 random word로 대체되었는지 알 수 없기 때문에 모든 input token에 대해 distributional contextual representation을 유지하도록 강제하는 것
MLM은 batch마다 전체 input sequence의 약 15%에 해당하는 token에 대해서만 예측을 수행하기 때문에 추가적인 pre-training step이 필요할 것이라 생각할 수 있음
그러나 MLM이 모든 input sequence를 활용하는 left-to-right LM보다 수렴 속도는 약간 느리지만, training cost를 증가하는 것보다 MLM의 개선 효과가 이를 훨씬 능가하는 것을 확인
💡 GELU Activation function GELU 함수는 RELU, Zoneout, dropout의 특징을 조합하여 유도한 활성화 함수이다. 여기서 표준정규분포의 CDF가 사용되기 때문에 x의 값이 작아질수록 dropped될 가능성이 높아진다.
Task #2: Next Sentence Prediction(NSP)
Question Answering(QA), Natural Language Inference(NLI) 등의 주요한 downstream task들은 두 문장의 relationship을 이해하는 데에 기반하며 이는 language modeling에서 직접적으로 확인하지 못함
모델이 sentence relationship을 학습하기 위해 모든 monolingual corpus를 통해 간단하게 생성이 가능한 이진화된 next sentence prediction task를 통해 pre-train
pre-training example로 sentence A와 B를 골랐을 때 두 가지의 경우로 sentence B를 구성
50%의 경우 실제 next sentence인 B를 활용 → IsNext
50%의 경우는 corpus에서의 random sentence → NotNext
Figure 1에 나타난 것처럼 C는 next sentence prediction(NSP)에 사용되는 토큰
BERT는 C token을 통하여 input으로 들어온 두 문장이 실제 corpus에서 연속적인 문장인지(IsNext), 아닌지(NotNext)를 학습
💡 S1, S2, ... , S10까지의 token이 연속적으로 구성된 document가 있을 때, 다음과 같이 50%의 비율로 구성한다. [CLS] S1 [SEP] S2 → IsNext [CLS] S2 [SEP] S10 → NotNext [CLS] S5 [SEP] S8 → NotNext [CLS] S9 [SEP] S10 → IsNext
이러한 방식을 통한 pre-training 과정은 QA와 NLI 모두에서 매우 효과적
vector C는 NSP를 위해 훈련되기 때문에 fine-tuning 없이는 의미가 없는 sentence representation
이전에는 sentence embedding만이 downstream task에 transfer되었지만, BERT는 모든 파라미터를 transfer하여 end-task model parameter를 초기화
💡 Pre-training Hyper Parameter Setting - Maximum token legnth : 512 - Batch size : 256(256 sequences * 512 tokens = 128,000 tokens/batch) for 1,000,000 steps으로 이는 약 33억 개의 word corpus에 대해 약 40 epochs 해당하는 양 - Adam with learning rate : 1e-4, beta1 = 0.9, beta2 = 0.999 - L2 weight decay : 0.01 - learning rate warmup over the first 10,000 steps, linear decay of the learning rate - Dropout : 0.1(all layers) - GeLU activation function - Pre-train the model with sequence length of 128 for 90% of the steps, and the rest 10% of the steps are trained with sequence length of 512(to speed up pre-training)
결론적으로 BERT의 Pre-training 과정에선 BERT가 Transformer를 활용해 두 가지의 학습이 발생
[Mask] 혹은 replace된 토큰에 대해서도 실제 Input-sentence와 동일하게 예측하게끔 학습
Sentence B가 실제 Next Sentence인지를 확인하기 위해 IsNext인지 NotNext인지를 학습
Pre-training data
BooksCorpus(800M words)와 English Wikipedia(2,500M words)를 사용하여 pre-training
Wikipedia에선 text passgage만을 추출하며 lists, tables, headers는 무시
긴 연속 sequence를 추출하기 위해선, document-level corpus를 사용하는 것이 shuffled sentence-level corpus(ex> Billion Word Benchmark 등)를 사용하는 것보다 중요
Transformer의 self-attention mechanism를 통해 BERT는 적절한 input과 output을 교체하여 single text 혹은 text pair을 포함하는 다양한 downstream task에 모델링할 수 있어 Fine-tuning은 간단함
기존에 방식들은 text pair를 독립적으로 encode한 후 bidirectional cross attention에 적용했지만, BERT는 self-attention mechanism을 통해 concated text pair를 bidirectional cross attention을 수행하여 이 두 단계를 합침
각 작업에 대해 task-specific한 input과 output을 간단하게 BERT에 연결하고, 모든 parameter를 end-to-end로 fine-tune
pre-training에서의 sentence A와 sentence B는 다음과 유사
paraphrasing의 sentence pairs
entailment의 hypothesis-premise pairs
Question-Answering의 question-passage pairs
text classification 혹은 sequence tagging의 degenerate text pairs
output 중 token representation은 sequence tagging, question answering과 같은 token-level task에, [CLS] representation은 entailment, sentiment analysis와 같은 classification output layer에 입력
Figure 4와 같이 BERT의 task-specific model은 pre-trained된 BERT 모델에 하나의 output layer만 추가하여 구성
[SEP] : 비연속적인 token sequence를 구별하기 위한 special symbol
💡 Fine-tuning Hyperparameter - batch_size, learning rate, training epochs를 제외하곤 pre-training 과정과 동일하며, downstream task마다 hyperparameter의 값은 변화하지만 모든 task에 해당하는 일정한 범위가 있는 것을 확인 - Batch size : 16, 32 - learning rate(Adam) : 5e-5, 3e-5, 2e-5 - Number of epochs : 2, 3, 4
GLUE에 대한 fine-tuning을 위해 input sequence에 대해서 앞서 설명한 내용과 동일하게 representation을 생성하고, 첫번째 input token([CLS])에 대응하는 최종 hidden vector C만 aggregate representation으로 활용
classification layer의 가중치 W ∈ R^(KxH)만이 유일한 새로운 파라미터
K 는 label의 개수
C 와 W 를 활용하여 classification loss를 계산 → log(softmax(CW^T))
batch size는 32이며, 3 epochs을 통해 fine-tune
각 GLUE task에 대해서 best fine-tuning learning rate 설정(5e-5, 4e-5, 3e-5, 2e-5)
BERT_Large 모델은 종종 작은 데이터셋에서 불안정한 것을 확인했고, 몇 개의 random restarts을 학습시켜 최적의 모델을 선택
random restart는 동일한 pre-trained checkpoint를 사용하지만, 다른 fine-tuning data를 섞고 classifier layer를 초기화
GLUE dataset은 test label이 없기 때문에 BERT_BASE 와 BERT_LARGE 를 위한 하나의 single GLUE evaluation server를 생성
BERT_BASE 와 BERT_LARGE 모두 모든 task에서 기존 SOTA 모델보다 average accuracy가 각각 4.5%와 7.0% 개선
OpenAI GPT와 BERT_BASE 는 attention masking을 제외하곤 모두 동일한 아키텍쳐
BERT_LARGE 모델이 BERT_BASE 와 비교했을 때 모든 task에서 성능이 앞섰으며, 특히 작은 크기의 training data에서도 성능이 앞섬
최근(그 당시) language model의 transfer learning으로 인한 improvement는 수많은 unlabeled data를 활용한 unsupervised pre-training 방식이 language understanding system의 필수적인 부분이라는 것을 입증
resource가 적은 task에서도 deep unidirectional architecture의 장점을 누릴 수 있음
이러한 결과를 deep bidirctional architecture로 일반화하여 동일한 pre-trained model이 광범위한 NLP task을 성공적으로 처리할 수 있도록 하는 것이 주요한 기여
💡 BERT, ELMo, GPT의 비교 BERT는 기존에 pre-training 및 fine-tuning 과정으로 NLP task를 수행하는 ELMo와 OpenAI GPT에서 개선을 이루어낸 모델이다. 가장 중요한 개선점은 바로 deep bidirectional representation을 통해 pre-train을 진행한다는 점이다. Transformer Encoder를 여러 층으로 쌓은 BERT 구조에서, bidirectional representation을 생산하기 위해 추가적으로 MLM과 NSP를 도입하여 pre-train을 진행한다. MLM이란 input sequence의 일부(15%)를 Masking 처리 한 후 Transformer Encoder가 해당 token을 original token과 동일하게 예측하게끔 학습하는 것을 의미하며, NSP는 input sentence pair에서 뒤에 나오는 sentence B가 실제 연속적인 문장인지, random하게 선택된 문장인지를 분류하는 것을 [CLS] 토큰의 final hidden vector C에 학습한다. 이러한 방식들을 통해 Masked token에 대한 예측에 모든 token을 활용하며 deep bidirectional representation을 생성할 수 있게 되었고, 여러 fine-tuning 과정에서의 downstream task에도 손쉽게 layer만을 추가해 수행할 수 있게 되었다.
💡 BERT 모델에 대한 생각 본 논문을 읽으며 BERT 모델에 대해 여러 생각을 하게 되었다. 첫 번째는, MLM을 수행하는 과정에서 random하게 Masking을 한다는 것에 대한 개선이다. 아직 BERT를 개선시킨 모델들에 대한 논문을 읽어보지 못해 어떻게 개선되었는지는 확인할 수 없지만, 이 randomness를 더욱 개선시킬 수 있을 것이라는 생각이 든다. 예를 들어, Masking 과정에서 input sentence에서 중요한 token을 계산할 수 있는 방법을 찾아 해당 token에 대한 masking을 수행한 후 학습을 진행할 수 있을 것 같다.
다음은 BERT라는 모델은 sentence가 pair 형태로 input으로 들어갈 경우에 가장 성능이 좋다는 생각이 드는데, 본 논문에서 예시로 들었던 Question-Answer 같은 task가 아닌 single sentence를 활용하는 task에서도 하나의 single sentence를 2개로 seperate할 수 있는 기준점을 찾아서 2개의 sentence로 나눠 pre-train하는 방법도 생각이 들었다. 물론 해당 경우 NSP에 대한 학습 효과는 모두 연속적인 sentence이기 때문에 떨어질 수 있다.
BERT(Bidirectional Encoder Representations from Transformer)라는 새로운 language representation model을 제시
당시에 나온 language represtation model들과는 다르게 BERT는 모든 layer에서 left/right context를 동시에 고려하는 방식으로 unlabeled text로부터Deep Bidirectional Representation을 pre-train 하도록 설계
BERT는 추가적인 1개의 output layer를 통해 fine-tuning할 수 있으며, 이를 통해 question answering, language inference와 같은 넓은 범위의 task들에서 실질적인 task-specific architecture에 대한 수정 없이 SOTA 달성
language model을 pre-training시키는 것이 다양한 NLP task에서 효과적인 사실이 다양한 연구를 통해 입증
pre-trained language representation을 downstream task에 적용하기 위한 방법은 2가지
feature-based : 특정 task를 수행하는 network에 pre-trained representation을 하나의 feature처럼 추가, 즉 2개의 network을 붙여서 사용 → ELMo
fine-tuning : task-specific한 parameter는 줄이고, pre-trained된 parameter들을 downstream task 학습을 통해 조금씩 바꿔주는 fine-tuning 방식 → Generative Pre-trained Transformer(OpenAI GPT)
두 방식 모두 unidirectional language model을 사용하여 general language representation을 학습하는 pre-training 동안 같은 objective function을 공유
💡 여기서 ELMo의 경우 forward, backward LM을 모두 사용하기 때문에 bidirecitonal LM이라고 생각할 수 있지만, ELMo는 forward와 backward 각각의 unidirectional language model을 사용해 이를 concate하기 때문에 모델 자체는 단반향이어서 pre-train 과정에서 bidirectional language model을 사용한다 볼 수 없음
지금의 방법론들, 특히 fine-tuning approach에 관한 기술은 unidirectional 때문에 pre-trained representation의 효과를 제한
단방향으로 학습하기 때문에 architecture가 pre-training 동안 선택할 수 있는 부분을 제한
OpenAI GPT의 경우에도 left-to-right architecture이기 때문에 Transformer 내 self-attention layer에서 모든 토큰들이 이전의 토큰에만 attend 할 수 있음(Decoder의 Masked Self-Attention)
sentence-level의 task에서 최선의 선택지가 아니며, 양방향에서의 context를 통합해야 하는 question answering과 같은 token-level task에서는 이러한 fine-tuning에 기반한 방법은 매우 위험
BERT에서는 이러한 unidirectionality에 대한 문제점을 Masked Language Model(MLM)을 통해 완화
랜덤으로 input token의 일부를 masking하고, 오로지 context만을 기반으로 masked된 단어의 original vocabulary id를 예측하는 것이 목적
MLM은 left-to-right language model을 활용한 pre-training 방식과 다르게 left와 right context를 융합하여 representation을 생성하여 Deep Bidirectional Transformer을 pre-train 가능
masked language model에 더해 Next Sentence Prediction(NSP)을 사용해 text-pair representation을 pre-train
BERT의 contribution
masked language model을 활용한 deep bidirectional representation을 통해 language model의 pre-training에 있어 bidirectional pre-training의 중요성을 입증
pre-trained representation을 사용하면 고도로 엔지니어링된 task-specific architecture의 필요성을 줄임
BERT는 대규모 sentence-level 및 token-level task에서 task-specific architecture들보다 좋은 성능으로 SOTA를 달성한 첫 fine-tuning based representation model
BERT는 총 11개의 NLP task에서 SOTA 달성
💡 BERT, ELMo, OpenAI GPT 비교
BERT는 기존에 유명한 representation learning model인 ELMo, OpenAI GPT와 비교했을 때 다음과 같은 특징이 있다. 참고로, fine-tuning approach인 GPT와 비교했으며 구체적인 내용은 뒤에 포함되어 있다.
- GPT는 BookCorpus(800M words), BERT는 BookCorpus(800M) + Wikipedia(2,500M words)로 pre-training - GPT는 sentence separator([SEP])와 classification token([CLS])를 오직 fine-tuning에만 사용했지만, BERT는 [SEP], [CLS], sentence A/B embedding을 pre-training에도 사용 - GPT는 1M step(with a batch size of 32,000 words)으로 훈련되었으며, BERT는 1M step(with a batch size of 128,000 words)로 훈련 - GPT는 5e-5에 해당하는 동일한 learning rate을 모든 fine-tuning experiment에 사용했으며, BERT는 development set에서 가장 성능이 좋았던 task-specific한 learning rate를 사용
그러나 가장 핵심적인 차이점은 ELMo는 독립적으로 훈련된 left-to-right과 right-to-left LSTM을 concate하여 downstrea task에 사용할 feature를 생성했으며, GPT는 Transformer Decoder block을 통해 left-to-right Transformer를 사용한 것에 비해 BERT는 Transformer Encoder를 통해 bidirectional Transformer를 사용했다는 점이다.
pre-training : 다양한 pre-training task를 통해 unlabeled data로부터 학습 및 초기 parameter 설정
fine-tuning : 처음엔 pre-trained parameter들로 초기화되며 downstream task로부터의 labeled data를 사용하여 모든 parameter들을 fine-tuning
각 downstream task는 동일한 pre-trained parameter들로 초기화되어도 분리된 fine-tuned model를 가짐
본 논문에선 question-answering에 해당하는 예시(Figure 1)를 통해 모델을 설명
BERT는 다양한 task들에 대해 통합된 아키텍쳐이며, 최종 downstream architecture와 pre-trained architecture 사이에는 미세한 차이점이 존재
Model Architecture
BERT의 architecture는 multi-layer bidirectional Transformer Encoder 구조
Denotation
L : number of layers(Transformer blocks)
H : hidden size
A : number of self-attention head
BERT_BASE : L = 12, H = 768, A = 12, Total Parameters = 110M
BERT_LARGE : L = 24, H = 1024, A = 16, Total Parameters = 340M
BERT_BASE 모델은 OPenAi GPT와의 비교를 위해 동일한 model size를 선택
GPT Transformer : 모든 token이 그 이전 time step의 token에만 attend 하는 제한된 self-attention 사용
BERT Transformer : bidirectional self-attention을 사용
Input/Output Representations
BERT가 다양한 downstream task를 다룰 수 있게 하나의 문장, 혹은 한 쌍의 문장(< Question, Answer > 등)은모두 하나의 token sequence로 표현되어 분명하게 input representation을 표현
본 논문에서의 'sentence'는 실제 언어적으로 사용하는 문장뿐만 아니라 단어의 연속적인 집합(완벽한 언어학적 문장이 아니어도 됨)도 포함
30,000 token vocabulary를 활용해 WordPiece Embedding 적용
💡 WordPiece Embedding 단어를 Embedding하는 과정에서 가장 큰 문제점은 데이터가 많이 없는 단어는 토큰화시키기 어렵고, 이로 인해 모델의 OOV(Out of Vocabulary)가 발생하는 것이다. Subword segmentation이란 하나의 단어가 더 작은 단위의 의미 있는 여러 subword들의 조합으로 구성되는 경우가 많아 하나의 단어를 여러 subword로 분리해서 단어를 Encoding 및 Embedding하는 것을 말한다.(ex> Birthday = Birth + day) 이러한 subword segmentation의 대표적인 방법론이 바로 BPE(Byte Pair Encoding)이다. BPE는 기본적으로 연속적으로 가장 많이 등장한 글자의 쌍을 찾아 하나의 글자로 병합하는 방식을 말한다. 즉, 단어를 쪼갤 수 있는 가장 작은 단위로 분리(영어의 경우 알파벳)한 후, 가장 많이 반복하는 쌍을 찾아 이를 vocab set에 추가한다.
WordPiece Tokenizer는 BPE의 변형 알고리즘으로, 먼저 단어를 가장 작은 단위로 분리한 후 빈도수에 기반하는 것이 아닌 병합되었을 때 Corpus의 우도(Likelihood)를 가장 높이는 쌍을 병합한다. 이후 모든 단어의 맨 앞에 언더바(_)를 붙이고 단어는 subword로 통계에 기반하여 띄어쓰기로 분리하여 subword의 구분자 역할을 한다. 기존에 있던 띄어쓰기와 subword를 분리하는 데 사용한 띄어쓰기는 언더바(_)를 통해 구별하며, 결과를 다시 돌릴 경우 모든 띄어쓰기를 제거하고 언더바를 띄어쓰기로 변경한다.
모든 sequence의 첫 번째 token은 항상 classification token([CLS])으로, CLS 토큰에 대응하는 최종 hidden state는 classification task의 aggregate sequence representation
sentence pair는 single sequence로 들어가며 이를 2개의 sentence로 나눔(sentence A, sentence B)
special token [SEP]을 통해 구분
sentence A 혹은 sentence B 중 어느 곳에 포함되는지를 나타내는 Segmentation Embedding 추가
ELMo, GPT와는 다르게 전통적인 left-to-right 혹은 right-to-left의 LM이 아닌 Maksed-Language Model(MLM) 및 Next Sentence Prediction(NSP) 2가지의 unsupervised task을 사용
💡 Language Model Language Model이란 단어 sequence에 확률을 할당하여 가장 자연스러운 단어 sequence를 찾아내는 모델을 말한다. 여기서 확률을 할당하는 데에는 이전 단어들이 주어졌을 때 단어를 예측하도록 하는 방법이 보편적으로 사용된다. Language Modeling이란 결국 주어진 단어들로부터 아직 모르는 단어를 예측하는 작업을 의미한다. BERT에서는 Masked Language Model을 활용하여 deep bidirectional representation을 pre-train한다.
Task #1 : Masekd LM
표준적인 conditional language model은 left-to-right 혹은 right-to-left 방식으로만 훈련이 가능한데, 이는 bidirectional conditioning 방식에서 각 단어들이 간접적으로 자기 자신에 대한 정보를 알 수 있기 때문
이로 인해 모델이 multi-layered context에서 쉽게 예측을 수행하여 제대로 학습이 안됨
deep bidirectional representation을 훈련하기 위해 input token의 일부(15%)를 랜덤으로 가리고, masked token에 대한 예측을 수행
Denoising auto-encoder와 달리 전체 input에 대해 재구성하는 것이 아닌 오직 masked word에 대해서만 예측
Multi-layered Transformer Encoder는 Masking된 토큰을 포함하여 실제 input sentence와 동일한 output을 예측하기 위해 학습
나머지 non-masked 단어들의 context를 기반으로 오로지 masked token에 대한 예측 값 W'4실제 토큰 값 W4 이 일치하게끔 학습 진행
MLM을 통해 bidirectional pre-trained model을 얻을 수 있지만, fine-tuning 과정에선 [MASK] token이 없기 때문에 pre-trainng과 fine-tuning 사이에 mismatch가 발생한다는 단점 존재
즉, input sentence에 [MASK] token이 있어야만 예측을 수행하여 실제 상황에서는 모델 활용이 불가
이를 완화하기 위해 training generator가 15%에 해당하는 token position을 선택하면 i-th 번째 token을 다음과 같이 대체
80%의 경우 [MASK] token으로 변경
10%의 경우 random token으로 변경
10%의 경우 바꾸지 않고 그대로 사용
💡 10%에 해당하는 token을 random하게 바꾸는 것이 모델의 성능을 저하시킬 수 있다고 생각할 수 있지만, 실제 비율은 전체 데이터의 약 1.5%에 해당하는 데이터이기 때문에 실제 성능에는 크게 영향을 미치지 않는다. 💡 또한 10% token을 바꾸지 않는 것은 representation을 실제 단어에 편향되게 하기 위함이다.
이러한 방식의 장점은 Transformer의 Encoder가 어떤 단어를 예측해야 하는지, 어떤 단어가 random word로 대체되었는지 알 수 없기 때문에 모든 input token에 대해 distributional contextual representation을 유지하도록 강제하는 것
MLM은 batch마다 전체 input sequence의 약 15%에 해당하는 token에 대해서만 예측을 수행하기 때문에 추가적인 pre-training step이 필요할 것이라 생각할 수 있음
그러나 MLM이 모든 input sequence를 활용하는 left-to-right LM보다 수렴 속도는 약간 느리지만, training cost를 증가하는 것보다 MLM의 개선 효과가 이를 훨씬 능가하는 것을 확인
💡 GELU Activation function GELU 함수는 RELU, Zoneout, dropout의 특징을 조합하여 유도한 활성화 함수이다. 여기서 표준정규분포의 CDF가 사용되기 때문에 x의 값이 작아질수록 dropped될 가능성이 높아진다.
Task #2: Next Sentence Prediction(NSP)
Question Answering(QA), Natural Language Inference(NLI) 등의 주요한 downstream task들은 두 문장의 relationship을 이해하는 데에 기반하며 이는 language modeling에서 직접적으로 확인하지 못함
모델이 sentence relationship을 학습하기 위해 모든 monolingual corpus를 통해 간단하게 생성이 가능한 이진화된 next sentence prediction task를 통해 pre-train
pre-training example로 sentence A와 B를 골랐을 때 두 가지의 경우로 sentence B를 구성
50%의 경우 실제 next sentence인 B를 활용 → IsNext
50%의 경우는 corpus에서의 random sentence → NotNext
Figure 1에 나타난 것처럼 C는 next sentence prediction(NSP)에 사용되는 토큰
BERT는 C token을 통하여 input으로 들어온 두 문장이 실제 corpus에서 연속적인 문장인지(IsNext), 아닌지(NotNext)를 학습
💡 S1, S2, ... , S10까지의 token이 연속적으로 구성된 document가 있을 때, 다음과 같이 50%의 비율로 구성한다. [CLS] S1 [SEP] S2 → IsNext [CLS] S2 [SEP] S10 → NotNext [CLS] S5 [SEP] S8 → NotNext [CLS] S9 [SEP] S10 → IsNext
이러한 방식을 통한 pre-training 과정은 QA와 NLI 모두에서 매우 효과적
vector C는 NSP를 위해 훈련되기 때문에 fine-tuning 없이는 의미가 없는 sentence representation
이전에는 sentence embedding만이 downstream task에 transfer되었지만, BERT는 모든 파라미터를 transfer하여 end-task model parameter를 초기화
💡 Pre-training Hyper Parameter Setting - Maximum token legnth : 512 - Batch size : 256(256 sequences * 512 tokens = 128,000 tokens/batch) for 1,000,000 steps으로 이는 약 33억 개의 word corpus에 대해 약 40 epochs 해당하는 양 - Adam with learning rate : 1e-4, beta1 = 0.9, beta2 = 0.999 - L2 weight decay : 0.01 - learning rate warmup over the first 10,000 steps, linear decay of the learning rate - Dropout : 0.1(all layers) - GeLU activation function - Pre-train the model with sequence length of 128 for 90% of the steps, and the rest 10% of the steps are trained with sequence length of 512(to speed up pre-training)
결론적으로 BERT의 Pre-training 과정에선 BERT가 Transformer를 활용해 두 가지의 학습이 발생
[Mask] 혹은 replace된 토큰에 대해서도 실제 Input-sentence와 동일하게 예측하게끔 학습
Sentence B가 실제 Next Sentence인지를 확인하기 위해 IsNext인지 NotNext인지를 학습
Pre-training data
BooksCorpus(800M words)와 English Wikipedia(2,500M words)를 사용하여 pre-training
Wikipedia에선 text passgage만을 추출하며 lists, tables, headers는 무시
긴 연속 sequence를 추출하기 위해선, document-level corpus를 사용하는 것이 shuffled sentence-level corpus(ex> Billion Word Benchmark 등)를 사용하는 것보다 중요
Transformer의 self-attention mechanism를 통해 BERT는 적절한 input과 output을 교체하여 single text 혹은 text pair을 포함하는 다양한 downstream task에 모델링할 수 있어 Fine-tuning은 간단함
기존에 방식들은 text pair를 독립적으로 encode한 후 bidirectional cross attention에 적용했지만, BERT는 self-attention mechanism을 통해 concated text pair를 bidirectional cross attention을 수행하여 이 두 단계를 합침
각 작업에 대해 task-specific한 input과 output을 간단하게 BERT에 연결하고, 모든 parameter를 end-to-end로 fine-tune
pre-training에서의 sentence A와 sentence B는 다음과 유사
paraphrasing의 sentence pairs
entailment의 hypothesis-premise pairs
Question-Answering의 question-passage pairs
text classification 혹은 sequence tagging의 degenerate text pairs
output 중 token representation은 sequence tagging, question answering과 같은 token-level task에, [CLS] representation은 entailment, sentiment analysis와 같은 classification output layer에 입력
Figure 4와 같이 BERT의 task-specific model은 pre-trained된 BERT 모델에 하나의 output layer만 추가하여 구성
[SEP] : 비연속적인 token sequence를 구별하기 위한 special symbol
💡 Fine-tuning Hyperparameter - batch_size, learning rate, training epochs를 제외하곤 pre-training 과정과 동일하며, downstream task마다 hyperparameter의 값은 변화하지만 모든 task에 해당하는 일정한 범위가 있는 것을 확인 - Batch size : 16, 32 - learning rate(Adam) : 5e-5, 3e-5, 2e-5 - Number of epochs : 2, 3, 4
GLUE에 대한 fine-tuning을 위해 input sequence에 대해서 앞서 설명한 내용과 동일하게 representation을 생성하고, 첫번째 input token([CLS])에 대응하는 최종 hidden vector C만 aggregate representation으로 활용
classification layer의 가중치 W ∈ R^(KxH)만이 유일한 새로운 파라미터
K 는 label의 개수
C 와 W 를 활용하여 classification loss를 계산 → log(softmax(CW^T))
batch size는 32이며, 3 epochs을 통해 fine-tune
각 GLUE task에 대해서 best fine-tuning learning rate 설정(5e-5, 4e-5, 3e-5, 2e-5)
BERT_Large 모델은 종종 작은 데이터셋에서 불안정한 것을 확인했고, 몇 개의 random restarts을 학습시켜 최적의 모델을 선택
random restart는 동일한 pre-trained checkpoint를 사용하지만, 다른 fine-tuning data를 섞고 classifier layer를 초기화
GLUE dataset은 test label이 없기 때문에 BERT_BASE 와 BERT_LARGE 를 위한 하나의 single GLUE evaluation server를 생성
BERT_BASE 와 BERT_LARGE 모두 모든 task에서 기존 SOTA 모델보다 average accuracy가 각각 4.5%와 7.0% 개선
OpenAI GPT와 BERT_BASE 는 attention masking을 제외하곤 모두 동일한 아키텍쳐
BERT_LARGE 모델이 BERT_BASE 와 비교했을 때 모든 task에서 성능이 앞섰으며, 특히 작은 크기의 training data에서도 성능이 앞섬
최근(그 당시) language model의 transfer learning으로 인한 improvement는 수많은 unlabeled data를 활용한 unsupervised pre-training 방식이 language understanding system의 필수적인 부분이라는 것을 입증
resource가 적은 task에서도 deep unidirectional architecture의 장점을 누릴 수 있음
이러한 결과를 deep bidirctional architecture로 일반화하여 동일한 pre-trained model이 광범위한 NLP task을 성공적으로 처리할 수 있도록 하는 것이 주요한 기여
💡 BERT, ELMo, GPT의 비교 BERT는 기존에 pre-training 및 fine-tuning 과정으로 NLP task를 수행하는 ELMo와 OpenAI GPT에서 개선을 이루어낸 모델이다. 가장 중요한 개선점은 바로 deep bidirectional representation을 통해 pre-train을 진행한다는 점이다. Transformer Encoder를 여러 층으로 쌓은 BERT 구조에서, bidirectional representation을 생산하기 위해 추가적으로 MLM과 NSP를 도입하여 pre-train을 진행한다. MLM이란 input sequence의 일부(15%)를 Masking 처리 한 후 Transformer Encoder가 해당 token을 original token과 동일하게 예측하게끔 학습하는 것을 의미하며, NSP는 input sentence pair에서 뒤에 나오는 sentence B가 실제 연속적인 문장인지, random하게 선택된 문장인지를 분류하는 것을 [CLS] 토큰의 final hidden vector C에 학습한다. 이러한 방식들을 통해 Masked token에 대한 예측에 모든 token을 활용하며 deep bidirectional representation을 생성할 수 있게 되었고, 여러 fine-tuning 과정에서의 downstream task에도 손쉽게 layer만을 추가해 수행할 수 있게 되었다.
💡 BERT 모델에 대한 생각 본 논문을 읽으며 BERT 모델에 대해 여러 생각을 하게 되었다. 첫 번째는, MLM을 수행하는 과정에서 random하게 Masking을 한다는 것에 대한 개선이다. 아직 BERT를 개선시킨 모델들에 대한 논문을 읽어보지 못해 어떻게 개선되었는지는 확인할 수 없지만, 이 randomness를 더욱 개선시킬 수 있을 것이라는 생각이 든다. 예를 들어, Masking 과정에서 input sentence에서 중요한 token을 계산할 수 있는 방법을 찾아 해당 token에 대한 masking을 수행한 후 학습을 진행할 수 있을 것 같다.
다음은 BERT라는 모델은 sentence가 pair 형태로 input으로 들어갈 경우에 가장 성능이 좋다는 생각이 드는데, 본 논문에서 예시로 들었던 Question-Answer 같은 task가 아닌 single sentence를 활용하는 task에서도 하나의 single sentence를 2개로 seperate할 수 있는 기준점을 찾아서 2개의 sentence로 나눠 pre-train하는 방법도 생각이 들었다. 물론 해당 경우 NSP에 대한 학습 효과는 모두 연속적인 sentence이기 때문에 떨어질 수 있다.