본문 바로가기

Study/논문 리뷰

[논문 리뷰] BERT : Pre-training of Deep Bidirectional Transformers for Language Understanding (2019) - (2) BERT ~ Experiments

▽ Abstract부터 Related Work까지는 이전 게시물을 참고해주세요 ▽

 

[논문 리뷰] BERT : Pre-training of Deep Bidirectional Transformers for Language Understanding (2019) - (1) Abstract ~ Relate

오늘 소개할 논문은 자연어에 큰 관심이 있지 않더라도 다들 한번쯤은 들어봤을 수 있는 그 유명한 "BERT : Pre-training of Deep Bidirectional Transformers for Language Understanding"이다. Google에서 2019년 발표한

it-is-my-life.tistory.com

 

3. BERT

이 장에서는 본격적으로 BERT의 메인 컨셉과 구체적인 실행에 대한 내용을 다룬다.

 

BERT의 구체적인 실행은 Pre-training과 Fine-tuning이라는 두가지 절차로 이루어져 있다.

 

첫번째 단계인 Pre-training에서는 다양한 Task의 unlabeled data를 통해서 학습을 진행한다.

두번째 단계인 Fine-tuning에서는 Pre-trained model이 Pre-train parameter들로 초기화 된 후에 downstream task에 맞는 labeled data로 Fine-tuning된다.

 

BERT의 Fine-tuning 과정 모식도

 

이 과정에서 서로 다른 downstream task임에도 불구하고 각각의 모델들이 unified한 architecture를 가지게 되는데 처음의 initialized된 Pre-trained model과 Fine-tuned model 사이의 차이가 크게 나지 않게 된다.

 

Model Architecture

BERT의 모델 아키텍처는 Multi-layer bidirectional Transformer encoder 구조로 되어있다. 뭔말이지.

우선 Multi-layer는 여러 층이 쌓여있다는 뜻이고 bidirectional은 앞서서도 계속 등장했듯이 양방향 문맥을 모두 반영한다는 의미이다.

 

즉, 양방향에 대한 attention을 모두 계산하는 Transformer encoder가 여러 층으로 쌓인 구조가 BERT라는 것이다.

 

논문에서는 두 종류의 BERT 모델을 사용했다고 언급되어 있는데,

1. 110M의 파라미터를 가지고 있는 BERT-base

2.  340M의 파라미터를 가지고 있는 BERT-large

이렇게 두가지 모델이다.

BERT-base 모델의 경우는 GPT와의 직접적인 비교를 위해서 동일한 모델 사이즈를 가지고 있고 차이점이라면 앞에서도 계속해서 제기되고 있는 "BERT는 bidirectional이고 GPT는 unidirectional"정도가 되겠다.

  • 앞에서 그렇게 열심히 디스해놓고 여기서도 친절하게(?) GPT와 BERT의 bidirectional함이 어떻게 다른지 한번 더 짚어주고 있다ㅋㅋ 논문 전반에 걸쳐서 이런 직접적인 디스가 많이 나와서 꽤 웃기다. 이게 미국의 스웩인가.

 

Input/Output Representations

BERT가 다양한 downstream task를 다룰 수 있도록 하기위해서 한 sentence이든 두개의 sentence(QA task의 문장쌍)이든 BERT의 input representation은 모호하지 않고 하나의 token sequence로 잘 표현되어야 한다.

 

먼저 본 논문에서는 Wordpiece embedding을 사용하여 sentence에 대한 토크나이징을 진행했다. 또한 각 sequence의 첫 토큰은 [CLS] 토큰으로. [CLS] 토큰과 대응되는 final hidden state는 classification task 수행을 위해서 sequence representation을 종합한다.

두번째로, BERT의 input sequence는 앞서 언급했듯이 두 sentence의 pair로 구성되어 있기 때문에 구분이 필요한데 논문에서는

 

1. 문장과 문장 사이에 [SEP] 토큰을 추가

2. 각 토큰이 sentence A에 해당하는지 sentence B에 해당하는지를 기억하는 embedding인 segment embedding을 추가

 

이 두가지 방법을 사용하였다.

세번째로, position embedding은 Transformer의 그 것과 동일한데 여기서 position embedding이란 sentence 내에서 단어의 위치(어순)를 기억하는 embedding이다.

 

BERT의 input representation 모식도

 

즉, 어떠한 token sequence가 주어졌을 때,

 

해당 token sequence의 input representation
=
token embedding + segment embedding + position embedding

 

이 되는 것이다.

 

3 - 1. Pre-training BERT

