일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Python
- OpenCV
- 스택
- center loss
- 알고리즘
- 논문 구현
- 프로그래머스
- attention
- 3D
- point cloud
- Object Detection
- NLP
- numpy
- deep learning
- Knowledge Distillation
- level2
- 딥러닝
- Deeplearning
- Computer Vision
- re-identification
- 임계처리
- cv2
- transformer
- 자료구조
- reconstruction
- 큐
- Object Tracking
- 파이썬
- flame
- Threshold
- Today
- Total
공돌이 공룡의 서재
[논문 리뷰] BERT : Bidirectional Transformer 본문
[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는 task-specific architecture로, 밑에 있는 그림을 보면 task에 따라 weight를 곱하는 것을 볼 수 있다. 이 weight는 task가 달라지면 다시 곱해야 하는 단점이 있다. 또한 위 그림을 보면 양방향인 것처럼 보이지만, 실제로는 전방향 / 후방향을 독립적으로 구하고 그 결과를 결합해서 사용하는 것이므로, 엄밀히는 양방향이 아니다.
[비교 2] GPT : fine-tuning
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는 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보다 더 좋은 성능을 갖고 있음을 확인할 수 있다.
'딥러닝 > NLP' 카테고리의 다른 글
[논문 리뷰] GPT : Generative Pre-training / OpenAI NLP (0) | 2021.03.03 |
---|---|
[논문 리뷰] Transformer : Attention is All you need / NLP (자연어처리) 모델 트랜스포머 (0) | 2021.02.09 |