현대 NLP 모델의 근간이 되는 BERT의 기본적인 특징
1. pre-trained model은 왜 의미있을까?
pre-training과정에서 수행한 up-stream task의 data는 별도의 label이 필요하지 않은 데이터라는 것이 하나의 강점이다.
-------------------------------------------------------------------------------------------------------------------------------
다음 단어를 맞추는 것이 label이 없다고?
GPT-1이 수행한 다음 단어를 예측하는 pre-training task는 input sequence와 output sequence가 동일한 task이다.
쉽게 말해 input sequence를 차례대로 읽어들여 input sequence의 단어들을 차례대로 생성하는 language model이다.
대규모의 문장을 그대로 암기하는 것과 같다. 그러면서 문장에 담겨진 언어의 구조를 그대로 암기해버리는 것이다.
--------------------------------------------------------------------------------------------------------------------------------
이런 unsupervised data는 대량으로 사용할 수 있다는 것이 장점이다. 그냥 웹페이지의 영어 문장을 그대로 긁어와서 사용하면 되거든
그러나 진정으로 원하는 task인 down-stream task는 기본적으로 label이 된 데이터가 필요한 경우가 많다.
document classification만 해도 주어진 데이터의 category label을 알아야 학습이 가능하다.
label이 있는 데이터는 상대적으로 소량이다. pre-train model은 이런 데이터의 한계를 극복할 수 있다는 강점이 있다.
이것이 바로 self-supervised learning이다.
자기 스스로 label이 없는 대규모의 unsupervised data, 대량의 문장을 그대로 암기해버려서 언어 지식을 습득하고
이것을 바탕으로 transfer learning, main task인 down-stream task에 활용하여 모델의 성능을 더욱 향상시켰다.
여러 실험에서 fine-tune한 model이 특정 task에 특화된 모델보다 성능면에서 향상되었다고 한다.
fine-tune한 본인들의 모델이 다른 특정 task에 특화된 모델보다 성능이 향상되었다는 결과
2. BERT 개요
pre-training과정에서 수행한 up-stream task로 masked language modeling을 수행했다.
transformer 이전 ELMo가 masked language modeling을 활용하여 양방향 LSTM기반으로 학습을 한 적이 있었으나
BERT는 transformer를 활용하였고 이로부터 대규모의 데이터와 대규모의 모델 사이즈를 이용한 더욱 많은 양의 사전 지식을 학습할 수 있도록 하였다.
GPT는 이전 단어를 보고 다음 단어를 예측하는 pre-training을 거쳐서 한방향으로 보이는거고
BERT는 문장의 모든 정보를 활용하여 mask된 단어를 맞추는 pre-training을 거쳐서 양방향으로 보인다
3. masked language modeling
3-1) motivation
기존의 language model은 오직 이전의 단어들만 보고 다음 단어들을 맞추는 모델로, 이전의 정보만을 파악한다는 것이다.
그러나 언어라는 것은 양방향으로, 양쪽의 정보를 종합적으로 고려할 필요가 있다.
그래서 단순하게 bidirectional하게 modeling하면? 정답을 모두 안다는 것이 또 문제다.
model을 양방향으로 병렬적으로 설계하면 study가 i와 math의 정보를 모두 알지만
정답을 모두 알고 다음 단어를 예측하면 무슨 소용인가
3-2) 그러면 도대체 어떻게?
주어진 sentence에서 일정한 확률로 랜덤하게 단어를 선택하여 그것을 <mask>라는 special token으로 치환하고 그 <mask>에 해당하는 단어를 맞추게 한다.
mask로 얼마나 바꿀지는 hyperparmeter
그런데 너무 많은 마스크 비율을 선택해버리면 직관적으로도 단어를 맞추기에 적절한 문맥정보를 파악하기가 어렵다
the, went, buy만 가지고 빨간색으로 칠해진 단어를 어떻게 알아 맞춰?
그렇지만 너무 적은 마스크 비율을 선택하면, 학습을 위한 비용이 너무 많이 든다.
-----------------------------------------------------------------------------------------------
단순하게 적은 마스크 쓰면 문맥 정보를 많이 아니까 쉽게 맞추는 거 아니야??
그게 아니고 mask가 없는 수 많은 단어를 읽어 들여 상대적으로 적은 mask를 맞추는데 드는 계산비용이 더 많이 들어 효율이 떨어진다는 의미다.
위와 같이 단 2개의 단어에 mask되어 있다고 해보자.
굳이 저 두 단어를 맞추기 위해 나머지 모든 단어를 읽어들여 맞춰야겠는가
그냥 두 단어 없이 글을 읽고 말겠다
3-3) BERT의 masked language modeling
BERT의 연구자들은 여러 실험을 통해 k=15%가 가장 적절하다고 생각했다.
그런데 이 15% 전부를 mask로 치환하면 문제가 생길 수 있다.
pre-training과정에서 15%의 mask된 문장에 익숙해진 model이 실제로 main task를 수행할때는
거기서는 데이터가 mask되어있지 않아서 pre-train과 downstream task과정의 큰 괴리감(Generalization performance)을 느낀다는 거지.
전부 마스크로 사용해버리면 오히려 학습을 방해하는 요소가 되면서 transfer learning의 효과를 떨어뜨린다는 것이 연구자들의 생각
그래서 전체 단어의 15%중 80%만 <mask>로 치환하였다. 100단어라면 15개의 단어중 80%인 12개만 치환하였다는 의미다.
그리고 나머지 10%인 1.5단어정도는 <mask>가 아닌 random한 word로 바꿨다.
이 단어는 <mask>가 아니니 모델이 맞추는 단어는 아니다.
그러나 <mask>가 아니더라도 model이 이상함을 느끼고 원래 단어로 바꿔서 생각하게 만드는 힘을 갖기를 기대하는 것이다.
마지막으로 남은 10%는 그대로 유지한다.
앞에서 문장 중에 이상한 단어가 있다는 것을 느낀 model이 이렇게 그대로 유지한 단어들에도 의심을 해보면서
이 단어는 문맥을 이상하게 만들지 않는구나라고 생각하게 만드는 힘을 갖기를 기대하는 것이다.
<mask>된 단어만 model이 맞추는 것이다.
즉 전체 단어의 15%의 80%만 맞추는 것이다. 나머지는 성능 향상을 위한 일종의 방해요소
4. BERT의 next sentence prediction
GPT-1이 기본 사전학습으로 다음 단어를 맞추는 학습과 동시에 sentence level에서 classification으로 예를 들면 sentiment classification도 수행했다는 점에 근거하여 제안하였다.
문장간의 관계를 학습하기 위해 주어진 text data에서 2개의 sequence를 random하게 뽑고 speical token을 이용해 구분하면서 연속적으로 이어서 input으로 준다.
그리고 이 두 문장이 연속적으로 나올 수 있는지 그렇지 않은지를 예측하는 문제이다.
두개의 문장을 주어 앞문장 다음으로 뒷문장이 나올 수 있는지 아닌지를 예측하는 문제
문장이 끝나면 <sep> token을 주어 문장과 문장을 구분
특히 문장 내부에 <mask> token을 주었는데 masked language modeling도 동시에 수행하고 있다는 사실이 주목할만하다.
문장의 맨 앞에 <CLS> token이 GPT에서 맨 뒤에 있었던 <extract> token과 역할이 동일하다.
최종 encoding된 hidden vector에 대해 <CLS>에 대응하는 hidden vector를 output layer에 넣어 next인지 아닌지 label을 예측한다.
next인지 아닌지는 알고있으니까 ground truth가 될 수 있도록 softmax loss를 최소화하는 backpropagation으로 학습하겠죠?
5. model architecture
transformer의 self-attention block을 그대로 사용했다.
두가지 버전으로 BERT BASE, BERT LARGE를 제시했다.
5-1) BERT BASE
BERT BASE는 self attention layer 수가 L=12, 각 self attention layer에서 사용한 multi head attention의 수가 A=12, hidden vector의 차원 수 H=768
5-2) BERT LARGE
BERT LARGE는 L=24,A=16,H=1024를 사용했다.
6. Input representation
6-1) word piece embedding
일반적인 word별로 embedding하는 것이 아닌 word를 더욱 쪼개서 만든 word piece인 subword로 embedding을 하였다.
예를 들어 pretraining은 한 단어지만 이것을 의미 단위로 쪼개 pre, training으로 나눠서 embedding을 하였다.
30000개의 token을 가지는 vocabulary를 사용한 word piece embedding을 사용하였다고 한다.
6-2) learned positional embedding
transformer의 positional encoding에 착안한 positional embedding을 사용하였다.
transformer는 본인들이 적절하다고 생각하는 주기함수를 이용했는데 BERT는 positional embedding matrix를 사용하였다.
이것은 random initialization하여 학습할수있는 matrix이다.
즉 전체학습과정에서 학습할수있는 matrix를 사용하여 최적화된 learned positional embedding을 사용하였다.
6-3) <CLS> token for classification embedding
문장을 전체적으로 이해하여 마지막으로 표현된 hidden state vector중 <CLS> token에 대응하는 hidden state vector가 output layer에 들어가면 classification task를 수행하는 것이다.
6-4) <SEP> token for packed sentence embedding
Next sentence prediction을 수행하기 위해 2개의 문장을 넣어야하는데 이들 문장을 구별하기 위해 <SEP> token을 각 문장이 끝날 때 넣어주었다.
6-5) segment embedding
positinal embedding으로 token의 순서를 고려했다고 하지만 사실 큰 문제가 있다. 예를 들어 그림을 보자.
위 문장에서 he를 보면 position상으로 6번째이므로 E6이라는 Positional embedding을 사용하였다.
그런데 사실 he는 독립된 문장 개념에서 보면 두번째 문장의 첫번째 단어이다.
이것을 6번째 단어라는 의미의 단순한 코딩을 하는 것이 맞을까?
그래서 segment embedding으로 문장 레벨의 position을 고려한 embedding을 수행하였다.
단어들이 첫번째 문장에 속하는지 두번째 문장에 속하는지를 고려한 sentence level positional embedding이다.
최종 input embedding은 각 token의 embedding과 segment embedding, positional embedding의 합이다.
7. pre-training task
이미 언급하였지만, pre-training task로 masked language model과 next sentence prediction을 동시에 수행했다.
8. gpt는 decoder only, bert는 encoder only
GPT는 transformer의 decoder stack만 사용했다.
왜 그런지 생각해보면 GPT가 다음 단어를 예측하는 language modeling을 수행했으며
cheating을 방지하기위한 이전 단어에만 영향받도록 하는 masked self attention을 사용했다는 것을 알수있기 때문이다.
당연한건데 encoder가 없으니까 decoder에 encoder-decoder attention 모듈은 있을 이유가 없다
반면 BERT는 transformer의 encoder stack만 사용했다.
왜 그런지 생각해보면 BERT는 masked language modeling을 수행했으며
이는 transformer의 encoder에서 수행하던 self-attention과정처럼 모든 단어들이 서로 attention하여 mask된 단어를 맞추는 과정을 수행했기때문이다.
https://arxiv.org/abs/1810.04805
https://ratsgo.github.io/nlpbook/docs/language_model/bert_gpt/
'딥러닝 > NLP' 카테고리의 다른 글
GAN의 원리에 착안한 ELECTRA와 학습하지 않아도 응용을 잘하는 GPT-3 (0) | 2022.10.26 |
---|---|
BERT의 Transfer learning 활용 예시 알아보기 (0) | 2022.10.25 |
괴물 언어모델 GPT-1에서 더 강력해진 GPT-2 파헤치기 (0) | 2022.10.21 |
NLP의 transfer learning 기본 개념(zero shot, one shot, few shot) 익히기 (0) | 2022.10.20 |
NLP의 최신 트렌드 - GPT-1 파헤치기 (0) | 2022.06.28 |