전통적인 unidirectional language model과 달리, BERT는 Masked LM(MLM), Next Sentence Prediction(NSP)라는 2개의 unsupervised-task를 이용하여 학습을 진행한다.

 

Task #1: Masked LM

만약 언어 모델이 아무런 제한없이 Standard LM처럼 left-to-right이나 right-to-left word prediction으로 학습을 하게 되면 간접적으로 예측하려는 토큰을 참조하게 되어서 multi-layered 구조에서 해당 단어를 예측하게 되고 결과적으로 학습이 어려워진다.

이를 해결하고 Deep bidirectional representation을 학습하기 위해서 input token의 일부를 랜덤하게 [MASK] 토큰으로 바꾸고 해당 토큰을 예측하게 하는 TASK를 수행한다.

이 때, [MASK] 토큰에 대응되는 final hidden state는 Standard LM의 경우와 같이 Vocabulary에 대한 softmax 출력으로 주어진다.

또한 모든 input sequence를 재구성하는 denoising autoencoder와 다르게 BERT는 [MASK]된 토큰 만을 예측하도록한다.

 

BERT의 MLM Task  수행 구조

 

논문에서는 각 input sequence에 대해서 15%의 토큰을 [MASK] 토큰으로 변경하였다.

그런데 여기서 한가지 문제가 생긴다.

[MASK] 토큰이 Pre-training 과정에서는 등장하는데 downstream task에 대한 Fine-tunning 과정에는 등장하지 않기 때문에 두 과정 사이에 불일치가 발생하는 것이다. 이러한 문제점을 완화시키기 위해서 MLM Task 시에 모든 마스킹 대상 토큰을 [MASK] 토큰으로 변경하지는 않고 세가지 경우로 나눠서 마스킹한다.

1. 80%의 마스킹 대상 토큰은 그대로 [MASK] 토큰으로 변경한다.

2. 10%의 마스킹 대상 토큰은 [MASK] 토큰 대신에 랜덤한 단어로 변경한다.

  • 예를 들어 "수인이는 오늘 셔츠를 입었다."를 "수인이는 오늘 얼그레이를 입었다."와 같은 랜덤한 단어로 변경한다.
  • 이렇게 되면 "예측 성능에 영향을 미치는거 아니냐?"라고 할 수도 있는데 마스킹 대상 토큰인 15%의 10%이기 때문에 실제로는 전체 input sequence의 1.5%의 토큰 만이 해당되기 때문에 실제 예측 성능에 미치는 영향은 미미하다고 한다. 또한 이렇게 되면 강제로 model이 모든 input sequence에 대한 문맥 정보를 기억해야 한다.

3. 10%의 마스킹 대상 토큰은 변경하지 않고 원래 word를 그대로 유지한다.

  • 실제 관측 단어에 대한 representation을 bias해주기 위해서 그대로 두는 것이다.

이를 바탕으로 cross entropy loss를 통해서 [MASK] 토큰에 대한 원래 토큰을 예측한다.

 

Task #2: Next Sentence Prediction (NSP)

QA나 NLI 같은 몇몇 중요한 자연어 처리 downstream task들은 language model에서 직접적으로 포착되지 않는 sentence 간의 관계를 이해하는 것이 중요하다.

 

이를 학습하기 위해서 BERT는 binarized next-sentence prediction task을 이용해 학습을 진행한다. 무슨 말인지 조금 더 자세히 살펴보자.

Binarized라는건 무엇인가가 0과 1같이 두 상태로 나눠져 있다는 뜻이다.

즉, binarized next-sentence란 next-sentence의 종류가 두 상태라는 뜻인데, Pre-training set의 sentence-pair에서 한 문장 다음에 오는 문장이 1) 실제 원래 다음 문장에 해당하는 "ISNEXT"이거나 2) 랜덤하게 선택된 관련 없는 문장인 "NOTNEXT"라는 두가지 종류로 존재한다는 것이다.

예를 들어서, 다음과 같은 두 예시를 살펴보자.

[CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP] | label =ISNEXT

[CLS] the man went to [MASK] store [SEP] penguin [MASK] are flight ##less birds [SEP] | label = NOTNEXT

두 예시모두 [SEP] 토큰을 기준으로 두 문장이 pair로 존재하는 형태의 sequence이다. 첫번째 예시는 "the man went to [MASK] store" 문장 뒤에 원래의 알맞은 문장인 "he bought a gallon [MASK] milk"가 "ISNEXT" 라벨과 함께 존재한다. 반면에 두번째 예시는 랜덤하게 선택된 관련 없는 문장인 "Penguin [MASK] are flight ##less birds"가 "NOTNEXT" 라벨과 함께 존재한다.

 

