이전 포스팅에서는 Self-attention mechanism만을 처음으로 사용하는 Transformer 모델을 설명했다. 이번 포스팅에서는 자연어처리 분야에서 주류가 된 language model pretraining 방식을 사용한 모델들을 소개한다.
ELMo
ELMo는 contextualized word embedding, 즉 문맥을 고려한 단어 임베딩을 제공하는 모델이다.
ELMo는 여러 레이어의 bi-directional LSTM으로 구성되어 있고, 각 단어에 대한 임베딩은 여러 레이어의 벡터들을 합쳐서 사용한다.
ELMo의 학습은 language model task를 학습하는 방식으로 이루어지는데, 이전 step까지의 단어들이 주어졌을 때 현재 문맥상 와야하는 단어를 예측하도록 학습된다.
각 단어의 임베딩은 여러 레이어들의 hidden state들의 linear combination으로 계산되고, 임베딩 계산 방식은 각 downstream task에 대해 fine-tuning되며 학습되게 된다.
이렇게 학습된 ELMo의 contextualized word embedding은 기존의 Word2Vec과 GloVe 같은 static word embedding과 결합되어 사용되거나, 단독으로 사용되며 기존 워드임베딩보다 여러 downstream task에서 큰 성능 향상을 불러왔다.
ELMo의 등장으로 language modeling task로 큰 뉴럴모델을 사전학습 (pretraining) 시키고 downstream task에 대해 가져와서 사용하는 방식이 대두되게 되었는데, ELMo에 이어 등장한 모델들은 GPT, BERT, GPT-2와 여기서 파생된 모델들이 있었다.
여기서 GPT와 GPT-2, BERT는 앞선 포스팅에서 설명한 Transformer 모델의 인코더, 디코더 중 각각 디코더, 인코더만을 사용하여 language modeling task로 pretraining된 모델들이다.
각 모델들은 필요에 따라 파라미터의 수를 키워가며 성능을 높일 수 있음이 확인되었지만, 너무 큰 모델의 경우 일반적인 사용자는 사용할 수 없는 문제점이 있다.
GPT (Generative Pretrained Transformer)
GPT는 OpenAI에서 제안한 Transformer의 디코더만을 사용한 pretrained transformer 모델이다.
GPT를 이해하기 위해서는 Transformer 모델의 디코더를 이해해야 하는데, 이전 포스팅에서 self-attention 매커니즘은 설명하였기 때문에 decoder만의 encoder와의 차별점을 중점으로 설명한다.
Transformer의 decoder layer는 masked self-attention, encoder-decoder attention, fully connected layer로 구성되어 있다. 이 중 masked self-attention은 language modeling task를 위해 사용되는 self-attention 방식인데, encoder의 self-attention 방식과 다른 점은 전체 문장에 대해서 참조(attend)할 수 있는 인코더와 다르게 앞서 등장한 단어들에 대해서만 참조가 가능하도록 아직 등장하지 않은 단어들에 대해서는 masking 처리를 해준다는 점이다.
GPT의 input 문장은 Transformer 모델과 동일하게 토큰 임베딩과 위치정보를 뜻하는 positional embedding이 더해져서 인코딩된다.
각 decoding step에서 input embedding을 처리하고 와야할 단어를 예측하게 되고, 다음 decoding step에서의 input으로 해당 단어를 제공하여 <eos>(문장이 끝났다는 것을 표시하는 special token)이 올때까지 decoding을 이어나가게 된다. 위 그림에서는 Language modeling task를 학습함에 따라 이전에 등장한 단어들에 대해서만 self-attention 매커니즘을 적용하는 masked self-attention 방식을 보여주고 있다.
GPT의 self-attention은 어떤 decoding step에서 이전 step의 단어에 대한 Q(query) 벡터를 구하고, 이전까지의 단어들의 K(key), V(value) 벡터들과 곱해 각 단어에 대해 얼마나 참조할지를 결정하고 이 결과물을 해당 step에 와야할 단어를 예측하는 데에 사용하는 방식으로 이루어진다.
이전 step에서의 단어들의 K 벡터들과 score들을 구하고, V 벡터들과 곱한 벡터들을 더해 현재 step에서의 벡터로 얻게 되는 것을 확인할 수 있다.
GPT의 각 decoding step에서의 output vector는 전체 vocabulary에 대한 등장 확률을 예측는 방식으로 학습되고, 가장 큰 확률을 갖는 단어를 현재 step에서의 단어로 출력하게 된다. 이러한 방식을 auto-regressive라 표현하고, GPT는 language modeling을 auto-regressive한 방식으로 학습하는 모델이라 할 수 있다.
다음에 올 단어를 예측하는 방식으로 학습된 GPT는 문장을 자유롭게 생성할 수 있는데, 여러 decoding 방식에 따라 문장 생성 결과에 큰 차이를 보이는 것이 확인되었다.
그렇다면 여기서 "langugae modeling으로 pretraining된 GPT를 다른 task에 대해서는 사용할 수 없을까?" 라는 의문점을 가지게 된다.
결론부터 말하자면, "가능하다"이고, pretraining을 통해 임의의 값으로 초기화된 동일한 구조(파라미터 수)의 모델을 사용할 때보다 더 downstream task에 대해서 높은 성능을 보이게 된다. 즉, pretraining을 통해 많은 데이터들을 통해 언어 자체를 이해하는 기본적인 능력을 갖춘 상태라고도 할 수 있다.
Pretraining된 language model은 다양한 downstream task에 대해 소수의 추가 파라미터와 함께 fine-tuning되어 높은 성능을 얻을 수 있다. 여러 pretrained LM을 제안한 논문들에서 fine-tuning시에 유효했던 구조를 함께 설명하고 있다.
위 그래프는 pretraining에 따라 transfer learning시에 더 빠르게 더 높은 성능을 얻을 수 있음을 보여준다.
BERT (Bidirectional Encoder Representations from Transformers)
GPT 이후에 제안된 pretrained language model은 BERT이다. BERT는 수없이 많이 인용되며 자연어처리 분야의 주류로 사용되고 있어 꼭 알아두어야 하는 모델이다.
BERT는 GPT와 유사하게 큰 데이터셋 (위키피디아)에 대해서 masked language modeling task로 학습되어 downstream task에 대해 fine-tuning하는 방식으로 사용된다. BERT가 GPT와 다른 점은 Transformer 모델의 인코더만을 가져와서 사용했다는 점이다.
Base 모델과 Large 모델은 각각 인코더 블록의 수와 파라미터 수에서 큰 차이가 있고, 그에 비례하여 성능에서도 차이가 있다.
BERT는 앞서 설명한대로 Transformer의 인코더블록만을 사용하고 있는데, 인코더의 input으로 사용하는 임베딩을 구성하는 방식에서 차이가 있다.
토큰 임베딩과 위치 정보를 부여하는 positional embedding만 사용하던 기존 Transformer 모델과 달리 BERT는 토큰 임베딩, segment embedding, 학습되는 positional embedding을 사용한다.
Pretraining 단계에서의 input은 위와 같이 구성되는데, fine-tuning 단계에서 문장을 대표하는 벡터로 사용되는 [CLS] 토큰이 추가되고, 두 segment를 분리하고 input의 끝임을 표시하는 [SEP] 토큰이 추가된 것을 확인할 수 있다.
또한 [MASK] 토큰은 주어진 segment에서 임의의 토큰을 선택하여 대체함으로써 해당 위치에 와야하는 토큰을 예측하는 masked languge modeling task를 위해 도입된 토큰을 의미한다.
BERT의 pretraining task는 1. masked language modeling, 2. Next sentence prediction task로 구성되어 있는데, 앞서 설명하지 않은 next sentence prediction task는 두 segment가 연속된 문단인지를 [CLS] 토큰의 벡터를 가지고 에측하는 task로 정의된다.
Pretraining 이후에 finetuning은 여러 downstream task들에 대해서 이루어지는데, 앞서 설명한 것과 같이 BERT를 제안한 논문에서 각각의 task에 대해 finetuning을 위해 BERT를 사용하는 방식에 대해서도 설명해 놓았다.
위 표에서 ELMo, GPT와 비교했을 때 BERT 모델의 pretraining 방식이 크게 앞선 것을 확인할 수 있다.
Pretraining된 BERT를 finetuning하여 사용하는 것 외에도 BERT의 학습된 파라미터들은 그대로 두고, feature extractor로써 사용할 수도 있는데, 이 경우엔 여러 레이어로 구성된 BERT에서 어떤 단어 벡터를 사용할지가 문제가 된다.
BERT를 feature extractor로 사용할 경우 여러 벡터 선택방식에 따라, task에 따라 성능 차이가 있는 것을 확인할 수 있다.
ELMo로 시작하여 GPT, BERT로 이어지는 language modeling task를 pretraining한 모델들은 현재 자연어처리의 주류가 되어 downstream task에서의 학습을 시작할 경우, 해당 모델의 pretraining된 초기 파라미터에서 시작하는 경우가 대부분이 되었다. 이번 포스팅에서 설명한 pretraining task 이외에 다른 task를 제안하거나, 다른 모델 구조를 제안하는 많은 논문들이 쏟아져 나오고 있으니 계속해서 확인하는 것이 필수적이다.
'Lecture > (2021-1) Deep learning for NLP' 카테고리의 다른 글
[Week 11] Transformer Network (0) | 2021.06.11 |
---|---|
[Week 9] Machine Reading Comprehension with Attention (0) | 2021.06.11 |
[Week 7] Sequence to sequence and attention mechanism (0) | 2021.05.25 |
[Week 4] Recurrent Neural Network (0) | 2021.05.24 |
[Week 3] Word embeddings (0) | 2021.05.13 |