[Pre-training of Deep Bidirectional Transformers for Language Understanding] BERT
https://arxiv.org/abs/1810.04805
Introduction
많은 언어 처리 Task들에 대해, 언어모델을 사전학습(pre-training)하는 것이 효과적이라고 알려져 있다. 이는 자연어 추론이나, paraphrasing 등 문장과 문장간의 관계를 전체적으로 분석하고 그 사이의 관계를 예측하는 문장 단위 task나, entity recognition, Q/A 등 토큰 단위에서 세분화된 아웃풋을 생성하기위해 모델을 학습시키는 task에 모두 적용된다.
사전학습된 language representations를 적용하는 데에는 Feature-based와 Finetuning. 두가지 방법이 있다.
Feature-based의 경우 ELMo와 같이 특정한 Task에 적합한 아키텍쳐와 함께 추가적인 피쳐로 사전학습된 representations를 추가하는 방식을 의미하며.
Fine-tuning의 경우 Generative Pre-trained Transformer (GPT)와 같이, task에 특정된 파라미터는 적게 가져가고, downstream task에서 모든 학습된 파라미터를 fine-tuning하는 방법으로 학습시키는 방식이다.
위 두 접근법 모두 사전학습에서는 같은 목적식을 사용하며, 단방향 언어모델로 일반적인 언어 표현을 학습시킨다.
논문에서는 이러한 기법들, 특히 fine-tuning 방식이 사전학습된 표현(representations)의 능력을 저해시킨다고 주장한다. 가장 큰 한계점은 표준 언어모델은 단방향이며, 이것이 사전학습 중에 사용될수 있는 구조의 선택을 제한시킨다고 한다.
예를 들면 OpenAI의 GPT에서 저자는 left-to-right 구조를 사용하는데, 모든 토큰은 Transformer의 self-attention layer에 존재하는 이전의 토큰들만 참조할 수 있다. 이러한 제한 사항 때문에 문장 단위 task들에서 최적에 도달할 수 없으며, Question/Answering과 같은 토큰 단위 Task에서 fine-tuning 기법을 적용하게 되면 양 방향의 문맥과 상응하지 않는다는 큰 문제가 생기게 된다.
이에 이 논문에서는 fine-tuning 기반 접근법을 개선한 BERT : Bidirectional Encoder Representations from Transformers를 제시한다. BERT는 위에서 언급한 단방향 방식의 문제를 마스킹된 언어모델 사전학습을 사용함으로서 완화하였다.
마스크된 언어모델은 임의로 input 내의 토큰을 masking 하고 (가리는 것과 같음), 문맥을 참조해 마스킹된 단어의 원본 vocabulariy의 ID를 예측한다.
Left-to-right 언어모델 사전학습과는 다르게, MLM(Masked Language Model)의 Objective는 얻어낸 representations이 좌우의 문맥정보를 모두 융합할 수 있도록 해, 양방향 Transformer를 사전 학습할 수 있게 한다.
이러한 masked language model에 추가적으로 논문에서는 텍스트 쌍 representations 을 동시에 사전학습 시킬 수 있는 "다음 문장 예측 (Next Sentence Prediction)" task 를 사용한다.
저자는 논문이 다음과 같은 기여를 했다고 주장한다.
- Language representations 를 위한 언어모델의 사전학습에 "양방향"을 접목함.
- 기존에 사전학습된 representations 의 경우 Task에 맞춰서 꽤 많은 추가적인 학습과정이 필요했으나, BERT 모델의 경우 하나의 Task에 한정되어 제작된 모델들 보다 더 좋은 성능을 보였음.
- BERT는 11가지 NLP Task들에 대해 모두 SOTA를 갱신하였음.
BERT
논문에서는 BERT를 pre-training과 fine-tuning 두 가지 step으로 다루고 있다. 사전학습 단계에서는 다양한 사전학습 테스크들에 대해서 labeling 되지 않은 데이터를 이용해 학습된다. fine-tuning 에서는 BERT 모델이 먼저 사전학습된 파라미터로 initialized 된 뒤, downstream task들에 대해 labeling 된 데이터를 이용해 fine-tuned된다. 각각의 downstream 테스크에서 처음에는 같은 사전학습된 파라미터로 초기화 되었더라도, 서로 다른 fine-tuned 된 모델을 갖게 된다.
정리하자면 labeling 안된 데이터 이용 다양한 방법으로 pre-training -> 파라미터 저장.
저장된 파라미터로 모델 초기화하고 세부적인 task 들(EX: Q&A, 언어추론)에 맞게 입출력 조정한 뒤 각각 fine-tuning.
파라미터를 얼리지 않고 모두 학습시킨다.
아래 그림을 참고하면 사전학습단계에서는 라벨링 되지않은 문장 쌍 A, B를 입력으로 넣어줌으로서 BERT모델을 학습시키고, 이를 바탕으로 MNLI, NER, SQuAD 등 다양한 NLP task에 맞게 입출력을 바꿔주고 사전학습된 파라미터를 이용해 다시 fine-tuning 시켜준다.
BERT의 독특한 특징은 서로 다른 Task들에 대해 같은 구조를 사용한다는 것이다. pre-training 단계와 fine-tuning 되는 downstream의 구조에는 입력 출력 혹은 약간의 레이어 조정 외에는 큰 차이점이 존재하지 않는다.
Model Architecture
BERT 모델의 구조는 다층 양방향 Transformer 인코더이다. 기본적인 구조는 Transformer와 거의 유사하다고 한다.
논문에서는 두가지 모델을 제시한다.
Layer의 개수 (Transformer Blocks)를 L, hidden size를 H, 그리고 self-attention head의 개수를 A라고 할때,
BERT(BASE) [L=12, H=768, A=12, Total Parameters = 110M]
BERT(LARGE) [L=24, H=1024, A=16, Total Parameters = 340M] #더 깊은 모델
BERT(BASE)는 OpenAI 의 GPT와의 비교를 위해 같은 사이즈의 모델로 구축되었고, 그들의 차이점은 BERT의 Transformer는 양방향 self-attention을 사용하는 반면 GPT의 Transformer는 left 방향의 정보만 고려한 제한적 self-attention을 사용한다는 것이다.
Input/Output Representations
BERT모델이 다양한 down-stream task에 사용될 수 있게 하기 위해서는, 하나의 토큰 시퀀스에 대해서 input representation이 애매모호하지 않게 하나의 문장이나 한쌍의 문장을 표현할 수 있어야 한다. 여기서는 '문장'이라고 했지만 우리가 알고있는 '문장'이 아닌 연속된 텍스트 라고 생각하자. '시퀀스'역시 BERT에 주어지는 input 토큰으로 한개의 문장 혹은 한 쌍의 문장이 함께 들어갈 수도 있다. (결국 다양하게 적용될 수 있음을 의미)
논문에서는 30,000개의 vocabulary를 가지고 있는 WordPiece 임베딩을 사용했다. 모든 시퀀스의 첫 번째 토큰에는 분류를 위한 [CLS]토큰을 넣었고, 이 토큰에 상응하는 마지막 hidden state는 분류 문제 (classification task) 에 시퀀스 표현을 합치는데에 사용되었다. 문장의 쌍의 경우 하나의 시퀀스로 압축되어 입력되었다.
저자는 문장을 두 가지 방식으로 구별지었는데, 먼저 [SEP]라는 토큰으로 구별하고, 두 번째로 문장 A에서 나왔는지, B에서 나왔는지를 알려줄 수 있는 학습된 임베딩을 더해주었다. 아래 그림에서 볼 수 있듯이, input embedding 을 'E'로 명시해 놓았다. 그리고 [CLS] 토큰에 해당되는 마지막 hidden vector를 C ∈ R[H]로, 그리고 i번째 input token에 대한 마지막 히든 벡터를 Ti ∈ R[H] 로 명시하였다. ([H]는 차원 수 표현)
주어진 토큰에 대해 그것의 input representation은 상응하는 토큰, segment, position embedding의 합으로 구성되었다.
Pre-training BERT
다른 연구와 다르게 BERT를 사전학습 시키는데에 두 가지 비지도 학습을 사용했다. 이 부분은 Figure 1의 왼쪽 부분에 해당된다.
Task #1: Masked LM (MLM)
직관적으로 보면, 당연히 단방향 방식이나 양방향을 따로 학습하고 concatenation 하는 방법보다 양방향 모델이 강력할거라고 생각할 수 있다. 하지만 전통적인 조건부 (conditional) 언어 모델들은 양방향 conditioning이 간접적으로 자신을 보게 만들고, 다층 문맥 구조상에서 target 단어를 사소하게 예측하게 할 수 있었기 때문에. 한쪽 방향으로 밖에 학습이 불가능 했다.
깊은 양방향 representation을 학습하기 위해서는 input token의 일부분을 간단히 마스킹 하고, 마스킹 된 토큰을 예측하는 방법으로 학습시킬 수 있다. 이러한 절차를 저자는 "MaskedLM (MLM)"이라고 칭한다. 이후 마지막 마스킹된 토큰에 해당하는 hidden vectors는 vocabulary에 할당되는 output softmax 를 거친다. 여러 실험을 거쳐 논문에서는 15%의 WordPiece로 임베딩된 토큰 시퀀스들에 대해서 임의로 마스킹을 진행했다. 타 연구(denoising auto-encoder)와 다르게 논문에서는 input 구조를 바꾸지 않고 마스킹된 단어를 예측하는 것만 수행했다.
비록 이러한 방식이 양방향으로 사전학습된 모델을 얻게 해 줄 수 있었으나, downstream 에서 fine-tuning을 적용하기에는 matching이 안되는 문제가 존재했다. 왜냐면 [MASK] 토큰은 fine-tuning 중에 등장하지 않기 때문. 이를 완화하기 위해서 masked 된 단어를 실제 [MASK]토큰으로 '모두' 대체하지는 않았다.
학습데이터 생성기는 15%의 토큰 위치를 예측을 위해 랜덤하게 선택한다. 만약 i번째 토큰이 선택되면 (1) 80%만큼 은[MASK]로 대체하고 (2) 10%는 랜덤 토큰으로 교체하고 (3) 10%는 바꾸지 않고 그대로 사용한다. 이 방법을 사용하면 Ti (i번째 토큰에 해당되는 hidden state)는 원래의 토큰을 cross entropy loss를 이용해 예측하게 된다.
모두 masking을 해놓고 학습을 해 버리면, fine-tuning 과정에서 다른 테스크를 수행함에 있어서 학습이 전혀 안되므로 적절한 비율로 섞어 놨다는 얘기. 수학만 공부 시키면 영어는 전혀 못하므로, 국어, 영어를 10%만큼 가르쳐놓고 나중에 10%의 지식을 사용해서 스스로 발전할 수 있게 세팅해놓는 느낌.
Task #2: Next Sentence Prediction (NSP)
Question/Answering (QA)이나 Natural Language Inference (NLI)과 같은 많은 downstream task에서는 두 문장의 관계를 이해함에 기반을 두는데, 이는 language 모델링에서 직접적으로 얻어지지 않는다. 모델이 이 관계를 학습하게 하기 위해서 단일 언어 corpus에서 쉽게 생성될 수 있는 이진화된 다음 문장 예측 task를 사전학습시킨다. 더 자세히 말해보자면 사전학습 단계에서 A 와 B 둘 중에 하나의 문장을 선택할 때 50%의 경우 B가 A 에 이어서 나오고 (IsNext 로 라벨링), 나머지 50%의 경우 랜덤한 다른 문장이 나올 때,(NotNext로 라벨링) Figure 1에서 보였던 것처럼, C가 이러한 다음 문장 예측에 사용된다. 간단해 보일지라도 이러한 Task를 추가하는 것은 QA 와 NLI 모두에서 향상된 성능을 보여준다.
이러한 NSP task는 representation learning과 유사하다. 하지만 이전의 연구에서는 문장 임베딩만 down-stream task에 넘어간 반면, BERT에서는 모든 파라미터가 down-stream task를 초기화 하는데에 사용된다.
Pre-training data
사전학습 절차는 주로 당시에 자주 사용되던 사전학습과 동일하게 진행되었다. 사전학습을 위한 말뭉치로는 BooksCorpus, English Wikipedia 등이 사용되었고. 위키피디아에서는 리스트나 표, 헤더를 제외하고 텍스트 데이터만 사용되었다. 긴 연속된 시퀀스를 추출하기 위해서 하나의 글단위로 되어있는 데이터가 더 유용했다고 한다.
Fine-tuning BERT
Bert 의 fine-tuning은 Transformer의 어텐션 메커니즘이 BERT가 많은 downstream task (텍스트가 하나던 쌍으로 주어지던)에 적용될 수 있도록 하므로 인풋과 아웃풋만 바꾸는 방법으로 어렵지 않게 적용될 수 있다.
텍스트 쌍에 대한 적용을 위한 일반적인 방법은 bidirectional 어텐션이 진행되기 전에 텍스트 쌍을 독립적으로 인코딩하는 것이다. 하지만 BERT에서는 self-attention으로 연결된 텍스트 쌍을 인코딩하면 두 문장 사이의 bidirectional cross attention이 효과적으로 포함되므로, self-attention 매커니즘을 이용해 두 단계 (인코딩과 어텐션)을 합쳐서 진행한다.
Paraphrasing: 미리 언급한 어휘와 뜻 이 같거나 유사한 어휘를 사용하여, 서술의 중복(동어 반복)을 막고 문장을 쉽게 풀어내는 화술을 말한다.
각각의 Task 에서 BERT에 작업에 맞는 input 과 output을 집어넣고, fine-tuning을 모든 파라미터에 진행한다. input 에서 pre-train으로 부터 나온 문장 A 와 B는 (1) paraphrasing의 문장 쌍, (2) 가설-전제 (두 개의 문장의 관계가 참인지 거짓인지 판별하는 것) 참 문장 쌍, (3) 질문-대답에 사용되는 question-passage 쌍, (4) 문장 태깅이나 텍스트 분류에 사용되는 degenerate text 쌍과 유사하다. (Downstream task가 문장 쌍을 이용하므로 유사한 문장 쌍 A, B를 사용한 pre-training이 효과적이라는 것)
Output에서는 토큰 representations가 output layer에 들어가면서 토큰단위 task를 수행한다. 예를 들면 순차 태깅이나 Q/A. 그리고 [CLS] 표현은 output 레이어에 분류를 위해 들어가고 이는 참 거짓 판별이나 감성 분석 등에 사용될 수 있다.
사전학습과 다르게 fine-tuning은 상대적으로 연산이 무겁지 않다. 논문에서 다룬 모든 결과들은, 만약 같은 pre-trained 모델을 사용한다면 대부분이 하나의 Google TPU를 이용해 1 시간 안에 계산이 가능하며 GPU로도 몇 시간 걸리지 않는다.
Experiments
The General Language Understanding Evaluation [GLUE] 는 다양한 자연어 이해 task로, pre-trained 된 모델에 input과 output, 그리고 약간의 레이어 변경 만으로 모든 테스크에서 SOTA를 달성했다.
The Stanford Question Answering Dataset [SQuAD v1.1] 은 100k개의 question/answer 쌍으로, 질문에 대해 위키피디아 글 내부에 있는 적절한 answer를 예측하는 문제였다. input으로 question, passage (위키 피디아에 있는 글 부분)을 압축된 시퀀스로 전달하고, Start vector 와 End Vector를 fine-tuning 과정에서 추가하였다. 단어 i가 답안의 시작이 될 확률은 Ti 와 S(Start Vector)의 내적과 모든 paragraph에 대한 Softmax 연산을 구하는 방법으로 구해졌다.
이 역시 TriviaQA 라는 데이터에 먼저 fine-tuning 하는 방법으로 SOTA를 달성했다.
이 외에도 SQuAD v 2.0, SWAG 등에서도 좋은 성과를 보여주었다.
논문에서는 fine-tuning 방식으로만 result를 냈지만, 앞서 언급된 feature 기반 접근법에서도 BERT가 뛰어난 성능을 보여주었다고 한다.
'데이터 과학 스터디 > 논문 리뷰' 카테고리의 다른 글
[Forecasting at Scale] Facebook 시계열 패키지 prophet 논문 리뷰 (1) | 2023.05.04 |
---|---|
[NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE] Attention 논문 리뷰 (0) | 2023.02.16 |
[Word2Vec] CBOW, Skip-gram 논문 리뷰 (0) | 2023.01.31 |
[Transformer: Attention Is All You Need] 논문리뷰 (0) | 2022.11.09 |
[Generative Adversarial Nets] 논문 리뷰 (1) | 2022.09.28 |