BERT | Pre-training of Deep Bidirectional Transformers for Language Understanding
22 Nov 2019 | NLP
BERT는 2018년 10월에 SQuAD에서 기존의 앙상블 모델들의 기록들을 앞지르며 등장한 언어 모델로, Human Performance를 능가하여 큰 관심을 받은 모델이다. 그리고 pre-trained된 BERT모델에 classification layer만 추가하면 다양한 자연어처리 과제를 수행할 수 있어 데이터셋 환경이 좋은 영어권에서는 11개의 NLP task에 대해 SotA(State of the Art)를 달성하였다.
BERT는 Bi-directional Encoder Representations form Transformers의 약자로, 이름 그대로 이전 게시물에서 소개한 Transformer모델의 encoder부분만 사용한 모델이다. Transformer에 대한 자세한 설명은 이전 게시물에 있기 때문에 해당 게시물에서는 Transformer설명과 중첩되는 부분은 생략하고 지나가겠다.

BERT의 학습은 pre-training step과 pre-trained model을 가지고 fine-tuning을 하는 step으로 나뉜다.

첫 번째 학습 과정인 pre-training step에서는 semi-supervised방식으로 학습이 진행된다. 해당step에서는 unlabeled data인 BooksCorpus나 Wikipedia등의 대형 corpus를 이용하여 masking된 단어와 다음 문장을 예측하는 모델을 동시에 학습한다. 이렇게 특정 목적 없이 학습이 이루어지는 것을 Pre-training이라고 부른다. 보통 pre-training task는 보편적으로 $x_1$, $x_2$,…,$x_{i-1}$을 통해 $x_i$를 예측하는 language model을 학습한다. 하지만 BERT는 pre-training task로 language model이 아닌 masked language model을 학습한다. 이러한 특별한 pre-training을 위해 BERT의 input부터 다른 기존의 모델들과 차이를 보인다. 이는 이후 더 자세히 설명하도록 하겠다.
그리고 fine-tuning step에서는 supervised training방식으로 학습이 진행된다. 해당 step에서는 pre-trained model parameter를 사용하여 다른 down-stream task를 수행한다.

Architecture of BERT
모델의 전체 구조는 Transformer의 Encoder부분과 동일하다. Transformer encoder block에 대한 설명은 이전 게시물에 자세히 서술되어 있다.

Illustrated by the author
BERT에서는 위와 같은 transformer encoder layer를 N개(BERT-base는 12개, BERT-large는 24개) 사용한다. encoder layer를 여러 개 사용함으로써 단어들 간의 복잡한 관계를 더 잘 포착할 수 있는 결과를 얻을 수 있다. 여기에서 중요한 점은 각 layer들은 weight를 공유하지 않는다는 것이다.
Encoder layer가 더 많아짐에 따라 encoder내부에 존재하는 attention head와 $d_{model}$에도 변화가 생긴다. 기존 Transformer 논문에서는 6개의 encoder layer를 사용하였고, 모델 내부에 흐르는 벡터의 크기($d_{model}$)은 512였으며 attention head는 8이었지만 BERT-base와 BERT-large의 attenetion layer는 각각 12개와 16개고, $d_{model}$은 각각 768과 1024이다.
- $\text{BERT}_\text{BASE}$: $(L=12, H=768, A=12, \text{Total Parameters} = 110M)$
- $\text{BERT}_\text{LARGE}$: $(L=24, H=1024, A=16, \text{Total Parameters} = 340M)$
Layer들 간의 흐름은 다음 그림과 같이 이전 layer의 output이 다음 layer의 input으로 들어가는 구조를 가진다:

Illustrated by the author
Input과 Output의 크기는 Transformer와 마찬가지로 같은 크기를 지니며 모델 내부적으로도 항상 같은 크기의 벡터가 흐른다.
Input embeddings

