공돌이 공룡의 서재

[논문 리뷰] BERT : Bidirectional Transformer 본문

딥러닝/NLP

[논문 리뷰] BERT : Bidirectional Transformer

구름위의공룡 2021. 8. 20. 00:13

 

[BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding]

https://arxiv.org/abs/1810.04805

 

리뷰를 쓰는 시점에서 Transformer와 BERT 둘 다 인용수가 24000을 넘어섰다. 어제 리뷰한 ViT만 해도 BERT기반이고 정말 많은 곳에서 응용되는 모델인 것 같다.

 


<1.> Introduction

 

BERT가 나오기 이전에 OpenAI에서 GPT1을 발표했었다. GPT는 앞서 리뷰했듯이, Transformer decoder만 stack 해서 만든 모델이다. 논문 전체적으로 GPT랑 어떤 점이 다른지를 상세하게 적혀있는데, GPT도 공부하고 같이 보면 더 좋은 공부가 될 것 같다.

 

pre-trained language representation을 가지고 task에 적용시키는 방법으로 2가지 방법이 있다. 첫 번째는 feature-based 방식이고, 두 번째는 fine-tuning 방식이다. 이 방식들의 한계를 지적하며, BERT에 대해 소개하고 있다.

 

[비교 1] ELMo : feature based 

ELMo

ELMo는 task-specific architecture로, 밑에 있는 그림을 보면 task에 따라 weight를 곱하는 것을 볼 수 있다. 이 weight는 task가 달라지면 다시 곱해야 하는 단점이 있다. 또한 위 그림을 보면 양방향인 것처럼 보이지만, 실제로는 전방향 / 후방향을 독립적으로 구하고 그 결과를 결합해서 사용하는 것이므로, 엄밀히는 양방향이 아니다.

 

 

[비교 2] GPT : fine-tuning

GPT 1

GPT는 fine-tuning 모델이다. taks에 따라 embedding 구조가 pre-train할때와 달라지는 것이 보인다. 또한 GPT의 경우 트랜스포머 디코더만 사용했기에 autoregressive 한 모델이다. sequence를 왼쪽에서 오른쪽으로 진행하면서 문맥을 파악한다. BERT 논문에서는 이렇게 한 방향으로만 문맥을 파악하는 것은 충분하지 않다고 말하고 있다.

 

이렇게 2가지 접근 방식들에 대해 언급하며, 양방향을 고려할 수 있는 모델로 BERT를 소개한다. 그런데, Traditional language model로는 양방향을 고려할 수 없으므로 새로운 language model이 필요하다. 이를 위해 나타난 것이 Masked language model이다. 

 

 


<2.> Architecture

BERT는 Transformer encoder만 쌓아서 만든 모델로, 12개 쌓인 것을 BERT-base라 하고, 24개 쌓은 것을 BERT-large라 한다. GPT1과 비교하기 위해 모델 크기가 같은 BERT-base를 기반으로 설명한다.

BERT
BERT: Unified model

BERT는 unified model이라는 특징이 있다. 즉, pre-train할 때와 fine-tuning 할 때 모델의 구조가 바뀌지 않는다. 마지막 encoder의 결과로 나온 token들을 어떻게 다루는지만 변한다.

 


 

<3.> Embedding

토큰들에 대해 먼저 알아보자. [CLS] 토큰은 무조건 맨 처음에 들어간다. 이 토큰에 해당하는 output은 classification task에 적용된다. 한 문장이 끝나면 [SEP] 토큰을 넣어서 문장들을 구분한다.

 

tokenization 방법으로는 wordpiece 방법을 사용한다. Segment embedding은 각 단어들이 어떤 문장에 속하는지에 대한 정보를 추가해주기 위함이다. Position embedding으론 Transformer에서 사용했던 것과 같이 Sinusoidal wave를 사용한다.

 


<4.> Pre-train

pre-train으로는 2가지 과정을 거친다. 그 중에 하나가 Masked LM이다.

 

입력 토큰들 중 15%를 mask로 가리고, BERT 모델에 통과시키고, 모델은 이 mask 처리된 자리에 어떤 단어가 들어가야 하는지를 예측한다. 이때, encoder의 self-attention을 사용하므로 모든 위치에서의 단어들이 고려되므로 bidirectional 하다고 볼 수 있겠다. 

그런데 실제로, fine-tuning과정에서는 mask 토큰이 쓰이지 않는다. 따라서, 이러한 mismatch를 줄이기 위해, 전체 15% 중 80% 는 mask로 처리하고, 10%는 임의의 토큰, 나머지 10% 원래대로 냅둔다. 

 

두 번째 과정은 Next Sentence Prediction이다.

[SEP] 토큰으로 구분된 두 문장을 주고, 이 문장들이 맥락상 다음 문장이다라고 판단하는 능력을 학습한다. masked LM에서는 문장 내에서 단어들간의 맥락을, NSP에서는 문장들 간의 관계를 파악하는 능력을 학습한다고 볼 수 있겠다. 다음 문장인지 아닌지를 판단하는, 즉 classifcation에 해당하는 문제라고 볼 수 있겠다. [CLS]에 해당하는 결과만 feed forward network를 통과시키고, softmax를 적용하여 판단한다.

 

논문을 읽을 때는 그래서 이 2가지 task를 수행하긴 하는데 어떻게 처리하는지가 잘 와닿지가 않았는데, 이는 구현된 코드를 살펴보니 동시에 고려하는 것을 알 수 있었다.

 

https://github.com/codertimo/BERT-pytorch/blob/master/bert_pytorch/trainer/pretrain.py

Line 100 ~ 
            # 1. forward the next_sentence_prediction and masked_lm model
            next_sent_output, mask_lm_output = self.model.forward(data["bert_input"], data["segment_label"])

            # 2-1. NLL(negative log likelihood) loss of is_next classification result
            next_loss = self.criterion(next_sent_output, data["is_next"])

            # 2-2. NLLLoss of predicting masked token word
            mask_loss = self.criterion(mask_lm_output.transpose(1, 2), data["bert_label"])

            # 2-3. Adding next_loss and mask_loss : 3.4 Pre-training Procedure
            loss = next_loss + mask_loss

 

<5.> Fine-Tuning

모델 구조는 바뀌는 것이 없고, output token들을 어떻게 처리하는지만 바뀌는 것이 보인다.

 


<6.> Perfomance

 

GLUE score에 대한 표인데, BERT base로도 기존의 다른 모델들과 GPT보다 더 좋은 성능을 갖고 있음을 확인할 수 있다.

 

 


 

Comments