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가지로 합하여 구성한다.
    1. WordPiece embedding with 30,000 token vocab (split word piece ##)
    2. learned positional embedding
    3. First token: [CLS]을 쓰고 이는 classification task에 쓰이는 toekn임.(아니면 무시하면 토큰)
    4. 두 문장이 들어가는 경우, 문장과 문장사이에는 [SEP] toekn 추가
      • 첫 번째 문장에는 E_A special token 추가
      • 두 번째 문장에는 E_B special token 추가
      • 실제 코딩에서는 E_A=0, E_B=1 이런 식으로 그냥 값을 더하는 듯
    5. 한 개 문장이 들어가는 경우는 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와 비교를 하는 부분 (여기서
  1. GPT은 BooksCorpus (800M words)로 학습
    BERT는 BooksCorpus + Wikipedia (2,500M words)로 학습
  2. GPT는 [SEP]와 [CLS] token을 fine-tunning에서만 사용
    BERT는 학습 시에도 사용하였고 A/B embedding 또한 사용
  3. GPT는 1M steps with batch size = 32,000 words
    BERT는 1M steps with batch size = 128,000 words
  4. 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

  • The Situations With Adversarial Generations

5. Ablation Studies

  • 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

  1. 질문: BERT는 정말로 많은 양의 pre-training이 피요할까?(128,000 words/batch * 1,000,000 steps)
    정답: 그렇다. BERT_BASE 그래프를 1M steps가 500k steps에 비해 MNLI 성능이 1% 좋다.
  2. 질문: 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 하겠다) 하면 좋은 점도 있다.
    1. Transformer encoder 구조로 모든 NLP task를 표현하는 것은 어렵다. 하지만 feature-based을 사용하면 task-specific model을 설계하여 추가할 수 있다.
    2. 많은 학습 데이터로 pre-compute을 해야하는 비싼 비용이 줄어든다. 즉 BERT로 많은 데이터로 잘 pre-training 시켜놨으니 새로운 task 학습 데이터에 fine-tunning 을 조금만 해도 성능이 쫌 되니 비용 감소 효과가 있다는 듯.
  • BERT를 ELMO embedding 식으로 가져다가 fine-tunning한 결과는 다음과 같다.(feature-based)
    • 추가 layer은 2개의 biLSTM을 추가한 정도임.
    • 효과가 상당히 뛰어나다! 사실 내가 BERT를 가져다 쓴다면, feature-based일 듯.
    • 많은 사람들이 그렇지 않을까 싶음. 왜냐하면 BERT 전체를 fine-tunning을 해야하는 메모리 상 문제도 필요할 것이고 코드를 잘 핸들링까지 해야되니까 ㅜㅜ
    • 근데 feature-based는 코드가 뽑아내기 쉽게 되어있고 그 뒤에 내가 하려는 task에 맞는 모델 설계를 하면 되니까.. ELMO처럼 쓰면 좋을 듯함.

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.

댓글