BERT는 Transformer모델과 상이한 embedding과정을 지닌다. Embedding과정에 대한 전체적인 흐름은 다음과 같다:
1.Token embeddings
input으로 두개의 sentence를 받아서 이를 token단위로 잘라서 각 token들로 token sequence를 만든다. 학습 데이터를 만들 때 앞문장과 뒷문장의 조합은 학습 corpus 내에서 원래 연속적으로 존재하던 두 문장일 수도 있고 아니면 완전히 다른 곳에서 random하게 가져온 문장일 수 있다. 이 확률은 50:50이다.
tokenizing 방법으로는 word-piece tokenizing 방식을 사용한다. 이제 input으로 받은 두개의 sentence를 붙여서 사용하는데 첫 번째 문장의 앞에는 special classification token[CLS] (Classification)를, 그리고 각 문장의 끝에는 special token[SEP] (Separate)을 붙인다. 그리고 위와 같은 과정을 거쳐 준비된 input을 token embedding matrix와 내적하여 해당 input에 대한 token embedding값을 lookup한다.(special token들에 대한 embedding vector더 따로 존재하여 special token들도 함께 embedding을 한다.)
이 과정을 거치면$\text{seq_len}$ $\times$ $d_{model}$ 크기의 행렬이 만들어진다.
2.Segment embeddings
두개의 sentence가 input으로 들어왔기 때문에 두 문장을 구분해주기 위해 첫 번째 문장에 대해서는 $E_A$를, 두 번째 문장에 대해서는 $E_B$라는 segment embeddings를 lookup한다.
3.Position Embeddings
그리고 token들의 순서 정보를 반영해주기 위해 position embedding을 해준다.
이렇게 총3단계의 embedding과정을 거친 input이 transformer의 encoder부분과 같은 구조를 가진 모델에 들어가게 된다.
Pre-training
앞서 BERT는 pre-train을 위한 semi-supervised step과 특정 task 수행을 위한 supervised step으로 나뉘어 진행되는 것을 언급한 바 있다.
Pre-training의 목적은 학습된 모델이 다른 특정 task들을 수행할 때 이미 학습된 모델을 사용함으로써 모델의성능을 높이는 것이다. 따라서 pre-trained된 모델은 다른 과제 수행 시 성능 향상에 도움이 될 만한 과제를 학습하는 것이 좋다.
BERT에서는 pre-training task로 masking된 단어를 예측하는 과제와 다음 문장을 예측하는 과제를 동시에 수행한다.
Task1 : Masked Language Model(MLM)
Bi-directional Encoder Representations form Transformers(BERT)의 이름에서도 알 수 있듯이 BERT는 bidirectional self-attention 연산을 수행한다. 이러한 bidirectionality가 BERT의 핵심이라고 볼 수 있다. 하지만 양방향 연산 시 앞,뒤 단어를 간접적으로 참고할 수 있다. 따라서 양방향 학습을 위해 문장을 그대로 입력하지 않고 입력 token의 15%에 대해 [MASK]token을 부여하여 masking처리를 해준다. 하지만 pre-train과정에서는 [MASK]token이 사용되지만 fine-tuning과정에서는 사용되지 않아 bias가 생긴다. 이러한 이유로 masking방법에 작은 변화를 주는데 예를 들어 “hairy”라는 단어가 masking처리될 단어로 선택되었다면, 전체 corpus에 존재하는 “hairy”라는 단어들 중 80%는 [MASK]token으로 대체하고 10%는 임의로 선정된 다른 단어로 해당 단어를 대체한다. 그리고 남은 10%에 대해서는 그대로 해당 단어를 입력한다.
- 80% : “My dog is [MASK]”
- 10% : “My dog is apple”
- 10% : “My dog is hairy”

Task2 : Next Sentence Prediction
인간의 언어에서 앞뒤 문장의 상관관계는 전체 맥락의 이해에 큰 영향을 미친다. 따라서 모델이 연속된 두 문장의 상관관계를 파악할 수 있도록 task2를 이전에 소개한 task1과 함께 동시에 수행한다. 이전에 두개의 문장으로 이루어진 학습데이터 생성 시 50%는 corpus내에 실제 연속적으로 존재하는 문장들로 이루어져 있고 50%는 corpus내에서 임의로 선정된 두 문장을 붙여서 만든다는 것을 언급했었다. 이에 대한 정보는 [CLS]token에 “IsNExt”인지 “NotNext”인지 labeling되어 있다.


