이번주 부스트캠프 논문 스터디에서 고른 논문은 GPT-1이다.
이 논문은 BERT와 함께 pre-trained model의 2대장 같은 느낌으로 자주 거론되는 논문이다. 지금까지 GPT-3까지 나와있으며 학습 방법은 1, 2, 3 셋 모두 크게 다르지 않다.
GPT-1의 특징을 짧게 이야기해보면 다음과 같다.
GPT-1은 BERT와 마찬가지로 pre-trained model을 각 down-stream task에 맞게 다시 fine-tune하는 pre-trained model이다. BERT에서는 output layer를 변경시키고, task별 input을 넣어주면 fine-tuning이 되었다. GPT도 마찬가지로 model의 변경없이 각 down-stream task별로 input의 형태를 다르게 하여 fine-tuning을 수행한다. 논문의 저자는 이렇게 모델의 구조에는 변경없이 입력 형태만을 바꾸어 넣는 모델을 task-agnostic model이라고 일컫는다.
GPT-1의 pre-training은 대량의 unlabeled text data를 이용해 language modeling objective로 학습을 진행하고, fine-tuning시에는 각각의 task별로 다른 입력을 넣어 task별 supervised objective로 fine-tuning을 진행한다.
GPT-1의 pre-training은 앞서 말했듯이 standard language modeling objective를 이용해서 학습한다.
위 수식이 GPT-1의 pre-training을 나타내는 수식이다. size가 k인 context window내의 단어들을 이용해 i번째 단어 를 예측해나가며, 이 때 해당 objective는 Transformer decoder layer를 여러 층 쌓아서 사용한다.
Transformer decoder 이용한 target token 예측 과정
여기서 는 token들의 context vector를, n은 decoder layer 수를, 는 각각 embedding matrix, position embedding matrix를 나타낸다.
Pre-training 단계에서는 unlabeled data를 사용하기 때문에 저자는 이를 unsupervised pre-training이라고 이름 붙인다. ( : Unlabeled data)
Unsupervised pre-training 단계가 끝난 후 각 down-stream task별 labeled data를 이용해 fine-tuning을 진행하게 되는데, 이는 pre-trained model을 그대로 사용하고 마지막 layer에 linear layer를 하나 추가해서 각 down-stream task별 출력을 얻어낸다.
Fine-tuning에서 사용하는 objective 또한 pre-training과 마찬가지로 standard language modeling을 사용했고, 특이한 점으로는 fine-tuning시에 pre-training objective를 fine-tuning시에 함께 이용했다는 것이다(auxiliary objective).
여기서 는 labeled dataset을, y는 각 input sequence ()의 label을 의미한다. 이렇게 fine-tuning 단계를 구성하게 되면 추가적으로 필요한 parameter는 마지막 layer의 weight matrix 와 각 task별로 필요한 delimeter의 embedding밖에 없게 된다.
저자는 GPT-1에서 사용된 auxiliary objective가 성능 개선에 영향을 주지않는다고 판단하여 이후 GPT-2부터는 빠지게 된다.
위의 그림은 각 down-stream task별로 달라지는 input 형식을 나타낸 것이다. 그림에서 볼 수 있듯이 각 task별 input들은 모두 동일하게 Start token으로 시작해서 Extract token으로 끝나는 구조를 가지고 있으며, 여러 문장으로 구성될 경우 중간에 문장과 문장을 구분지어주는 Delimeter token을 삽입해준다.
Similarity task를 보면 특이하게 Text1 - Text2, Text2 - Text1으로 입력을 순서만 바꿔서 두 번 넣어주는데, 이는 standard language modeling objective의 unidirectional한 특성 때문에 Text2에 대한 Text1의 similarity, Text1에 대한 Text2의 similarity를 각각 따로 측정한 후 element-wise로 더해 사용하는 방식을 채택했다.
GPT-1은 12개의 task 중에서 9개에서 큰 성능 개선을 이끌어냈다. 또한 저자는 transfer에 대한 실험도 진행했다.
위의 실험 결과를 보면 왼쪽은 fine-tuning시 transfer한 pre-trained layer 수에 따른 성능의 향상 폭을 나타낸 것이고, 오른쪽은 pre-training 횟수에 따른 각 task별 zero-shot 성능의 향상 폭을 나타낸 것이다.
그래프를 해석해보면
로 볼 수 있다. 저자는 아마 여기서 영감을 얻어 GPT-2에서 모델의 크기를 늘리고, zero-shot setting으로 실험을 진행한 듯 보인다.
위 표는 각 기법별로 성능을 점검한 것인데, 맨 위는 GPT-1 모델 전체를 의미하고, 그 아래에는 순서대로
1. Pre-training없이 Supervised learning만 진행
2. Fine-tuning 단계에서 Auxiliary objective없이 진행
3. Transformer 대신 LSTM으로 바꿔서 진행
을 나타낸다.
결과를 보면 pre-trianing 없이 supervised learning만 진행했을 경우 모든 task에서 성능이 크게 하락한 것을 알 수 있으며, auxiliary objective를 제거한 경우 오히려 성능이 오른 것을 알 수 있다. 또한 Transformer decoder 구조가 성능에 큰 영향을 줌을 알 수 있다.
사실 나는 GPT 모델을 그렇게 좋아하지는 않는다. BERT와 달리 OpenAI에서 pre-trained model을 공개하지도 않을 뿐더러 내가 보기에는 그냥 거대한 데이터셋과 거대한 모델을 사용해 많이 학습시켰더니 잘하더라 정도로 밖에 해석이 안된다. 이건 그냥 영어를 못하는 사람 한명 붙잡고 수십만개의 영단어를 외우게 했더니 영어를 잘하더라 라는 단순한 내용이랑 다른 것을 딱히 못찾겠어서 아직도 큰 흥미는 못느끼겠다.
그래도 GPT는 확실히 NLP에서 빅 모델의 중요성을 깨우치게 해준 모델이라는 사실은 변함없지 않을까 하는 생각은 든다. (나는 BERT가 더 좋다...)