해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
주재걸 교수님 - Self-supervised Pre-training Models
NLP 분야의 최근 경향은 빠르게 발전하고 있습니다. Transformer에서 제안된 self-attention block은 범용적인 sequence, encoder, decoder로 자연어 처리의 다양한 분야에서도 활발히 사용되고 있습니다. 이전에 사용한 Transformer에서는 self-attention block을 6개 정도만 쌓아서 사용했다면, 요즘에는 깊게 쌓아서 사용하는 모델을 많이 활용하고 있습니다. 또한 self-attention 구조는 추천 시스템, 신약 개발, 컴퓨터 비전 등 다양한 분야에서 활용되고 있습니다. 자연어 생성을 위해서는 단어를 하나씩 생성하게 되는 greedy decoding에서 벗어나고 있지는 못합니다.
1) GPT-1
GPT-1은 테슬라의 일론 머스크가 비영리 목적으로 만든 OpenAI에서 개발한 모델입니다. GPT-1은 다양한 special 토큰을 제안해서 자연어 처리에서의 많은 task들을 동시에 커버할 수 있는 통합된 모델입니다. 모델은 기존의 입력으로 들어오는 text에 Position Embedding 값을 더하고 12개의 self-attention block을 거치게 되는 구조를 가지고 있습니다. Text Prediction은 첫단어부터 순차적으로 예측하는 Language modeling task입니다. 또한 앞에서도 언급했던 것처럼. 문장 분류(classification), 내포 관계 확인, 문장 간의 유사도 측정 등 다양한 Task를 수행할 수 있습니다. Extract토큰은 end 토큰 대신해서 각 task의 중요한 정보를 포함하는 것입니다. 예를 들어, 감정 분류인 경우에는 긍정인지 부정인지에 대한 정보를 extract 토큰이 가지고 있는 것입니다. 또한 여러 문장이 입력으로 들어오는 경우에는 delimeter 토큰을 사이에 넣어서 구분해주는 역할을 합니다.
다른 task를 수행하기 위해서 마지막 linear layer 대신 다른 layer를 추가하고, 이미 잘 학습된 transformer로 소량의 데이터만으로도 좋은 결과를 내는 fine-tuning을 적용할 수 있습니다. 이처럼 pre-training된 GPT-1을 이용해서 fine-tuning으로 다른 task에 적용했을 때, 좋은 결과가 나오는 것을 확인할 수 있습니다.
2) BERT
BERT는 지금까지 유용하게 사용되고 있는 pre-trained 모델입니다. BERT도 Language modeling task로 학습을 진행합니다. GPT-1의 경우에는 뒤의 단어는 참고하지 않고 다음 단어를 찾는 방법으로 pre-training을 진행합니다. 간혹 전화를 하다가 끊기는 경우에 우리는 뒤의 단어를 듣고 끊긴 부분의 내용이 무엇인지 유추할 수 있습니다. 이러한 방법을 사용해서 BERT는 모르는 단어의 좌우측의 내용을 다 확인해서 유추합니다. BERT에서의 pre-training task인 Masked Language Model은 input token들의 일부 퍼센트를 mask token으로 대체하는 방법을 사용합니다. 대략 15% 단어들을 예측하게 되는데, 만약 15%보다 많은 단어를 대체하게 되면, 정보가 충분하지 못하는 경우가 발생하고, 15%보다 적은 단어를 대체하게 되면, 학습 효율이 떨어지게 됩니다. 또한 15% 중 80%는 단어를 MASK 토큰으로 대체하고, 나머지 10%는 임의의 단어로 바꿔서 원래 단어를 찾도록 하거나, 남은 10%는 문장을 그대로 유지하도록 합니다. 이렇게 나눠서 변환해주는 이유는 pre-training 당시 주어진 문장에서 15% 단어가 MASK가 포함되는 것에 익숙해진 모델이 나올 텐데, 이 모델로 주제분류 task를 수행할 때, MASK 토큰은 등장하지 않습니다. 이처럼 TASK의 특성에 따라 학습을 방해할 수도 있기 때문입니다.
BERT에서 새로운 Pre-training Task로 Next Sentence Prediction이라는 것을 제안했습니다. 이 Task는 두 개의 문장을 같은 document에서 이어진 문장을 가져오거나, 다른 document에서 관련이 없는 문장을 가져와서 두 문장과의 관계가 있는지를 파악하는 Task입니다.
위의 그림에서 [cls] 토큰은 문장의 시작을 알려주면서 이 [cls] 토큰에 예측 정보를 담도록 합니다. 그리고 두 문장을 나눠주는 역할을 하는 것이 [sep] 토큰입니다. 읽어보시면 좌측은 연속적인 문장이고, 우측은 관계성 없는 문장을 이어놓은 것을 알 수 있습니다. [cls] 토큰은 output layer를 하나 둬서 classification이 가능하도록 합니다.
BERT는 Transformer에서 사용된 self-attention block을 여러개 쌓아서 사용했습니다. input으로는 단어별로 embedding 해서 넣어주지 않고 단어의 의미(subword embedding) 단위로 쪼개서 넣어줍니다. 또한 Transformer에서 사용되었던 positional embedding도 학습과정을 통해서 최적화된 값을 얻는 특징이 있습니다. 이전과 다르게 [cls], [sep] 토큰이 추가되었고, Segment Embedding이라고 해서 문장과 문장을 나눠주는 역할을 하는 embedding도 추가했습니다.
GLUE는 다양한 자연어 처리 task를 모아놓은 것으로, Fine tuning의 형태로 학습한 뒤 평가했을 때, BERT의 성능이 좋게 나오는 것을 확인할 수 있습니다.
위의 그림은 BERT로 좋은 성능을 얻을 수 있는 Machine Reading Comprehension으로 질의 응답의 한 형태입니다. 주어진 지문이 있을 때 이를 이해하고 답을 추출해내는 문제라고 생각하시면 되겠습니다. 이러한 형태의 좀 더 어려운 버전인 SQuAD 데이터가 존재합니다.
위의 그림은 SQuAD 1.1 버전의 데이터 예시입니다. input으로는 지문과 질문을 한개의 sequence로 인코딩한 뒤 BERT를 통해 학습하게 되는데, 이때 start지점을 찾는 FC Layer와 end지점을 찾는 FC Layer를 통해 우리가 원하는 답인 first oil shock을 얻게 됩니다.
SQuAD 2.0 버전은 답안이 있을 법한 질문과 답이 없는 지문을 포함하고 있습니다. 그래서 답이 지문에 포함되었는지를 판단하는 TASK입니다. 이를 판단하기 위해서는 CLS 토근을 활용해서 이진 분류를 하게 됩니다.
SWAG는 주어진 문장이 있을 때, 뒤에 나올 가장 적절한 문장을 4개 중에서 고르는 Task입니다. 주어진 문장과 각 답들과 concat을 한 뒤에 BERT로 인코딩 후 Fully Connected Layer를 거치게 되면, 나오는 scalar 값을 softmax로 학습하게 됩니다.
3) BERT VS GPT-1
GPT는 다음 단어의 접근을 막는 Masked Multi self attention을 사용했지만, BERT에서는 MASK 단어를 포함해서 전체의 단어에 접근을 허용함으로써, Transformer Encoder에서 사용한 attention을 사용하는 차이가 있습니다. BERT는 GPT-1에 비해 3배가 많은 데이터와 4배 정도 큰 Batch size를 사용했습니다. 일반적으로 더 큰 배치 사이즈를 사용할수록 학습이 안정화되고 더 좋은 성능을 얻을 수 있습니다. 다수의 데이터를 바탕으로 평균적으로 나온 값을 이용해서 gradient를 업데이트하기 때문입니다. 하지만, 배치 사이즈가 커지면 한 번에 불러와야 하는 데이터양이 많아지고, forward, backporpagation 메모리 양도 늘어나게 됩니다. 이를 극복하기 위해서는 많고 고성능의 GPU가 필요하게 됩니다. BERT는 SEP, CLS, segmentation embedding을 pre-training 과정에서 학습하는 차이를 가집니다. GPT-1은 다양한 downstream task에서 Learning rate를 동일하게 사용하지만, BERT는 각기 다르게 학습하는 차이가 있습니다.
주재걸 교수님 - Advanced Self-supervised Pre-training Models
1) GPT-2
모델 구조는 GPT-1과 크게 다를 바 없고, 다음 단어를 예측하는 방식으로 학습을 진행했습니다. GPT-1과 다른 점은 Training 데이터를 엄청 많이 증가시켰고, 데이터셋은 잘 쓰여진 글을 활용해서 학습시켰습니다. GPT-2의 아이디어는 The Natural Language Decathlon: Multitask Learning as Question Answering이라는 논문에서 얻어지게 되었습니다. 논문의 내용은 자연어 처리의 대부분의 문제가 QA로 해결된다는 것입니다. 특히, 데이터셋에서는 Reddit이라는 포털 사이트에서 up-vote가 최소 3 이상인 링크도 스크랩을 하는 방식이 추가되었습니다. 그리고 이전에 존재했던 wikipedia documents는 삭제했습니다. BERT에서의 wordpiece와 비슷한 BPE방법으로 전처리를 수행했습니다.
모델은 Layer가 위로 올라감에 따라 index에 따라 init 값을 더 작게 해줬습니다. 이렇게 한 이유는 Layer가 올라 갈수록 선형 변환의 값이 0에 가까워지도록 해서, 위쪽의 Layer의 영향력이 작아지도록 구성했습니다. 이렇게 구성된 모델을 가지고 Conversation Question Answering(CoQA)을 수행했을 때, 일반적으로는 Fine-tuning의 과정을 거쳐야 하지만, Fine-tuning을 하지 않았을 때(zero-setting)에도 F1-score가 대략 55에 도달하는 것을 확인할 수 있었습니다.
문단 요약(CNN과 Daily mail Dataset)에 관련한 Task를 수행할 때에는 TL;DR(Too long, didn't read)라는 토큰을 활용해서 짧게 요약하는 Task임을 알려줬습니다. 또한 번역 Task의 경우에는 문장을 주고 in French 와 같은 내용을 적어줘서 해당 언어로 번역할 수 있도록 했습니다.
2) GPT-3
GPT-2를 훨씬 개선한 모델이지만 개선한 방향의 측면이 모델 구조를 변경하는 것이 아닌, 모델 사이즈를 엄청 크게 늘리는 방식으로 개선했습니다. GPT-3에서는 GPT-2에서 사용했던 zero-shot setting의 가능성을 놀라운 수준으로 끌어올렸습니다. GPT-3에서는 One-shot(학습데이터 1개), Few-shot(학습데이터 여러 개)의 방법을 적용해서 실험했는데, 모델 자체는 변형하지 않고 인퍼런스 할 때에만 제시해주는 방식을 적용했습니다. zero-shot 보다 좋은 성능을 보이는 것을 확인할 수 있었습니다.
3) ALBERT
ALBERT는 BERT를 Lite하도록 경량화한 모델입니다. 기존의 BERT 모델이 가지고 있던 Memory Limitation과 Training 속도에 대한 문제점을 성능의 큰 하락이 없도록 유지한 모델입니다.
Factorized Embedding Parameterization은 입력 벡터의 차원을 줄여서 압축하고, 이러한 방법을 통해서 연산량과 모델 사이즈를 줄이는 방법으로, 큰 모델의 BERT 모델을 경량화하는 주된 아이디어였습니다. 위에서는 기존 4차원으로 embedding 되는 벡터를 2차원으로 줄이는 예시를 보여주고 있습니다. 사실 이렇게 봤을 때에는 왼쪽보다 우측이 더 많은 파라미터 수를 필요로 한다고 생각하실 수 있지만, 비교적 큰 값을 활용하면 아래와 같은 결과를 얻을 수 있습니다.
이처럼 vocab size가 500, hidden state dimension이 100이고, word embedding 차원이 a라고 했을 때, 위의 그림처럼 차이가 나는 모습을 확인할 수 있습니다. 이러한 방법을 통해 대용량인 BERT모델을 경량화할 수 있었습니다.
Cross-layer Parameter Sharing 방법은 우리가 학습하는 파라미터들을 공유하는 방법입니다. 좀 더 자세히 말해보자면, 서로 다른 self-attention 내부의 key, value, query로 만드는 weight와 마지막에서 모든 head에서 나온 벡터를 concat 후에 곱해지는 weight를 공유하는 것입니다. 원래는 self-attention은 각기 다른 파라미터를 가지고 있지만, 이것들을 공유함으로써 파라미터를 줄이는 노력을 했습니다. Shared-FFN은 Feed-forward network parameters만 공유하는 방법(concat 후 곱해지는 weight)이며, Shared-attention은 self-attention의 파라미터들을 공유하는 방법이고, All-Shared는 둘 다 공유하는 방법입니다. 이렇게 했을 때, 성능은 파라미터가 많은 shared-attention, shared-FFN, all-shared 방법 순으로 좋았습니다.
ALBERT에서 새롭게 제안한 방법으로 Sentence Order Prediction이 있습니다. 이전에 존재했던 Next Sentence Prediction과 매우 유사하지만 BERT에서는 너무 쉬운 Task 였습니다. 그 이유는 다른 기사 두개에서 문장을 꺼내면 내용이 상이할 수 있기 때문입니다. 그래서 ALBERT에서는 연속하는 문장을 입력으로 넣거나 연속하는 문장을 순서를 뒤집어서 넣는 것을 맞추는 방식을 제안했습니다. 이렇게 하게 되면 Next Sentence Prediction보다 맞추기 어렵게 되고 논리적인 관계 속에서 이해해야 맞출 수 있게 됩니다. 이를 학습하게 되면 SQuAD1.1과 SQuAD2.0에서 특히 성능이 좋아지는 것을 확인할 수 있습니다. 그렇지만 ALBERT도 더 많은 파라미터를 가지는 ALBERT 모델로 학습하니 기존의 모델보다 더 좋은 성능을 가지게 됩니다.
4) ELECTRA
ELECTRA는 Generator(BERT와 흡사)와 Discriminator(ELECTRA)를 사용하는 강화학습 아이디어로 학습하는 방식을 사용했습니다. MLM 모델인 Generator는 [mask]된 단어를 복원하는 역할을 하고, 이렇게 만들어진 문장을 Discriminator에 넣어서 해당 단어가 원래 있던 단어인지 아닌지를 확인하는 역할을 수행합니다. 최종적으로 모델 학습을 진행한 뒤에는 pre-trained 모델로 Discriminator를 활용합니다. ELECTRA는 같은 사이즈의 BERT 모델보다 좋은 성능을 가집니다.
5) Light-weight Models
지금까지 연구는 큰 모델들을 만들어서 활용하는 방법으로 발전해왔습니다. GPT-3처럼 대용량의 데이터, 좋은 성능의 GPU가 필요로 하지만 그만큼 인프라가 갖춰져 있지 않은 곳에서는 사실 활용하기가 어렵습니다. 그래서 경량화 방향으로도 연구가 되고 있습니다. Light-weight Model들은 큰 사이즈 모델들의 성능을 최대한 유지하면서 계산속도를 빠르게 하는 것에 집중하고 있습니다. 또한 소형 Device에서도 활용할 수 있습니다. 기본적으로 2개의 모델을 추가적으로 소개하고 있습니다.
DistillBERT는 Transformer의 구현체를 라이브러리 형태로 만든 hugging face라는 회사에 만든 것입니다. 위의 그림을 보시면 Teacher model과 Student model이 존재하는 데 기본적인 아이디어는 Teacher model이 학습하는 것을 Student model이 잘 따라갈 수 있도록 만들었습니다. Teacher가 "I"가 입력으로 들어왔을 때, 다음 단어로 "go"라고 예측하면, Student model은 Teacher가 가지고 있는 분포를 활용해서 정답을 내는 방식으로 진행됩니다.
TinyBERT는 Knowledge distillation을 활용해서 BERT를 경량화한 모델입니다. 여기서 Knowledge distillation은 미리 잘 학습된 큰 네트워크의 지식을 실제로 사용하고자 하는 작은 네트워크에 전달하는 방식을 이야기합니다. DistillBERT에서 teacher의 분포를 사용하는 것뿐만 아니라, 중간 결과물들도 배우는 모델이 TinyBERT입니다. 그래서 Teacher에서 나온 값과 최대한 비슷하게 하도록 MSE loss를 통해서 학습이 진행됩니다. 하지만, student 모델의 경우 차원수가 teacher 다를 수 있기 때문에 teacher 벡터를 Fully connected layer를 추가해서 동일한 벡터를 만들어줍니다.
6) Fusing Knowledge Graph into Language Model
최신 연구흐름은 Knowledge graph(외부 정보)를 잘 결합하는 방향으로 진행되고 있습니다. 예를 들면, BERT는 해당 주어진 문단에서 필요한 단어가 없는 경우에는 그것을 잘 찾지 못한다는 어려움이 있습니다. 이를 해결하는 방향의 연구가 발전하고 있습니다. 개체(땅)와 개체(파다)를 연결해서 관계를 정형화하는 것이 Knowledge Graph입니다.