Pre-training procedure
- Training options
본 논문에서 학습 시 사용한 corpus와 설정한 hyperparameter들은 다음과 같다:
Corpus : BooksCorpus(800M words) + English Wikipedia(2500M words)
Tokens : 37000WordPiece tokens
Train batch size : 256 sequences (256sequences *512tokens = 128000 tokens/batch)
Steps :1M
Epoch : 40epochs
Adam learning rate : 1e-4
Weight decay : 0.01
Drop out probability : 0.1
Activation function : GELU
- Environmental setup
Bert base : 4Cloud TPU(16TPU chips total)
Bert large : 16Cloud TPU(64 TPU chips total) ≈72 P100 GPU
Training time : 4days
Fine-tuning
pre-trained 모델에 classification layer를 추가하여 fine-tuning을 통해 특정 task를 수행한다. 이렇게 학습된 BERT의 parameter는 똑같이 사용고 task에 맞는 output layer만 추가하면 다양한 task를 하나의 모델을 통해 수행할 수 있다.이것이 BERT가 대부분의 NLP task에 대해 SotA를 달성 할 수 있었던 핵심으로 생각된다. fine-tuning시에는 input으로 목적에 맞는 labeled dataset을 사용해 fine-tuning하여 최종 모델을 만든다. 해당 논문에서 실험한 fine-tuning task들은 아래 그림에서 확인할 수 있다:

