Paper/Others

Improving Language Understanding by Generative Pre-Training (a.k.a GPT 1)

침닦는수건 2024. 1. 5. 15:01
반응형

내 맘대로 Introduction

꽤 오래된 논문이지만 LM 논문들을 쫓아가는 과정에서 시발점과 같은 논문이라 읽었다. GPT1.0이라고 불리는 논문인데, 대규모의 unlabeled text data를 어떻게 활용할 수 있는지 그 방법론을 설명한다. unlabled data vs labeled data 불균형이 엄청 큰 상황에서 unlabeled data를 버릴 순 없으니 pre-training으로 사용하자는 컨셉인데 이전에는 이게 의미가 있는지 고민하던 시기였다. 그 시점에서 충분히 의미있다고 증명해낸 논문이다.

 

내용은 간단하다. unlabeled data로 pre-training하고 labeled data로 fine-tuning하면 어떤 task든 성능이 뛴다는 것을 증명해낸 것이다. 다시 말해 사전학습 빡세게 한 backbone이 얼마나 중요한지 증명해낸 논문이다.

 

내가 지식이 짧아서 이해를 못한건지 옛날 논문이라 그런지 되게 간단해보였다. 

 

메모하며 읽기

문장 (n개의 단어)이 주어지면 1번째 단어로 2번째 단어를, 1~2번째 단어로 3번째 단어를, 1~3번째 단어로 4번째 단어를 맞추는 방식과 같이 left-to-right 방향으로 쌓아나가면서 네트워크한테 다음 단어를 맞추도록 학습시키는 방식을 소개한다.

지금 보면 간단한 방식인데, 이 당시에는 pre-training 효과를 의심하던 시기여서 그런지 이런 방식 조차 크게 다루지 않았던 것 같다.

네트워크 구조는 transformer decoder만 가져가는 방식인데 token끼리 attention을 가할 때 left-to-right 방향성이 유지되도록 했다. 즉, right token이 left token과 attention되는 것이 없음.
pre-training이 완료되고 나면 task를 확정해서 gt가 존재하는 데이터를 모으고 fine-tuning을 한다.

fine tuning 시 마지막에 MLP 하나를 달아서 확률값을 내뱉는 형태로 변형을 하고 supervision을 제공하면 끝이다. 

너무 간단해서 정리하기 민망..
fine tuning 시에 task마다 입력으로 들어가는 문장들이 서로 다를텐데 각각을 어떻게 모델링하는가? 일단 공통적으로 task에 필요한 문장들을 이어붙여 1개의 문장으로 조합하는 방식이다. 보통 2개의 문장이 1개의 문장으로 합쳐지는 구조다. 

start, extract, delim token과 같이 문장의 시작과 끝, 문장의 분리를 표현하는 특수 token을 중간에 넣기만 하고 그대로 이어 붙이는 구조로 굉장히 간단하다.

1 문장으로 정리됐다면 pre-training 시 사용했던 입력 구조와 같으므로 그대로 적용할 수 있게 된다. 
약간의 구현 디테일

여러 language task에서 pre-training한 것을 깔고 시작했을 때 성능이 뛰는 것을 보여준다. 
pre-training 된 네트워크를 쓰는 비중이 클수록 성능이 지속적으로 증가하는 결과를 관찰했고, 더 나아가 fine-tuning의 수렴 속도도 더 빨라지는 것을 보여준다.

추가적으로 데이터셋이 클수록 효과가 좋았다고 한다.
반응형