개요
1. Transformer의 등장 그 이후
2. Unidirectional model의 한계와 pre-training 모델
3. BERT의 등장
4. BERT의 동작 과정
5. Pre-training BERT
6. 마무리
Transformer 등장 그 이후
Transformer라는 모델이 등장하고 나서 자연어 처리는 눈에 띄는 성능 향상을 이끌어낼 수 있었다.
기존의 Seq2seq with attention 모델의 RNN 구조를 완전히 제거한 것이 좋은 효과를 보였던 것이다.
더불어, seq2seq with attention 모델과는 달리 encoder와 decoder에 self-attention을 적용해줌으로써 더 좋은 성능을 보일 수 있게 됐다.
그렇게 Transformer를 기반으로 한, transformer에 살을 붙인 여러 가지 모델들이 등장했다.
그리고 자연어 처리 분야에서 pre-trained 모델이 더 좋은 성능을 보인다는 실험들이 나타나자 그쪽으로 focus가 쏠리기 시작했다.
pre-training 모델을 사용한다는 것은,
unlabeled data로 pre-training 모델을 활용하여 질 좋은 language representation을 얻은 다음,
그 representation을 활용해서 label이 있는 본 task에 적용을 하면 성능이 좋다는 것이었다.
pre-training 모델로는 대표적으로 GPT-1과 ELMo가 있었다.
그리고 language representation을 활용하는 기법으로는 2가지가 있었다.
- Feature-based approach
- Fine-tuning approach
Feature-based approach
특정 taks를 수행하는 network에 pre-trained language representation을 추가적인 feature로 제공하는 방법이다.
즉, 2개의 network를 붙여서 사용하는 것이다.
Fine-tuning approach
task-specific하게 하는 parameters는 줄이고, pre-trained한 parameters를 downstream task에 적용하여 학습을 통해
parameters를 조정해주는 기법이다.
Unidirectional model의 한계와 pre-training 모델
이렇게 2개의 대표적인 pre-training 모델이 존재했고, 좋은 성능을 보여주었으나 역시 이 모델들 또한 한계가 존재했다.
그것은 바로 ELMo와 GPT-1 모두 unidirectional model이라는 것이었다.
그리고 BERT가 등장하기 전까지는 모두 shallow bi-directional 하며, unidirectional model이었다는 점이 한계점이었다.
온전하게 Bi-directional 하지 못하다는 점은 어떤 것이 문제인 걸까.
그것은 바로, bi-directional은 sequence의 앞뒤를 모두 바라볼 수 있기 때문에 문맥 파악에 더 도움을 주기 마련이며
이는 더 질 좋은 language representation을 얻게 해준다.
하지만 이런 점을 ELMo와 GPT-1은 이끌어낼 수 없었기에 이 2개의 model은 한계가 존재했던 것이었다.
그런데 왜 ELMo는 shallow bi-directional 할 수밖에 없었고,
BERT와 구조가 상당히 유사한 GPT-1은 왜 unidirectional 할 수밖에 없었을까?
ELMo
ELMo의 pre-training을 위한 task는 Language model이었다.
그러므로 무조건 unidirectional한 문맥 파악만 수행할 수가 있었다.
그래서 ELMo는 이러한 한계에서 벗어나고자, bi-LSTM 구조를 적용했다.
그래서 한 쪽에서는 forward로 진행했고, 한 쪽에서는 backward로 진행을 해서 그 둘을 concat하는 방식으로 구조를 설계했다.
이렇게 bi-directional 하게끔 노력했지만, 결국 deep bi-directional representation을 얻지는 못했다.
GPT-1
GPT-1의 pre-training을 위한 task도 마찬가지로 language model이었다.
그렇기에 unidirectional 할 수밖에 없었다.
더군다나, GPT-1은 transformer의 decoder를 쌓은 구조였기에, previously generated words만 참고할 수가 있었다.
그래서 결국 GPT-1은 bi-directional representation을 얻는 것이 불가능했다.
BERT의 등장
BERT는 ELMo와 GPT-1이 가지고 있었던 unidirectional이라는 단점을 보완했다.
그리고 GPT-1과 같이 fine-tuning approach 방식을 적용한 pre-training 모델이다.
결국 BERT는 feature-based의 과정처럼 특정 task에 network를 새로 붙여줄 필요도 없었다.
fine-tuning 모델답게 BERT 모델 자체의 fine-tuning을 통해 task에 대한 놀라운 성능을 보여주었다.
BERT가 pre-training 모델이 됨으로써 어떻게 다양한 task에서
놀라운 성능을 보여줄 수 있었는지 동작 과정을 함께 살펴보면서 이해해보자.
* 논문 상으로 BERT는 BERT-Base, BERT-Large로 총 2가지가 있음을 알고 가자.
BERT-Base: 12 layers, 768 dim, 12 heads
BERT-Large: 24 layers, 1024 dim, 16 heads
(순서대로, transformer의 encoder의 수, hidden state의 차원, attention head의 개수)
BERT의 동작 과정
BERT의 구조를 high-level에서 바라봤을 때의 모습이다.
눈으로 확인할 수 있듯이, BERT는 input이 들어가게 되면 3개의 embedding을 거쳐서 모델 안으로 들어가게 된다.
그 3개의 embedding은 아래와 같다.
1. Wordpiece embedding
2. Position embedding
3. Segment embedding
그리고 12층으로 쌓인 transformer의 encoder를 지나게 된다.(BERT-Base 기준)
더불어, BERT의 pre-training task인 MLM과 NSP를 거치면 BERT의 Pre-training이 완료된다!
Wordpiece embedding
우선 BERT에 sequence를 input하면 만나게 되는 첫 번째 embedding은 Wordpiece embedding이다.
BERT의 tokenizer로 사용되는 wordpiece는 아래와 같이 작동한다.
그리고 embedding layer는 ELMo와 GPT-1에서와 같이, 문맥을 반영한 contextual embedding을 한다.
아래와 같은 모습으로 embedding이 된다고 보면 된다.
사진에서 볼 수 있는 [CLS] token은 BERT가 제안하는 special token이며, 역할은 classification 역할을 맡는다.
즉, BERT가 분류 문제를 풀 수 있도록 하기 위해서 존재하는 token이라는 것이다.
그래서 BERT의 input sequence의 맨 앞에는 항상 [CLS] token이 붙는다는 것을 기억하자.
이 wordpiece embedding이 실질적인 입력이 되는 word embedding이 된다.
여기서 만든 word embedding vector에 나머지 2개의 embedding vector가 더해질 것이기 때문이다.
Position embedding
이는 transformer에서 봤던 position encoding의 역할과 비슷하다.
즉, 위치 정보를 학습시켜주기 위해 존재하는 embedding이다.
transformer에서의 position encoding은 sin, cos 곡선을 이용하여 값을 매겨주는
일종의 feature engineering 과정이 필요했다.
하지만, BERT는 다르다.
BERT는 sin, cos 곡선을 활용하지 않고 모델이 학습하는 방식으로 진행된다.
1 ~ 512까지의 token이 존재하여, 학습을 하면서 그 token들을 활용한다.
즉, 진행 방식은 아래와 같다.
I, am, a, student라는 sequence라면 4개의 embedding vector가 존재할 것이다.
그러면 그 embedding의 개수에 맞게 position embedding vector가 존재해서, 기존의 embedding vector에 더해지는 것이다.
embedding vector(I) + position embedding vector(0)
embedding vector(am) + position embedding vector(1)
embedding vector(a) + position embedding vector(2)
embedding vector(student) + position embedding vector(3)
이로 인해 사용자가 편리해졌지만, input sequence의 길이가 512까지만 가능해졌다는 점은 단점이라고 할 수 있다.
Segment embedding
transformer에서와는 달리, BERT에는 segment embedding이라는 것이 존재한다.
이는 BERT가 2종류의 sequence 혹은 2개의 문서를 packed해서 single sequnce로서 모델에 집어넣을 수 있기 때문이다.
즉, segment embedding은 문장 A, 문장 B를 모델이 구분할 수 있도록 학습시켜주는 역할을 한다.
그 방식은 positional embedding에서 진행됐던 것과 비슷하다.
sentence 0 embedding vector와 sentence 1 embedding vector가 존재해서
그것이 기존의 embedding vector에 더해지는 것이다.
이 또한, 사용자가 손 댈 것 없이 학습으로 알아서 이루어진다.
하지만 넣어줘야 하는 필요한 token이 있는데, 그것이 바로 [SEP] token이다.
seperator를 의미하는 이 token은 말 그대로 다른 성격의 문장을 seperate 해주는 역할을 한다.
만약, SQuAD task라고 하면, Paragraph와 question text 맨 뒤에 [SEP] token을 붙여주고
Answer text 맨 뒤에 [SEP] token을 붙여주면 되는 것이다.
위는 3개의 embedding이 모두 더해지는 과정이다.
* 만약, 문장이 1개만 들어왔다면 sentence 0 embedding vector만 사용된다는 것을 기억하자.
Transformer encoders
이렇게 3개의 embedding vectors가 합쳐지면 transformer의 encoders가 쌓여있는 곳으로 들어가게 된다.
encoder의 self-attention이 이루어지기 때문에 문맥 정보가 잘 파악된 language representation을 얻을 수 있는 가능성이 있다.
Pre-training BERT
위에서 알아본 구조를 바탕으로 BERT의 핵심인 pre-training 과정을 알아보자.
BERT의 pre-training task는 2개가 존재한다.
1. Masked Language Modeling
2. Next Sentence Prediction
동시에 일어나는 이 두 가지 task에 대해 알아보자.
Masked Language Modeling(MLM)
이 task의 목적은 bi-directional을 이용하여 문맥을 파악한 Deep bi-directional representation을 얻기 위함이다.
ELMo와 GPT-1은 Left-to-right or Right-to-left LM만 가능했으나,
BERT는 transformer의 encoder를 이용했기 때문에, sequence의 앞뒤를 볼 수 있다는 특징을 활용할 수 있었다.
즉, encoder의 self-attention도 이용하고 앞뒤의 문맥을 파악할 수 있는 bi-directioinal한 특징을 이용할 수 있었던 것이다.
그래서 MLM은 LM과 무엇이 다른가?
LM과 비슷하게 word를 예측하는 것이다. 하지만 masking을 활용한다.
* LM은 모든 sequence를 가려놓고 word를 예측시킨다.
하지만 MLM은 실험적인 percentage인 15%의 words만 masking을 해서 그 maksed된 words만 대상으로 예측을 한다.
이때, 이 [MASK] token은 pre-training 단계에서만 나타날 뿐, fine-tuning 단계에서는 나타나지 않기 때문에
pre-training 단계에서와 fine-tuning 단계의 input data distribution상의 불일치 문제가 발생하게 된다.
따라서 이를 해소하기 위해, BERT는 모든 masking 단어를 [MASK] token으로 가리지는 않는다.
15% 중 80%의 단어를 [MASK] token으로 masking을 하고,
15% 중 10%의 단어를 다른 단어로 바꿔버리고,
15% 중 10%의 단어는 바꾸지 않고 그대로 둔 상태로 예측을 시킨다.
Masking을 한 단어 위에는, classifier가 붙어서 예측에 성공했는지 실패했는지 판단한다.
실제로는 모든 단어 위에 classifier가 붙어있으나, 다른 위치에서의 classifier의 결과는 무시한다.
이러한 pre-training은 BERT가 deep bi-directional representation을 얻는 것을 도왔다.
Next Sentence Prediction(NSP)
BERT는 2개의 문장이 이어지는 문장인지, 관련이 없는 문장인지 판단하는 pre-training인 NSP를 거친다.
이 task를 진행하는 목적은, QA와 같이 두 문장의 관계를 이해하는 능력을 기르기 위함이다.
50:50 비율로, 정말로 이어지는 문장 조합과 관계가 없는 문장 조합을 BERT에게 준다.
그래서 만일 이어지는 문장이라면 IsNexT가 반환되고
이어지지 않는, 맥락이 없는 문장이라고 판단하면 NotNext가 반환되는 식이다.
그러한 classification은 CLS token의 바로 위에 classifier를 달아 확인할 수 있다.
마무리
오늘 이렇게 BERT의 흐름과 BERT라는 pre-training 모델이 어떻게 pre-training을 하는지 알아보았다.
사실 BERT의 framework는 pre-training과 fine-tuning으로 나뉜다.
다음에는 fine-tuning을 어떻게 적용하는지 알아보도록 하자.
reference
'자연어 처리 과정' 카테고리의 다른 글
pytorch의 manual_seed (0) | 2023.01.13 |
---|---|
What's the role of "pooler" in BERT? (0) | 2023.01.11 |
Transformer - overview (1) | 2023.01.06 |
What's the meaning of "Shifted right" in Transformer? (0) | 2023.01.05 |
RNN with attention(seq2seq with attention) (0) | 2023.01.04 |