- Task(a)
Task(a)는 두 문장간의 상관관계를 파악하는 과제이다. 예를 들어 앞 문장과 뒷 문장의 흐름이 자연스러운지, 두 문장의 의미가 유사한지를 파악하는 것이다.
해당 task에 사용되는 dataset은 SWAG(The Situations With Adversarial Generations)와 GLUE dataset에 속하는 MNLI(Multi-Genre Natural Language Inference), QQP(Quora Question Pairs), QNLI(Question Natural Language Inference), STS-B(The Semantic Textual Similarity Benchmark), MRPC(Microsoft Research Paraphrase Corpus), RET(Recognizing Textual Entailment)이다.
SWAG : 현재 문장 다음에 이어질 자연스러운 문장을 선택하기 위한 dataset
MNLI : 현재 문장 다음에 이어지는 문장이 문맥상 이어지는 문장인지, 반대되는 문장인지, 상관 없는 문장인지 분류하기 위한 dataset
QQP : 두 질문이 의미상 같은지 다른지 분류하기 위한 dataset
QNLI : 질의응답 dataset
STS-B : 두 문장의 유사성을 파악하기 위한 dataset
MRPC : 뉴스의 내용과 사람이 만든 문장이 의미상 같은 문장인지 비교를 위한 dataset
RET : MNLI와 유사하나 상대적으로 훨씬 적은 학습 dataset
- Taks(b)
Taks(b)는 input으로 하나의 문장을 입력하고 분류하는 것이다. 예를 들어 영화 리뷰 데이터를 입력한 후 해당 문장이 긍정인지 부정인지 혹은 중립인지를 판별하는 것이다.
해당 Task에 사용되는 dataset은 GLUE dataset에 속하는 SST-2(The Stanford Sentiment Treebank)와 CoLA(The Corpus of Linguistic Acceptability)이다.
SST-2 : 영화 리뷰 문장에 관한 감정분석을 위한 데이터셋
CoLA : 문법적으로 맞는 문장인지 틀린 문장인지 분류를 위한 데이터셋
Task(a), (b)같은 경우에는 sentence classification으로, 출력 부분을 보면 “Class Label”이 있는 것을 볼 수 있다. 이는 [CLS]token에 대한 마지막 hidden state 값(모델의 출력값)을 뜻한다. 따라서 classification task같은 경우에는 classification해야하는 label의 수(K)를 설정하고 [CLS]의 output vector($C\in{R}^{H}$)를 사용하여 모델에 classification layer($W\in{R}^{K\times H}$)만 추가하면 되기 때문에 비교적 간단한 task에 속한다.
Fine-tuning과정에서 matrix W와 다른 parameter들은 모델과 함께 학습된다.
해당 task에서는 Batch size : 32, Epoch : 3epoch로 실험을 진행하였다.
- Task(c)
Task(c)는 SQuAD(The Stanford Question Answering Dataset)가 대표적인 dataset이다. input으로 질문과 해당 질문에 대한 답을 포함하고 있는 paragraph가 입력된다. 질문에 대한 답은 tokenizing된 paragraph내에 존재하는 답의 index값이 출력된다. 따라서 해당 Task같은 경우 정답의 index를 출력하도록 학습이 진행된다.
SQuAD : 질의 응답 데이터셋
- Task(d)
Task(d)는 각 token들에 대한 정보를 출력한다. 즉 “아이폰11은 크고 무겁지만 이뻐서 참는다”라는 문장을 입력하면 해당 문장은 tokenizing과정을 거치는데 tokenizing된 문장의 각 token들에 대한 정보를 출력한다. 예를 들어 bio tag를 할 수 있다.
해당 Task에 사용되는 dataset은 CoNLL-2003 Named Entity Recognition (NER)이다.
CoNLL-2003 Named Entity Recognition (NER) : 개체명 분류 데이터셋
Fine-tuning에서 사용되는 모델의 hyperparameter들은 batch size, learning rate 그리고 training epoch를 제외한 나머지는 pre-training에서 사용된 것과 대부분 동일하지만 fine-tuning과정에서는 특정 task를 수행하기 때문에 해당 task에 맞는 최적의 hyperparameter는 task에 따라 상이하다.
Reference
Jacob Devlin et al.”BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,” Google AI Language. Oct 2018.
https://medium.com/dissecting-bert/dissecting-bert-part2-335ff2ed9c73
http://jalammar.github.io/illustrated-bert/
https://github.com/google-research/bert
BERT는 2018년 10월에 SQuAD에서 기존의 앙상블 모델들의 기록들을 앞지르며 등장한 언어 모델로, Human Performance를 능가하여 큰 관심을 받은 모델이다. 그리고 pre-trained된 BERT모델에 classification layer만 추가하면 다양한 자연어처리 과제를 수행할 수 있어 데이터셋 환경이 좋은 영어권에서는 11개의 NLP task에 대해 SotA(State of the Art)를 달성하였다.
BERT는 Bi-directional Encoder Representations form Transformers의 약자로, 이름 그대로 이전 게시물에서 소개한 Transformer모델의 encoder부분만 사용한 모델이다. Transformer에 대한 자세한 설명은 이전 게시물에 있기 때문에 해당 게시물에서는 Transformer설명과 중첩되는 부분은 생략하고 지나가겠다.

BERT의 학습은 pre-training step과 pre-trained model을 가지고 fine-tuning을 하는 step으로 나뉜다.

첫 번째 학습 과정인 pre-training step에서는 semi-supervised방식으로 학습이 진행된다. 해당step에서는 unlabeled data인 BooksCorpus나 Wikipedia등의 대형 corpus를 이용하여 masking된 단어와 다음 문장을 예측하는 모델을 동시에 학습한다. 이렇게 특정 목적 없이 학습이 이루어지는 것을 Pre-training이라고 부른다. 보통 pre-training task는 보편적으로 $x_1$, $x_2$,…,$x_{i-1}$을 통해 $x_i$를 예측하는 language model을 학습한다. 하지만 BERT는 pre-training task로 language model이 아닌 masked language model을 학습한다. 이러한 특별한 pre-training을 위해 BERT의 input부터 다른 기존의 모델들과 차이를 보인다. 이는 이후 더 자세히 설명하도록 하겠다.
그리고 fine-tuning step에서는 supervised training방식으로 학습이 진행된다. 해당 step에서는 pre-trained model parameter를 사용하여 다른 down-stream task를 수행한다.

