기계학습에서의 inductive bias는, 학습 모델이 지금까지 만나보지 못했던 상황에서 정확한 예측을 하기 위해 사용하는 추가적인 가정을 의미합니다. (Wikipedia)
기계학습에서는 특정 목표 출력(target output)을 예측하기 위해 학습 가능한 알고리즘 구축을 목표로 하고, 학습 모델에는 제한된 수의 입력과 출력에 대한 data가 주어집니다.
학습이 성공적으로 끝난 후에, 학습 모델은 훈련동안에는 보이지 않았던 예들 까지도 정확한 출력에 가까워지도록 추측해야합니다. 이럴 때 추가적인 가정이 없이는 불가능한데, 이 Target function의 성질에 대해 필요한 가정과 같은 것이 Inductive bias라고 볼 수 있습니다.
가장 고전적이고 대표적인 예가 Occam’s Razor, 오컴의 면도날입니다. 이는 target function에 대해 가장 단순한 무모순의 가설이 실제로 가장 좋을 것이라고 가정합니다.
BERT: Pre-trainig of Deep Bidirectional Transformers for Language Understanding
최근에 NLP 연구분야에서 핫한 모델인 BERT 논문을 읽고 정리하는 포스트입니다.
구성은 논문을 쭉 읽어나가며 정리한 포스트기 때문에 논문과 같은 순서로 정리하였습니다.
Tmax Data AI 연구소에서 제가 진행한 세미나 동영상도 첨부합니다.
Abstract
BERT : Bidirectional Encoder Representations form Transformer
논문의 제목에서 볼 수 있듯이, 본 논문은 “Attention is all you need(Vaswani et al., 2017)”(arxiv)에서 소개한 Transformer 구조를 활용한 Language Representation에 관한 논문입니다.
Transformer에 대한 자세한 구조를 알고 싶은 분은 위 논문을 읽어보시거나, 다음 블로그 MChromiak’s blog를 참고하시면 좋을 듯 합니다.
BERT는 기본적으로, wiki나 book data와 같은 대용랑 unlabeled data로 모델을 미리 학습 시킨 후, 특정 task를 가지고 있는 labeled data로 transfer learning을 하는 모델입니다.
BERT이전에 이러한 접근 방법을 가지는 모델이 몇가지 있었습니다. 대용량 unlabeld corpus를 통해 language model을 학습하고, 이를 토대로 뒤쪽에 특정 task를 처리하는 network를 붙이는 방식(ELMo, OpenAI GPT…)
하지만 BERT 논문에서는 이전의 모델의 접근 방식은 shallow bidirectional 또는 unidirectional하므로 language representation이 부족하다고 표현하였습니다.
게다가 BERT는 특정 task를 처리하기 위해 새로운 network를 붙일 필요 없이, BERT 모델 자체의 fine-tuning을 통해 해당 task의 state-of-the-art를 달성했다고합니다.
1. Introduction
Introduction에서는 BERT와 비슷한 접근 방식을 가지고 있는 기존 model에 대한 개략적인 소개를 합니다.
Language model pre-training은 여러 NLP task의 성능을 향상시키는데에 탁월한 효과가 있다고 알려져 있습니다. (Dai and Le, 2015; Peters et al., 2018, 2018; Radford et al., 2018; …)
이러한 NLP task는 token-level task인 Named Entity Recognition(NER)에서부터 SQuAD question answering task와 같은 task까지 광범위한 부분을 커버합니다
이런 pre-trained language representation을 적용하는 방식은 크게 두가지 방식이 있습니다. 하나는 feature-based 또 다른 하나는 fine-tuning 방식입니다.
feature-based approach : 특정 task를 수행하는 network에 pre-trained language representation을 추가적인 feature로 제공. 즉, 두 개의 network를 붙여서 사용한다고 보면 됩니다. 대표적인 모델 : ELMo(Peters et al., 2018)
fine-tuning approach : task-specific한 parameter를 최대한 줄이고, pre-trained된 parameter들을 downstream task 학습을 통해 조금만 바꿔주는(fine-tuning) 방식. 대표적인 모델 : Generative Pre-trained Transformer(OpenAI GPT) (Radford et al., 2018)
앞에 소개한 ELMo, OpenAI GPT는 pre-training시에 동일한 objective funtion으로 학습을 수행합니다, 하지만 BERT는 새로운 방식으로 pre-trained Language Representation을 학습했고 이것은 매우 효과적이었습니다.
BERT의 pre-training 방법론
그림1. BERT, GPT, ELMo (출처 : BERT 논문)
BERT pre-training의 새로운 방법론은 크게 2가지로 나눌 수 있습니다. 하나는 Masked Language Model(MLM), 또 다른 하나는 next sentence prediction이다.
기존 방법론 : 앞에 소개한 ELMo, OpenAI GPT는 일반적인 language model을 사용하였습니다. 일반적인 language model이란, 앞의 n 개의 단어를 가지고 뒤의 단어를 예측하는 모델을 세우는 것입니다(n-gram). 하지만 이는 필연적으로 unidirectional할 수 밖에 없고, 이러한 단점을 극복하기 위해 ELMo에서는 Bi-LSTM으로 양방향성을 가지려고 노력하지만, 굉장히 shallow한 양방향성 (단방향 concat 단방향)만을 가질 수 밖에 없었습니다(그림1).
Masked Language Model(MLM) : MLM은 input에서 무작위하게 몇개의 token을 mask 시킵니다. 그리고 이를 Transformer 구조에 넣어서 주변 단어의 context만을 보고 mask된 단어를 예측하는 모델입니다. OpenAI GPT도 Transformer 구조를 사용하지만, 앞의 단어들만 보고 뒷 단어를 예측하는 Transformer decoder구조를 사용합니다(그림1). 이와 달리 BERT에서는 input 전체와 mask된 token을 한번에 Transformer encoder에 넣고 원래 token 값을 예측하므로(그림1) deep bidirectional 하다고 할 수 있습니다. BERT의 MLM에 대해서는 뒷장의 Pre-training Tasks에서 더 자세히 설명하겠습니다.
next sentence prediction : 이것은 간단하게, 두 문장을 pre-training시에 같이 넣어줘서 두 문장이 이어지는 문장인지 아닌지 맞추는 것입니다. pre-training시에는 50:50 비율로 실제로 이어지는 두 문장과 랜덤하게 추출된 두 문장을 넣어줘서 BERT가 맞추게 시킵니다. 이러한 task는 실제 Natural Language Inference와 같은 task를 수행할 때 도움이 됩니다.
2. Related Work
ELMo, OpenAI GPT와 같은 모델이 존재하고, 앞에서 충분히 소개하였기 때문에 생략하도록 하겠습니다. 자세한 내용에서는 BERT 논문을 참고 바랍니다.
3. BERT
BERT의 아키텍처는 Attention is all you need에서 소개된 Transformer를 사용하지만, pre-training과 fine-tuning시의 아키텍처를 조금 다르게하여 Transfer Learning을 용이하게 만드는 것이 핵심입니다.
BERT_base : L=12, H=768, A=12, Total Parameters = 110M
BERT_large : L=24, H=1024, A=16, Total Parameters = 340M
L : transformer block의 layer 수, H : hidden size, A : self-attention heads 수, feed-forward/filter size = 4H
여기서 BERT_base 모델의 경우, OpenAI GPT모델과 hyper parameter가 동일합니다. 여기서 BERT의 저자가 의도한 바는, 모델의 하이퍼 파라미터가 동일하더라도, pre-training concept를 바꾸어 주는 것만으로 훨씬 높은 성능을 낼 수 있다는 것을 보여주고자 하는 것 같습니다.
OpenAI GPT모델의 경우 그림1에서 볼 수 있듯, next token 만을 맞추어내는 기본적인 language model 방식을 사용하였고, 그를 위해 transformer decoder를 사용했습니다. 하지만 BERT는 MLM과 NSP를 위해 self-attention을 수행하는 transformer encoder구조를 사용했음을 알 수 있습니다.
그림 2에서 볼 수 있듯이, Position embedding을 사용합니다. 이는 Transformer에서 사용한 방식과 같으며, jalammer의 블로그 글을 참고하시면 position embedding 뿐만 아니라 transformer의 전체적인 구조를 이해 하실 수 있습니다.
모든 sentence의 첫번째 token은 언제나 [CLS](special classification token) 입니다. 이 [CLS] token은 transformer 전체층을 다 거치고 나면 token sequence의 결합된 의미를 가지게 되는데, 여기에 간단한 classifier를 붙이면 단일 문장, 또는 연속된 문장의 classification을 쉽게 할 수 있게 됩니다. 만약 classification task가 아니라면 이 token은 무시하면 됩니다.
Sentence pair는 합쳐져서 single sequence로 입력되게 됩니다. 각각의 Sentence는 실제로는 수 개의 sentence로 이루어져 있을 수 있습니다(eg. QA task의 경우 [Question, Paragraph]에서 Paragraph가 여러개의 문장). 그래서 두 개의 문장을 구분하기 위해, 첫째로는 [SEP] token 사용, 둘째로는 Segment embedding을 사용하여 앞의 문장에는 sentence A embedding, 뒤의 문장에는 sentence B embedding을 더해줍니다.(모두 고정된 값)
만약 문장이 하나만 들어간다면 sentence A embedding만을 사용합니다.
3.3 Pre-training Tasks
기존의 ELMO나 GPT는 left to right or right to left Language Model을 사용하여 pre-training을 하지만, BERT는 이와 다르게 2가지의 새로운 unsupervised prediction task로 pre-training을 수행합니다.
이를 통하여 LM의 left-to-right (혹은 r2l)을 통하여 문장 전체를 predict하는 방법론과는 달리, [MASK] token 만을 predict하는 pre-training task를 수행합니다.
이 [MASK] token은 pre-training에만 사용되고, fine-tuning시에는 사용되지 않습니다. 해당 token을 맞추어 내는 task를 수행하면서, BERT는 문맥을 파악하는 능력을 길러내게 됩니다.
15%의 [MASK] token을 만들어 낼 때, 몇가지 추가적인 처리를 더 해주게 됩니다. 그것은 다음과 같습니다.
80%의 경우 : token을 [MASK]로 바꿉니다. eg., my dog is hairy -> my dog is [MASK]
10%의 경우 : token을 random word로 바꾸어 줍니다. eg., my dog is hariy -> my dog is apple
10%의 경우 : token을 원래의 단어로 그대로 놔둡니다. 이는 실제 관측된 단어에 대한 표상을 bias해주기 위해 실시합니다.
pre-trained 되는 Transformer encoder의 입장에서는 어떤 단어를 predict하라고 하는건지, 혹은 random word로 바뀌었는지 알 수 없습니다. Transformer encoder는 그냥 모든 token에 대해서 distributional contextual representation을 유지하도록 강제합니다.
또한 random word로 바꾸는 것 때문에 모델의 language understanding능력에 해를 끼친다고 생각 할 수 있지만, 바뀌는 부분이 1.5%(15%의 10%)에 불과하므로, 해를 끼치지 않습니다.
또한 MLM은 보통의 LM 보다 converge하는데에 많은 training step이 필요하지만, emperical하게는 LM보다 훨씬 빠르게 좋은 성능을 냅니다. 이는 Section 5.3에서 자세히 설명하겠습니다.
이 pre-training task 수행하는 이유는, 여러 중요한 NLP task중에 QA나 Natural Language Inference(NLI)와 같이 두 문장 사이의 관계를 이해하는 것이 중요한 것들이기 때문입니다.. 이들은 language modeling에서 capture되지 않습니다.
그래서 BERT에서는 corpus에서 두 문장을 이어 붙여 이것이 원래의 corpus에서 바로 이어 붙여져 있던 문장인지를 맞추는 binarized next sentence prediction task를 수행합니다.
50% : sentence A, B가 실제 next sentence
50% : sentence A, B가 corpus에서 random으로 뽑힌(관계가 없는) 두 문장
예를 들어
Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
LABEL = IsNext
Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
pre-training이 완료되면, 이 task는 97~98%의 accuracy를 달성했습니다. 이러한 간단한 task를 부여해도, QA와 NLI에 굉장히 의미있는 성능 향상을 이루어 냈습니다. 이는 section5. Ablation Studies에서 자세히 설명이 되어있습니다.
3.4 Pre-training Procedure
pre-training의 기본적인 절차는 LM에서 수행하는 것과 같습니다.
BERT_english의 경우 BookCorpus (Zhu et al., 2015) (800M words)와 English Wikipedia (2,500M words)를 사용하였습니다. Wikipedia 데이터에서는 text passage만 추출하여 사용했다고 합니다. 이유는, long contiguous sequence만을 학습시키고 싶어서입니다.
input pre-processing
먼저, NSP를 위해 sentence를 뽑아서 embedding A, B를 먹여줍니다. 물론 50%는 진짜 next sentence, 나머지는 random sentence를 사용합니다.
Adam optimizer, learning rate : 1e-4, $\beta_1 = 0.9$, $\beta_2 = 0.999$, L2 weight decay of 0.01, learning rate warmup over the first 10,000 steps, linear decay of the learning rate
특히 인상적인 것은 데이터 크기가 작아도 fine-tuning 때는 좋은 성능을 낼 수 있다는 것입니다.
그리고 BERT_large가 BERT_base에 비해 훨씬 좋은 성능을 냅니다.(dataset이 작은 task의 경우에도!) BERT의 모델 크기에 따른 성능은 Section 5.2에서 살펴보겠습니다.
4.2 SQuAD v1.1
기존 SQuAD dataset의 경우에는 GLUE dataset을 BERT에 fine-tuning할 때와 방식이 좀 다릅니다. GLUE dataset의 경우에는 task가 sequence classification이지만, SQuAD는 질문과 지문이 주어지고, 그 중 substring인 정답을 맞추는 task입니다.
이러한 차이를 BERT는 아주 간단한 방법론으로 극복합니다.
일단 질문을 A embedding, 지문을 B embedding 으로 처리하고, 지문에서 정답이 되는 substring의 처음과 끝을 찾는 task로 문제를 치환 합니다.
start vector $S \in \mathbb{ R }^H$ 와 end vector $E \in \mathbb{ R }^H$를 fine-tuning중에 학습히여, 지문의 각 token들과 dot product하여 substring을 찾아냅니다. (그림 4 (c) 참조)
이런 접근법으로 BERT_large의 경우 기존의 모든 시스템을 wide margin을 두고 최고성능을 달성 합니다.
4.3 Named Entity Recognition
token tagging task를 평가해보기 위해서 CoNLL 2003 Named Entity Task를 fine-tuning 해보았습니다.
해당 데이터셋은 200k개의 words로 이루어져 있고, 각각의 단어들은 Person, Organization, Location, Miscellaneous, Other로 태깅되어 있습니다.
각 토큰마다 classifier를 붙여서 위의 제시된 class에 대해 판별을 합니다.
각각의 prediction은 주위의 prediction에 영향을 받지 않습니다. (CRF나 autoregressive를 사용하지 않음!)
이 task또한 SOTA를 달성합니다.
4.4 SWAG
The Situations With Adversarial Generations(SWAG) 데이터셋은 113k sentence-pair로 이루어져 있으며, grounded common-sense inference를 측정하기 위해 사용합니다.
앞 문장이 주어지고, 보기로 주어지는 4 문장중에 가장 잘 이어지는 문장을 찾는 task 입니다.
A girl is going across a set of monkey bars. She
(i) jumps up across the monkey bars.
(ii) struggles onto the bars to grab her head.
(iii) gets to the end and stands on a wooden plank.
(iv) jumps up and does a back flip.
이 데이터셋을 BERT에 적용하는 것은 GLUE dataset 적용법과 비슷합니다. 4개의 가능한 input sequences를 구성합니다. 이는 given sentence(sentence A)와 possible continuation(sentence B)을 concat한 것들입니다.
해당 task specific한 벡터 $V \in \mathbb{ R }^H$를 학습시키고, input sequences의 값들을 합산한 $C_i \in \mathbb{ R }^H$를 dot product하여 softmax 합니다.
이 또한 사람을 능가하는 SOTA를 달성합니다.
5. Ablation Studies
해당 챕터에서는 이전 챕터에서 중요한 요소라고 설명했던 부분을을 하나씩 제거하며 요소들의 중요함을 파악해 보고있습니다.
수 년동안 알려져 왔듯, 번역 task나 language modeling과 같은 large-scale task는 모델 사이즈가 클 수록 성능은 계속 상승합니다.
특히 BERT의 경우에는, downstream task를 수행하는 dataset의 크기가 작아도, pre-training덕분에, model의 크기가 클 수록 정확도는 상승함을 볼 수 있습니다.
5.3 Effect of Number of Training Steps
그림8. Ablation over number of training steps (출처: BERT 논문)
그림 8에서는 MNLI Dev accuracy를 pre-training step에 따라 정리하였습니다. 세부사항은 문답형식으로 진행하겠습니다.
Question 1. fine-tuning 단계에서 높은 정확도를 얻으려면, pre-training 단계에서 많은 training step이 필요합니까?
A : 그렇습니다. 0.5M step에 비해 1M step때 accuracy가 거의 1.0% 상승함을 볼 수 있습니다.
Question 2. 3.3.1 Task #1: Masked LM의 마지막 부분에서 시사한 바와 같이, MLM으로 학습하면 15%의 단어만 맞추는 것으로 학습을 진행하기 때문에, LTR보다 수렴속도가 훨씬 느리지않습니까?
A : 수렴속도가 조금 느린 것은 사실이지만, LTR보다 훨씬 먼저 out-perform성능이 나오게 됩니다.
5.4 Feature-based Approach with BERT
지금까지 BERT는 pre-training을 진행 한 후, downstream task를 학습 할 때, 간단한 classifier를 부착해서 모든 layer를 다시 학습시키는 fine-tuning 방법을 사용하는 것만을 설명드렷습니다.
하지만 BERT를 ELMO와 같이 feature based approach로도 사용을 할 수 있습니다.
Feature-based Approach는 몇가지 이점이 존재합니다.
Transformer encoder는 모든 NLP task를 represent하지는 못하므로, 특정 NLP task를 수행할 수 있는 Network를 부착하여 쓸 수 있습니다.
Computational benefit을 얻을 수 있습니다.
해당 section에서는 BERT를 ELMO와 같이 마지막 레이어에 Bi-LSTM을 부착시켜, 해당 레이어만 학습 시키는 방법론을 사용해보았습니다.
그림9. Ablation using BERT with a feature-based approach (출처: BERT 논문)
그림 9에서 볼 수 있듯이, Concat Last Four Hiddem값을 사용하면, Finetune All과 단지 0.3 F1 score차이밖에 나지 않습니다.
이를 통해, BERT는 Feature-based Approach에서도 효과적이라고 할 수 있겠습니다.
6. Conclusion
읽으면서 계속해서 느꼈지만, 굉장히 놀라운 논문이라고 생각합니다. 특히 MLM과 NSP task를 생각해 낸것이 굉장히 놀라웠습니다. 이러한 간단한 intuition을 가지고 NLP의 전분야를 아우르는 SOTA를 달성해 낸 것에 대해서 놀랍고, 또 부럽다는 생각을 했습니다.
rm /bin/sh && ln -s /bin/bash /bin/sh : 해당 이미지의 shell 실행파일을 bash로 강제
pip install -r alt_requirements/requiements_full.txt : rasa-nlu_full 구동에 필요한 파이썬 패키지 목록이 alt_requirements/requiements_full.txt 에 저장되어 있고, 해당 pip 명령어를 통해 설치
이후 RUN : spacy 모듈 설치를 위한 명령어들
COPY
파일을 이미지에 추가함, 뒤에 설명할 ADD와는 약간 다름
사용법 :
COPY <복사할 파일> <이미지에서 파일이 복사될 경로> : 예제에서는 . 즉 컨텍스트에 있는 모든 파일을 ${RASA_NLU_HOME}에 복사함