좌측 상단의 NSP에서 1(ISNEXT)인지 0(NOTNEXT)인지에 대한 결과가 도출된다.

 

해당 라벨을 바탕으로 예측을 진행하게 되는데 이 때, C 토큰이 본 Task를 위해서 사용된다.

굉장히 간단한 방식이지만 QA나 NLI같은 Classification Task에서 아주 좋은 결과를 냈다.

  • 역시 세상엔 똑똑한 사람들이 많다

NSP Task는 representation learning과 관련이 있지만, 과거 연구에서는 Sentence embedding만이 downstream task에 transfer되는 반면에 BERT는 모든 parameter들이 end parameter들에게 transfer되는 차이점이 있다.

Pre-training data

BERT의 Pre-training procedure를 위해서 논문에서는 BooksCorpus(800M 단어)와 리스트, 표, 해더를 무시한 Wikipedia(2,500M 단어)를 사용하였는데, input으로 긴 인접 sequence를 뽑아내기 위해서는 sentence 레벨의 corpus보다는 document 레벨의 corpus를 사용하는 것이 좋기 때문이다.

 

3 - 2. Fine-tunning BERT

Transformer의 self-attention 메커니즘이 BERT를 많은 타 downstream task에 모델링할 수 있게 해주기 때문에 Fine-tuning 과정은 비교적 쉽다.

 

보통의 input은 single text인 경우와 text pair인 경우 두가지로 나눌 수 있다. single text인 경우는 그냥 하나의 sequence로 생성하여 처리하면 되지만 text pair인 경우는 조금 복잡해진다.

보통의 방식에서는 text pair를 처리하기 위해서 다음 두 단계의 절차를 거친다.

1. 두 sentence를 각각 독립적으로 encode한다.

2. sentence pair의 관계를 파악하기 위해서 bidirectional cross attention을 적용한다.

그러나 이러한 방식은 Fine-tuning 과정에서 single text를 처리하는 모델과 text pair를 처리하는 모델을 각각 생성해줘야 한다는 불편함이 발생한다.

하지만 BERT는 두 text pair를 concatenation하고 Transformer의 self-attention 메커니즘을 사용하여 encode하기 때문에 두 단계를 거치지 않고도 한번에 text pair를 처리할 수 있다. 이를 통해서, BERT는 single text와 text pair 모두를 같은 모델로 fine-tuning하여 처리할 수 있게 된다. 엄청나다.

 

각각의 Task에 대하여, BERT는 간단히 Task-specific한 input과 output을 적용하여 모든 파라미터들을 end-to-end로 fine-tuning한다.

 

Task-specific한 input의 예시로는,

  1. paraphrasing task의 sentence pairs
  2. entailment task의 hypothesis-premise pairs
  3. QA task의 question-passage pairs
  4. text classification이나 sequence tagging task의 degenerate-none pairs

 

등이 있고 output의 예시로는,

  1. sequence tagging이나 QA의 token representation
  2. entailment나 sentiment analysis의 [CLS] representation

등이 있다.

여기서 [CLS] 토큰은 문장 내에 속하는 토큰이 아니고 문장 제일 앞에 위치하여 모든 input sequence를 바라볼 수 있는 효과를 가진다.

Pre-training과 비교했을 때에 Fine-tuning은 이미 사전 학습된 모델을 바탕으로 파라미터를 재조정하는 과정이기 때문에 학습 비용이 굉장히 싸다. 같은 Pre-training parameter로 출발하여 각각의 Task에 대한 논문 내의 실험들을 구현하기 위한 Fine-tuning 과정이 TPU 환경에선 1시간 이내, GPU 환경에선 몇시간 이내로 구현 가능하다.

4. Experiments

BERT 모델을 서로 다른 11개의 downstream task에 적용한 결과에 대한 내용인데 여기선 결과만 간단히 언급하고 넘어가려고 한다. 실험 세팅이나 과정이 궁금하신 분들은 논문을 참고하시면 될 것 같다!! (절대 귀찮아서 그런거 아님)

결론적으로, 총 11개의 NLP Task에 대하여 모두 SOTA를 달성했다.

 

다음 포스팅은 논문에서 가장 재미있게 읽었던 부분인 Ablation studies 부분과 Conclusion을 다루면서 BERT 논문 리뷰를 마치려고 한다. 긴 글 읽어주셔서 너무 감사하고 언제나 그렇듯이 오류나 첨언은 환영이라는 말씀을 드리면서 글을 마친다!!