Architecture of BERT
모델의 전체 구조는 Transformer의 Encoder부분과 동일하다. Transformer encoder block에 대한 설명은 이전 게시물에 자세히 서술되어 있다.

BERT에서는 위와 같은 transformer encoder layer를 N개(BERT-base는 12개, BERT-large는 24개) 사용한다. encoder layer를 여러 개 사용함으로써 단어들 간의 복잡한 관계를 더 잘 포착할 수 있는 결과를 얻을 수 있다. 여기에서 중요한 점은 각 layer들은 weight를 공유하지 않는다는 것이다.
Encoder layer가 더 많아짐에 따라 encoder내부에 존재하는 attention head와 $d_{model}$에도 변화가 생긴다. 기존 Transformer 논문에서는 6개의 encoder layer를 사용하였고, 모델 내부에 흐르는 벡터의 크기($d_{model}$)은 512였으며 attention head는 8이었지만 BERT-base와 BERT-large의 attenetion layer는 각각 12개와 16개고, $d_{model}$은 각각 768과 1024이다.
- $\text{BERT}_\text{BASE}$: $(L=12, H=768, A=12, \text{Total Parameters} = 110M)$
- $\text{BERT}_\text{LARGE}$: $(L=24, H=1024, A=16, \text{Total Parameters} = 340M)$
Layer들 간의 흐름은 다음 그림과 같이 이전 layer의 output이 다음 layer의 input으로 들어가는 구조를 가진다:

Input과 Output의 크기는 Transformer와 마찬가지로 같은 크기를 지니며 모델 내부적으로도 항상 같은 크기의 벡터가 흐른다.
Input embeddings

BERT는 Transformer모델과 상이한 embedding과정을 지닌다. Embedding과정에 대한 전체적인 흐름은 다음과 같다:
1.Token embeddings
input으로 두개의 sentence를 받아서 이를 token단위로 잘라서 각 token들로 token sequence를 만든다. 학습 데이터를 만들 때 앞문장과 뒷문장의 조합은 학습 corpus 내에서 원래 연속적으로 존재하던 두 문장일 수도 있고 아니면 완전히 다른 곳에서 random하게 가져온 문장일 수 있다. 이 확률은 50:50이다.
tokenizing 방법으로는 word-piece tokenizing 방식을 사용한다. 이제 input으로 받은 두개의 sentence를 붙여서 사용하는데 첫 번째 문장의 앞에는 special classification token[CLS] (Classification)를, 그리고 각 문장의 끝에는 special token[SEP] (Separate)을 붙인다. 그리고 위와 같은 과정을 거쳐 준비된 input을 token embedding matrix와 내적하여 해당 input에 대한 token embedding값을 lookup한다.(special token들에 대한 embedding vector더 따로 존재하여 special token들도 함께 embedding을 한다.)
이 과정을 거치면$\text{seq_len}$ $\times$ $d_{model}$ 크기의 행렬이 만들어진다.
2.Segment embeddings
두개의 sentence가 input으로 들어왔기 때문에 두 문장을 구분해주기 위해 첫 번째 문장에 대해서는 $E_A$를, 두 번째 문장에 대해서는 $E_B$라는 segment embeddings를 lookup한다.
3.Position Embeddings
그리고 token들의 순서 정보를 반영해주기 위해 position embedding을 해준다.
이렇게 총3단계의 embedding과정을 거친 input이 transformer의 encoder부분과 같은 구조를 가진 모델에 들어가게 된다.
Pre-training
앞서 BERT는 pre-train을 위한 semi-supervised step과 특정 task 수행을 위한 supervised step으로 나뉘어 진행되는 것을 언급한 바 있다.
Pre-training의 목적은 학습된 모델이 다른 특정 task들을 수행할 때 이미 학습된 모델을 사용함으로써 모델의성능을 높이는 것이다. 따라서 pre-trained된 모델은 다른 과제 수행 시 성능 향상에 도움이 될 만한 과제를 학습하는 것이 좋다.
BERT에서는 pre-training task로 masking된 단어를 예측하는 과제와 다음 문장을 예측하는 과제를 동시에 수행한다.
Task1 : Masked Language Model(MLM)
Bi-directional Encoder Representations form Transformers(BERT)의 이름에서도 알 수 있듯이 BERT는 bidirectional self-attention 연산을 수행한다. 이러한 bidirectionality가 BERT의 핵심이라고 볼 수 있다. 하지만 양방향 연산 시 앞,뒤 단어를 간접적으로 참고할 수 있다. 따라서 양방향 학습을 위해 문장을 그대로 입력하지 않고 입력 token의 15%에 대해 [MASK]token을 부여하여 masking처리를 해준다. 하지만 pre-train과정에서는 [MASK]token이 사용되지만 fine-tuning과정에서는 사용되지 않아 bias가 생긴다. 이러한 이유로 masking방법에 작은 변화를 주는데 예를 들어 “hairy”라는 단어가 masking처리될 단어로 선택되었다면, 전체 corpus에 존재하는 “hairy”라는 단어들 중 80%는 [MASK]token으로 대체하고 10%는 임의로 선정된 다른 단어로 해당 단어를 대체한다. 그리고 남은 10%에 대해서는 그대로 해당 단어를 입력한다.
- 80% : “My dog is [MASK]”
- 10% : “My dog is apple”
- 10% : “My dog is hairy”

