NL-020, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (2019-NAACL)
BERT는 워낙 유명하기 때문에 정리해둔 자료도 많을테고.. 굳이 해야 하나 싶지만..나를 위해서 정리를 해두자.
0. Abstract
- BERT: Bidirectional Encoder Representation form Transformers
- Bidirectional 이란 것은, LM을 왼-오, 오-왼 양방향으로 학습시켰다는 것
- 이렇게 pre-trained model에 layer 하나만 추가하여 많은 task의 SOTA!
1. Introduction
- LM pre-training은 많은 natural language processing task에 큰 효과를 보여줌!
- NLI, paraphrasing, NER, SQuAD QA 등..
- Pre-trained language representation을 사용하는 방법에는 두 가지가 있다.
- Feature-based
- 대표적으로 ELMO와 같은 것이 있겠음.
- 실제로 BERT를 사용한다하면 이렇게 쓰는게 일반적이지 않을까 싶음
- Fine-tunning
- 대표적으로 OpenAI-GPT1이 있음. (여기서 GPT = GPT1)
- 이전에는 이렇게 두 가지 방법을 같이 사용.
- 즉 Unidirectional LM pre-training으로 word representation한 것 + task-specific fine-tunning을 하였다는 것
- 우리는 여기서 unidirectional 모델은 한계가 있다는 것을 생각
- LSTM에서 BiLSTM을 쓰는 것도 마찬가지..
- 즉 LM을 BiLM이 필요하다는 것이다.
- OpenAI-GPT는 왼-오로 self-attention Transformer 식으로 fine-tunning을 하였는데 이는 SQuAD와 같은 token-level task에는 심히 안좋다.
- 따라서 Bidirectional LM을 학습시킬건데.. 일반 LM 방식으로 하면 안되므로 "Masked language model" (MLM)을 Cloze task에서 영감받아서 진행하였다.
- MLM은 그냥 입력 문장에서 랜덤으로 하나의 token을 다른 token으로부터 유추해내는 식으로 학습한 것.
- 이런 식으로 학습할 때, 왼-오, 오-왼 둘 다사용하면 되고 모델은 Bidirectional Transformer이 된다.
- MLM 말고도 "next sentence prediction"이라 하는 task로 학습을 시켰다.
- ELMO와는 살짝 다른게, ELMO는 unidirectional 두 개를 concat한 느낌. 즉 왼-오, 오-왼을 각각 학습시켜 concatenation한 것이라 살짝 다르다.
- 이렇게 pre-trained model에다 task를 fine-tunning을 하면 senetence-level, token-level에서 SOTA가 된다.
- 여기서 여러 번 실험하지 않고 first fine-tunning 즉 한 번에 SOTA가 되었단 말
2. Related Work
2.1 Feature-based Approaches
- Embedding을 학습 잘하는 것은 중요한 성능 향상을 제공한다.
- Sentence Embedding, Paragraph Embedding이라 불리는 연구들도 word embedding을 기반으로 하는 듯
2.2 Fine-tunning Approaches
- Pre-trained된 LM으로부터 transfer learning이 최근 trend 였다.
- 이렇게 함으로써 fine-tunning할 때, 새롭게 배워야할 파라미터가 적다.(OpenAI-GPT 또한)
2.3 Transfer Learning form Supervised Data
- Unsupervised pre-training이 supervised-task에 transfer learning을 하는 것이 효과적이다!
- Computer vison에서는 ImageNet, Googlenet등 상당히 pre-trained 해서 많이 쓰이고 있다.
3. BERT
3.1 Model Architecture
- BERT는 multi-layer bidirectional Transformer encoder을 사용하였다.(Attention is all you need 에서 언급된 모델)
- L: Number of layers (i.e. Transformer blocks)
- H: hidden size
- A: the number of self-attention heads
- 4H: feed-forward/filter size
- BERT_Base와 BERT_Large는 다음과 같이 구성하였다.
- BERT_Base: L=12, H=768, A=12, Total Param = 110M
- BERT_Large: L=24, H=1024, A=16, Total Param = 340M
- BERT_Base의 model size는(param 개수) OpenAI-GPT1이랑 똑같이 했다.
- 실제 OpenAI-GPT2의 small 모델은 BERT_Large와 똑같이 모델 크기 맞춰서 진행하기도함.
- GPT Transformer은 왼쪽에서부터만 attention하는 constrained self-attention을 사용하였다.
- BERT는 bidirectional Tansformer을 사용하였고 이는 Transformer encoder을 사용하였다는 말임.(일반적으로 bidirectional Tansformer = Transformer encoder임)
- Transformer decoder가 의미하는 것은 일반적으로 left-context-only version임.
- 위의 그림은 대략적인 개념을 그린건데, 어떤 식의 차이가 있는지 보여주는 것이다.
3.2 Input Representation
- Input token은 3가지로 합하여 구성한다.
- WordPiece embedding with 30,000 token vocab (split word piece ##)
- learned positional embedding
- First token: [CLS]을 쓰고 이는 classification task에 쓰이는 toekn임.(아니면 무시하면 토큰)
- 두 문장이 들어가는 경우, 문장과 문장사이에는 [SEP] toekn 추가
- 첫 번째 문장에는 E_A special token 추가
- 두 번째 문장에는 E_B special token 추가
- 실제 코딩에서는 E_A=0, E_B=1 이런 식으로 그냥 값을 더하는 듯
- 한 개 문장이 들어가는 경우는 E_A만 추가하여 진행
3.3 Pre-training Tasks
- traditional bidirectional LM으로 학습하지 않고 새로운 두 가지 unsupervised로 학습
3.3.1 Task #1: Masked LM
- 직관적으로 매우 이는 bidirectional model에서 합당하다.
- 하지만 LM 모델링은 왼-오, 오-왼으로만 학습하는 구도이다.
- 따라서 새로운 task를 제시한 거고 그게 Masked LM이다.
- 즉 "나는 내일 회사를 가기 귀찮다." 문장이 있을 때, "회사를" 이라는 것을 embedding 학습하기 위해선, "나는 내일 [MASK] 가기 귀찮다." 로 바꿔서 [MASK]의 output이 "회사를"이 나오도록 LM을 학습하는 것이다.
- 이런 task는 사실 여기서 처음 제시한 건 아니고 Cloze task라고 존재한다고 한다.(빈칸 채우기 task)
- 즉 [MASK]라는 것은 주변 정보를 이용하여 원하는 token으로 매 번 학습이 되는 것을 의미한다.
- 생각해보면 이상하다. 왜냐하면 저렇게 학습했다고 하자. 그러면 서로가 서로를 잘 attention하여 toekn embedding을 배울 수 있다는 것이다. 하지만 fine-tunning 과정 중에 [MASK]라는 것은 사실 존재하지 않는다. 먼가 다른 mismatch가 있다는 것이다. (단점1)
- 또한 Inference 시에도, [MASK]가 존재하지 않으므로 정확히(정말 좋은 모델) 학습이 될까? 라는 의문점이 개인적으로 남았다.
- 따라서 다음과 같이 언제나 [MASK]로 바꾸지 않고 다음과 같이 진행한다.
- 예시 문장: My dog is hairy.
- 랜덤한 token 선택 -> hairy 선택했다고 하자.
- 80%: my dog is [MASK].
- 80%는 [MASK]로 Masked LM 학습을 진행함.
- 10%: my dog is apple.
- 10%는 이상한 것(apple)로 바꿔서 noise를 추가해준다.
- 10%: my dog is hairy.
- 10%는 그냥 그대로 두어 actural observed word을 표현하도록 bias를 준다!
- 이렇게 pre-training과 fine-tunning과의 mismatch를 줄여준다.
- 실제 바꾸려고 선택되는 token(random 하게 고른다는 거, hairy 같은 token)은 15%밖에 안된다.
- 문장을 token으로 쪼갠다음에 하나의 token을 MASK 하는 것인데 그 비율이 15/100 = 1/6.6 즉 평균 문장이 6.6개의 token을 가지고 있단 뜻인가?
- 아무튼 이렇게 15%밖에 안되니 더 많은 pre-training steps이 필요한 단점2가 있음.
- Transformer encoder 어떤 단어가 예측되어야 하는지 모르기 때문에 모든 입력 token의 distributional contextual representation을 알고 있어야 한다.
- 이게 Masked LM이 노리는 효과인 듯
- Section 5.3에서 MLM이 LTR(left-to-right)보다 학습이 느리지만, 성능적으로는 좋다는 그래프를 보여준다.
3.3.2 Task #2: Next Sentence Prediction
- QA와 NLI task는 문장 두 개의 관계를 이해하는데 기반을 두고 있다.
- 따라서 여기서 binarized next sentence prediction task로 학습을 하였다.
- 예시:
- 데이터에서 50%는 그냥 연속된 두 문장을 가져다 IsNext로 사용하고 나머지 50%인 NonNext는 다른 곳에서 random sentence를 가져와서 사용함.
- 이렇게 한 task는 97~98% 성능이 나왔고 이에 대한 효과는 뒤에서 실험으로 보여줌.
- 문장에서 [MASK] token은 Task #1 때문에 있는 것인 듯? 즉 [MASK]로 치환하고 TASK #1, #2로 학습하는 순서인 듯함.
3.4 Pre-training Procedure
- Pre-training corpus는 BooksCorpus(800M words)와 English Wikipedia(2,500M words)를 concatenation을 하여서 사용함.
- Wikipedia 데이터에서 lists, tables, header은 제거하고 text passage만 사용함.
- Corpus에서 two spans을 함 (즉 두 개의 문장을 뽑아냄)
- 첫 번째 문장에는 A embedding을 더함
- 두 번째 문장에는 B embedding을 더함
- B는 A의 실제 next sentecne인 경우가 50%, 아닌 경우도 50%
- A, B 두 문장 합쳐서 512 tokens 이내로 한다.
- 실제 코드 돌릴 때, 512 token이 넘어가면 앞에서 부터 잘라서만 embedding 됐었음..
- The LM masking is applied after WordPiece tokenization with a uniform masking rate of 15%, and no special consideration given to partial word pieces.
- 15%만 uniform masking 됨
- Partial word pieces에 특별한 고려가 없다. Word piece model을 지나면, 막 ##이 붙은 특별한 token들이 생겨나는데, 이거에 따른 특별한 고려가 없다는거 같다.
- 한 Batch당 256의 문장쌍을 사용. 즉 256 x 512 = 128,000 tokens/batch를 한 step당 사용하는 것임
- 1,000,000 steps 정도 학습을 하였으며, 이는 40 epochs, 33억 단어 코퍼스를 학습시킨 것임.
- Adam으로 1e-4 learning rate으로 학습시켰으며 이 때,
$$\beta_1=0.9$$$$\beta_2=0.999$$을 사용하고 L2 weight decay는 0.01을 사용함. - Learning rate warm-up over the first 10,000 steps
- linear decay of learning rate
- Dropout 확률 0.1 on all layers
- Gelu activation function 사용(OpenAI GPT를 따라서)
- 대략 4 Cloud TPUs(=16 TPU chips)에서 BERT_base를 16 Clous TPUs(=64 TPU chips)에서 학습시키며 4일정도 pre-training이 걸렸음.
3.5 Fine-tunning Procedure
- Sequence-level classification task에서 입력을 fixed-dimensional pooled representation을 얻기 위해서 마지막 hidden state에서 첫 번째 token인 [CLS]의 word embedding을 결과로 사용하였다.
- 즉 [CLS] token의 마지막 hidden state 출력을 입력 문장의 classification task에 쓰겠다는 말
- 이게 가능한 이유는, pre-training을 할 때, next sentence prediction을 [CLS] token가지고 했기 때문임.
- 마지막 hidden 결과가 H차원 vector C
- Classification layer W는 KxH matrix.(K는 classifier labels 수)
- 즉 C x transpose(W)을 하면 (1xH) x (HxK) = 1xK가 되는 것이고 이것의 softmax 결과를 P라고 함. (P=softmax(CW^T))
- BERT와 W 모두 fine-tunned 시킨다.(pre-trainin된 부분도 fine-tunning 하겠단 말)
- Span-level과 token-level prediction task는 조금 다르게 진행(뒤에서 설명)
- 모델 hyperparameters은 pre-training와 비슷하지만, optimal hyperparameter은 task-specific하고 다음과 같은 값으로 진행하였다.
- Batch size: 16, 32
- Learning rate(Adam): 53-5, 3e-5, 23-5
- Number of epochs: 3, 4
- Large data sets일 수록, 하이퍼파리미터의 선택은 덜 민감하다.
- 또한 fine-tunning은 굉장히 빠르게 일어나느 편이다.
- 3, 4 epoch면 정말 별로 안걸리는 시간임
- 즉 pre-training 모델만 확보한다면...여러 task에 손쉽게 적용해볼 수 있겠다
3.6 Comparison of BERT and OpenAI GPT
- OpenAI GPT1와 비교를 하는 부분 (여기서
- GPT은 BooksCorpus (800M words)로 학습
BERT는 BooksCorpus + Wikipedia (2,500M words)로 학습 - GPT는 [SEP]와 [CLS] token을 fine-tunning에서만 사용
BERT는 학습 시에도 사용하였고 A/B embedding 또한 사용 - GPT는 1M steps with batch size = 32,000 words
BERT는 1M steps with batch size = 128,000 words - GPT는 모든 fine-tunning에서 same learning rate 5e-5 사용
BERT는 task-specific fine-tunning learning rate 사용 (development set에서 선택)
- 이것에 대한 ablation experiment를 사용하였다.
- 요약하면, 더 많은 학습 데이터로 학습하였고, 학습 시 pre-training과 fine-tunning의 간극을 줄이려고 하였고, batch당 해당하는 words도 많도록, lr을 미세조정 하였음.
4. Experiments
- 이 부분은 간단히만... 자세한건 논문 참조
4.1 GLUE Datasets
- MNLI
- QQP
- QNLI
- SST-2
- CoLA
- STS-B
- MRPC
- RTE
- WNLI
4.1.1 GLUE Results
4.2 SQuAD v1.1
- SQuAD task에서 학습 방식을 설명한 건데 크게 특별한 건 없고 pointer network 방식으로 학습했다고 보면 됨.
- A sentence: question, B sentence: paragraph
- 즉 question에는 A embedding, paragraph에는 B embedding을 추가해준다.
- Ti가 input token의 i번째 final hidden vector라고 할 때, start vector-S(H dimension)와 end vector-E(H dimension)
- 다음과 같이 각 token에 해당하는 확률을 구해서(softmax로) 학습을 진행하는 식
- 여기서 S를 학습하는 것이다. 마찬가지로 end token에 해당하는 E를 학습한다고 보면 된다.
- End token도 비슷하게 하면 된다.
4.3 Named Entity Recognition
- CoNLL 2003 NER 데이터 세트를 사용
- Person, Organization, Location, Miscellaneous or Other(그 외) 이렇게 annotated가 되어 있음.
4.4 SWAG
- BERT 프레임워크의 각 부분에 대해 실험적으로 효과를 증명한다.
5.1 Effect of Pre-training Tasks
- No NSP: MLM(Masked LM)으로는 학습하나 NSP(next sentence prediction)으로는 학습안한 것(pre-training)
- LTR & No NSP: Left-to-Right(LTR) LM으로 MLM대신 학습한 경우
- 실험 결과가 살짝 흥미로운게, BiLSTM을 추가하니까 SQuAD 에선 좋아졌으나 나머지에서는 성능이 안좋아 졌다.
- 그에 반해, LTR이 아닌 쌍방향을 한 것은 전체적인 성능이 향상 되었다. 즉 BiLSTM보다는 확실히 MLM과 같은 쌍방향 LM이 좋다는 것...
5.2 Effect of Model Size
- 결과는 모델의 크기가 커질수록 좋아진다.
- BERT에서 선택한 모델을 다시 써보자면 다음과 같다.
- BERT_Base: L=12, H=768, A=12, Total Param = 110M
- BERT_Large: L=24, H=1024, A=16, Total Param = 340M
5.3 Effect of Number of Training Steps
- 질문: BERT는 정말로 많은 양의 pre-training이 피요할까?(128,000 words/batch * 1,000,000 steps)
정답: 그렇다. BERT_BASE 그래프를 1M steps가 500k steps에 비해 MNLI 성능이 1% 좋다. - 질문: MLM pre-training을 LTR pra-training보다 수렴속도가 느린가? 왜냐하면 only 15%만 각 batch에서 예측하는 식이니까..
정답: 그렇다. MLM이 수렴이 느리다. 그러나 LTR에 비해 같은 steps에서 절대적인 성능은 높다.
5.4 Feature-based Approach with BERT
- 지금까지는 윗단에 layer을 추가후 전체를 fine-tunning 한 식
- 이렇게 말고 고정된 feature 기반으로(추가 layer만 fine-tunning 하겠다) 하면 좋은 점도 있다.
- Transformer encoder 구조로 모든 NLP task를 표현하는 것은 어렵다. 하지만 feature-based을 사용하면 task-specific model을 설계하여 추가할 수 있다.
- 많은 학습 데이터로 pre-compute을 해야하는 비싼 비용이 줄어든다. 즉 BERT로 많은 데이터로 잘 pre-training 시켜놨으니 새로운 task 학습 데이터에 fine-tunning 을 조금만 해도 성능이 쫌 되니 비용 감소 효과가 있다는 듯.
- BERT를 ELMO embedding 식으로 가져다가 fine-tunning한 결과는 다음과 같다.(feature-based)
6. Conclusion
- Our major contribution is further generalizing these findings to deep bidirectional architectures, allowing the same pre-trained model to successfully tackle a broad set of NLP tasks.
댓글
댓글 쓰기