[딥러닝 NLP] transformer vs BERT
자연어 처리 글을 보면 가장 많이 인용되고 있는 연구는 transformer와 BERT 입니다. 이 글에서는 transformer와 BERT의 차이를 간략히 정리해보았습니다. 자세히 이해하기 쉽게 설명해 놓은 글들이 워낙 많아 상세한 설명 및 성능은 생략하였습니다. 이해한 것을 간단히 정리하고, 주요하다고 생각하는 부분, 나중에 볼 때 헷갈리는 부분에 대해서만 정리하였습니다.
transformer 이후 자연어 처리 분야에서는 transformer 구조가 자연어 처리 task 대부분에 사용되고 있습니다. transformer를 기준으로 자연어 처리 기법 전/후를 나눌 수 있을 정도라고 생각됩니다.
BERT는 사전 학습 및 사전 학습 모델에 기본이 되고 있습니다.
두 연구는 자연어 처리라는 분야 안에서 기여하고 있는 부분이 다른 연구입니다. 그래서 둘 간의 직접 비교는 불가하고 어떤 차이가 있는지 적어보았습니다.
transformer vs BERT
많이 보이는 차이점으로 설명되는 것이 'transformer는 encoder-decoder 모델이고 BERT는 encoder 모델이다' 인데, 이것도 틀린 말은 아니지만, 이 둘은 더 근본적이 차이가 있다고 생각합니다.
transformer는 새로운 언어 모델 '구조' 에 대한 연구이고, BERT는 새로운 구조가 아니라 기존 구조를 가져다가 쓴 '학습 방법'에 대한 연구입니다.
transformer는 self-attention으로 encoder, decoder를 만든 '구조'에 큰 의미가 있습니다. 그래서 self-attention을 사용하는 encoder, decoder에 대한 '구조'는 transformer encoder, decoder라고 씁니다.
BERT라 부르는 것은 요새는 대부분 BERT 논문에서 제안한 학습 방법으로 대규모 언어 데이터로 사전 학습되어 있는 모델을 뜻합니다.
다시 말해, transformer의 encoder 혹은 전체인 encoder-decoder를 가져다가 학습되어 있지 않은 초기 weight 상태부터 내가 가지고 있는 data를 이용해 학습할 때 사용한 encoder, decoder 구조를 표현할 때는 transformer라 하는 것이고, BERT는 주로 사전학습되어 공개된 언어모델을 뜻하고 있으며, transformer encoder를 초기 weight 부터 학습할 때 BERT 연구에서 제안한 MLM 방법을 사용하여 학습했을 때도 BERT를 썼다고 할 수 있습니다.
transformer
Vaswani, Ashish, et al. "Attention is all you need" NeurIPS 2017
transformer 이전 encoder와 decoder를 이을 때 attention operation 사용하자고 제안한 연구들이 있습니다. 간략히 되돌아보면, RNN encoder의 마지막 context만 사용하는 것으로는 decoder에 입력 전체의 의미를 전달하기 부족하다는 것에서 시작되어 입력 문장의 개별 context와의 관계를 모두 고려하는 attention을 사용한 것 입니다.
이와 비슷하게 encoder에서 각 token의 context를 뽑아낼 때, RNN을 사용해 순차적으로 의미를 전달하게 되는데, 문장의 마지막 token에서는 첫 token의 의미가 거의 남아있지 않는 문제가 있습니다.
이를 해결하기 위해 하나의 문장을 구성하는 모든 token 들이 서로의 관계를 한 time에 파악하도록한 것이 transformer에서 제안한 self-attention 입니다. 이와 같은 원리는 통해 encoder와 decoder 자체도 self-attention을 사용한 구조가 transformer 입니다.
가장 주요한 기여점은 한 문장 내 token간 관계(유사도, 백터 간 내적)를 파악하게 해주는 self-attetion 이지만 이 외에 multi-head attention, positional encoding을 적용한 것도 주요한 idea 입니다.
RNN에서는 문장 내 token들의 위치 정보는 시간 순으로 token을 처리함으로써 자연스럽게 처리되었습니다. 하지만 transformer에서는 한 문장을 한 time에 넣으므로, 문장 내 token들의 위치 정보가 사라집니다. 문장을 이해하기 위해서는 token들의 위치 정보도 중요한 정보이므로 이 정보를 넣는 idea가 positional encoding 입니다.
multi-head attention은 attention score를 깊은 차원으로 한 번에 구하지 않고, 차원을 단순히 나누어서 얕게 여러 번 attention score를 구하고 이를 합친다는 idea입니다. 이는 transformer에서 처음 낸 idea라기 보다는 mobilenet 에서 사용하였던 depth-wise convolution 과 비슷한 원리로 깊은 depth에서 한 번에 feature를 뽑는 것 보다는 얕은 depth로 뽑은 여러 feature 를 합치는 것이 feature 추출에 유리하다는 원리로 이해했습니다.
- transformer 내 세 종류의 self-attention. 각 self attention 에서 Q, K, V 구하는 방법? 3가지(Q, K, V로 변환될) 입력에 대해 Q, K, V 변환 matrix를 곱하여 Q, K, V 를 구한다. matrix를 곱함으로써 선형 변환을 하는 것으로 이해할 수 있다. 이 Q, K, V로 선형변환하는 matrix도 학습된다. 이 선형 변환으로 얻은 Q, K를 내적함으로써 Q, K 간 관계를 구한다고 볼 수 있고 이는 token 간 관계를 구하는 것으로 볼 수 있다.
- W_q, W_k, W_v는 word length만큼 있는 건가 공유해 쓰는 건가 ?
word 별로 있는게 아니고 공유해서 쓴다.
- positional encoding으로 나온 vector를 단순히 더해줌(+)으로써 위치 정보가 잘 전달되나 ?
sum과 concat하는 방법이 있는데, sum하면 embedding size 유지되고 embedding space 간 conflict 발생. 하지만 학습과정에서 이 conflict 까지 고려하여 학습되는 것으로 보임. sum과 concat이 다르지만 학습을 거치면 성능차이가 크게 나지 않음. Summing or concatenating embeddings? — Graph Neural Networks and Transformers documentation (enccs.github.io)
- mobile net depth-wise convolution ? (ResneXt)
- longformer는 왜나왔는가 ? transformer에서 sequence length만 늘리면 무슨 문제가 있을까 ?
- 학습 시간은 빠르고(병렬 처리 가능) 추론은 여전히 느리다(병렬 처리 불가)
BERT
Devlin, Jacob, et al. "Bert: Pre-training of deep bidirectional transformers for language understanding." NAACL 2019( arxiv 2018.10)
BERT는 구조는 transformer의 encoder를 가져왔습니다. 위에서 설명했듯이, BERT는 구조가 중요한 것은 아닙니다.
BERT는 학습 방법과 그 학습 방법을 사용해 대규모 corpus로 사전 학습을 한 후 특정 task에 맞게 fine tuning 했을 때 높은 성능을 보인다는 것이 핵심입니다.
BERT에서는 unsupervised learning 방법인 MLM(masked language model), NSP(next sentence prediction) 방법을 제안하며, 이 학습 방법이 핵심입니다.
MLM은 입력 문장 중 random 하게 15% token에 대해서 80%는 [MASK], 10%는 다른 token으로 치환, 10%는 그대로 두고, 변화된 token의 출력이 원래대로 나오도록 학습하는 방법입니다.
여기서 원래 token이 출력으로 나오도록 한다는 것은 BERT 출력들 중 해당하는 token 자리의 출력 vector를 softmax를 통과시켜 전체 vocab들에 대한 probability를 예측하고, 이중 max 값으로 vocab을 예측하여 이 예측 값이 원래 vocab vector와 같아지도록 cross entropy loss를 주는 것 입니다. BERT에서 사용한 영문 학습 데이터의 전체 vocab size는 30,522개 입니다.
NSP은 실제 이어지는 문장 50%, 아닌 문장 50%를 [SEP]으로 구분하여 입력으로 넣었을 때, 첫 번째 문장과 두 번째 문장이 이어지는 문장인지 아닌지를 출력으로 나온 [CLS] token 으로 binary classification 해서 맞추도록 합니다.
- BERT에 additional layer를 두고 fine tuning 시 BERT weight(parameter)도 학습하는가 ?
같이하기도 하고, additional layer만 하기도 합니다. 하지만 보통의 task는 사전 학습된 BERT의 parameter까지도 fine tuning 해야 성능이 더 잘나옵니다.
다양한 실험들이 있는 ACL 2019에 발표된 "To Tune or Not to Tune?" 에 잘 정리되어 있습니다 https://aclanthology.org/W19-4302.pdf
- 한계점
학습데이터에 offline으로 masking 해버리기 때문에 random 부족
실제로는 입력으로 들어오지 않는 [MASK] 를 계속 입력으로 받으며 학습
- 더 생각해볼 점
fine-tuning 하여 task에서 성능이 잘 나오지만, feature representation 시 사용하기에는 word embedding, sentence embedding (representation)을 잘하고 있지는 않음.
corpus 자체에 불균형 문제.