Task2 : Next Sentence Prediction
인간의 언어에서 앞뒤 문장의 상관관계는 전체 맥락의 이해에 큰 영향을 미친다. 따라서 모델이 연속된 두 문장의 상관관계를 파악할 수 있도록 task2를 이전에 소개한 task1과 함께 동시에 수행한다. 이전에 두개의 문장으로 이루어진 학습데이터 생성 시 50%는 corpus내에 실제 연속적으로 존재하는 문장들로 이루어져 있고 50%는 corpus내에서 임의로 선정된 두 문장을 붙여서 만든다는 것을 언급했었다. 이에 대한 정보는 [CLS]token에 “IsNExt”인지 “NotNext”인지 labeling되어 있다.

Pre-training procedure
- Training options
본 논문에서 학습 시 사용한 corpus와 설정한 hyperparameter들은 다음과 같다:
Corpus : BooksCorpus(800M words) + English Wikipedia(2500M words)
Tokens : 37000WordPiece tokens
Train batch size : 256 sequences (256sequences *512tokens = 128000 tokens/batch)
Steps :1M
Epoch : 40epochs
Adam learning rate : 1e-4
Weight decay : 0.01
Drop out probability : 0.1
Activation function : GELU
- Environmental setup
Bert base : 4Cloud TPU(16TPU chips total)
Bert large : 16Cloud TPU(64 TPU chips total) ≈72 P100 GPU
Training time : 4days
Fine-tuning
pre-trained 모델에 classification layer를 추가하여 fine-tuning을 통해 특정 task를 수행한다. 이렇게 학습된 BERT의 parameter는 똑같이 사용고 task에 맞는 output layer만 추가하면 다양한 task를 하나의 모델을 통해 수행할 수 있다.이것이 BERT가 대부분의 NLP task에 대해 SotA를 달성 할 수 있었던 핵심으로 생각된다. fine-tuning시에는 input으로 목적에 맞는 labeled dataset을 사용해 fine-tuning하여 최종 모델을 만든다. 해당 논문에서 실험한 fine-tuning task들은 아래 그림에서 확인할 수 있다:

- Task(a)
Task(a)는 두 문장간의 상관관계를 파악하는 과제이다. 예를 들어 앞 문장과 뒷 문장의 흐름이 자연스러운지, 두 문장의 의미가 유사한지를 파악하는 것이다.
해당 task에 사용되는 dataset은 SWAG(The Situations With Adversarial Generations)와 GLUE dataset에 속하는 MNLI(Multi-Genre Natural Language Inference), QQP(Quora Question Pairs), QNLI(Question Natural Language Inference), STS-B(The Semantic Textual Similarity Benchmark), MRPC(Microsoft Research Paraphrase Corpus), RET(Recognizing Textual Entailment)이다.
SWAG : 현재 문장 다음에 이어질 자연스러운 문장을 선택하기 위한 dataset
MNLI : 현재 문장 다음에 이어지는 문장이 문맥상 이어지는 문장인지, 반대되는 문장인지, 상관 없는 문장인지 분류하기 위한 dataset
QQP : 두 질문이 의미상 같은지 다른지 분류하기 위한 dataset
QNLI : 질의응답 dataset
STS-B : 두 문장의 유사성을 파악하기 위한 dataset
MRPC : 뉴스의 내용과 사람이 만든 문장이 의미상 같은 문장인지 비교를 위한 dataset
RET : MNLI와 유사하나 상대적으로 훨씬 적은 학습 dataset
- Taks(b)
Taks(b)는 input으로 하나의 문장을 입력하고 분류하는 것이다. 예를 들어 영화 리뷰 데이터를 입력한 후 해당 문장이 긍정인지 부정인지 혹은 중립인지를 판별하는 것이다.
해당 Task에 사용되는 dataset은 GLUE dataset에 속하는 SST-2(The Stanford Sentiment Treebank)와 CoLA(The Corpus of Linguistic Acceptability)이다.
SST-2 : 영화 리뷰 문장에 관한 감정분석을 위한 데이터셋
CoLA : 문법적으로 맞는 문장인지 틀린 문장인지 분류를 위한 데이터셋
Task(a), (b)같은 경우에는 sentence classification으로, 출력 부분을 보면 “Class Label”이 있는 것을 볼 수 있다. 이는 [CLS]token에 대한 마지막 hidden state 값(모델의 출력값)을 뜻한다. 따라서 classification task같은 경우에는 classification해야하는 label의 수(K)를 설정하고 [CLS]의 output vector($C\in{R}^{H}$)를 사용하여 모델에 classification layer($W\in{R}^{K\times H}$)만 추가하면 되기 때문에 비교적 간단한 task에 속한다.
Fine-tuning과정에서 matrix W와 다른 parameter들은 모델과 함께 학습된다.
해당 task에서는 Batch size : 32, Epoch : 3epoch로 실험을 진행하였다.
- Task(c)
Task(c)는 SQuAD(The Stanford Question Answering Dataset)가 대표적인 dataset이다. input으로 질문과 해당 질문에 대한 답을 포함하고 있는 paragraph가 입력된다. 질문에 대한 답은 tokenizing된 paragraph내에 존재하는 답의 index값이 출력된다. 따라서 해당 Task같은 경우 정답의 index를 출력하도록 학습이 진행된다.
SQuAD : 질의 응답 데이터셋
- Task(d)
Task(d)는 각 token들에 대한 정보를 출력한다. 즉 “아이폰11은 크고 무겁지만 이뻐서 참는다”라는 문장을 입력하면 해당 문장은 tokenizing과정을 거치는데 tokenizing된 문장의 각 token들에 대한 정보를 출력한다. 예를 들어 bio tag를 할 수 있다.
해당 Task에 사용되는 dataset은 CoNLL-2003 Named Entity Recognition (NER)이다.
CoNLL-2003 Named Entity Recognition (NER) : 개체명 분류 데이터셋
Fine-tuning에서 사용되는 모델의 hyperparameter들은 batch size, learning rate 그리고 training epoch를 제외한 나머지는 pre-training에서 사용된 것과 대부분 동일하지만 fine-tuning과정에서는 특정 task를 수행하기 때문에 해당 task에 맞는 최적의 hyperparameter는 task에 따라 상이하다.
Reference
Jacob Devlin et al.”BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,” Google AI Language. Oct 2018.
https://medium.com/dissecting-bert/dissecting-bert-part2-335ff2ed9c73
http://jalammar.github.io/illustrated-bert/
https://github.com/google-research/bert