[논문 리뷰]Improving Language Understanding by Generative Pre-Training - GPT

찬호·2023년 12월 1일
0

Preface

이번 시간에는 자연어처리에서 많이 사용하는 Open Ai의 GPT - Generative Pretrained-Transformer 의 시초를 알린 논문을 읽어보겠습니다. 이번 시간의 핵심은 'Generative Pre-Training', 즉 생성적 사전 학습 방법론에 있습니다. 이 접근 방식은 대규모 데이터셋에서 언어 모델을 먼저 학습시킨 후, 특정 작업에 대해 미세 조정하는 방식을 채택하고 있습니다.

Motivation

회귀나 분류 등 다양한 task를 진행하기 위해 매번 아키텍쳐를 만드는 것은 시간이 오래 걸립니다. 하지만 Transformer 모델의 등장으로 긴 문장에 대한 학습이 가능해졌고, 문장의 길이 상관없이 문장을 미리 학습시켜놓으면 더 좋은 모델을 만들 수 있지 않을까? 라는 생각과 Word_embedding과 같이 Pre_trained 된 모델을 사용하여 시간을 줄이자는 의미로 Transformer를 기반으로한 Pre-trained 모델 GPT가 등장하였습니다.

1. Introduction

기계 학습의 의존성을 완화하기 위해, raw text를 효율적으로 배우는 능력은 중요합니다. 대부분의 딥러닝 모델은 상당히 많은 labeled_data를 필요로 합니다. 이러한 상황에서, unlabeled_data로 부터 정보를 얻을 수 있는 모델은 매우 가치있는 대안이 될 수 있고, 학습의 속도도 빠르게 할 수 있다. (ex : Pre-trained 된 Word_Embedding)

하지만 위 논문에서는 이런 unlabeled_data로 부터 단어 수준 이상의 정보를 활용하는 것은 2가지의 이유로 힘들다고 한다.

  1. 위에서 Word_Embedding처럼 Pre-trained 했던 모델을 다른 용도로 transfer(특정 작업의 용도로 바꾸어 주는 것)에서 어느 최적화 방법이 가장 효율적인지 모른다. (Language model, Machine Translation, discourse coherence와 같은 tast 에서도 다양한 optimization objective이 있음. )

  2. target task에 pre-trained 한 representation 들을 transfer하는 가장 효율적인 과정에 대한 의견도 없다. (현재의 technique들은 복잡한 학습 구조와 보조적인 학습 objective를 추가해서 변화를 추구함.)

    이러한 불확실한 점들로 인해, effective 한 semi-supervised 학습이 발전하기 어려워졌다고 합니다.

    그리하여 위 논문에서는 unsupervised pre_training과 supervised fine-tuning을 통해서 semi-supervised한 학습 방법을 찾았습니다.

첫째 : unlabeled_data를 가지고 모델을 학습하여 neural network model의 초기 파라미터 값을 학습한다.

둘째 : 이 파라미터 값(ex : 가중치)를 가지고 fine tuning을 진행하여, supervised learning을 진행하게 된다.

위 논문에서는 Transformer 구조를 사용하고, transfer 과정에서, 모델이 할 수 있는 테스크 마다 input adapation(input data가 다르기 때문에)을 사용하는데, 한 개의 연속된 문장으로 데이터를 처리함.


Semi - supervised learning for NLP

NLP에서 semi-supervised learning은 점점 인기가 많아 지고 있는데, sequence labeling이나 text classification 등 다양한 분야에 적용될 수 있다. 지난 몇 년간, Word Embedding과 같은 unlabeled한 data를 통한 task도 늘었다. 하지만 unlabeled한 데이터로부터 word-level(단어 수준)이 아닌 word-level semantics (의미론적)까지 올리는 것을 목표로 하였다.

Unsupervised pre-training

Unsupervised pre-training은 가중치의 초기 start를 잘 하기 위함이다. 과거에는 이미지 분류, 예측 등에 사용되었고, 최근에는 다양한 모델이 초기에 더 학습이 잘 되게 함을 도와주는 방식으로 사용된다. 기존에 Image를 다루는 분야에서는 pre-trained 을 통해 모델 성능을 높이고, 하는 task에 맞게 fine -tuning 하는 구조로 바뀌었다고 한다. 그리하여 fine tuning만 하더라도 능률이 굉장히 올라갔다고 함.

Auxiliary training objectives

unsupervised learning의 보조 도구를 추가하는 건 semi-supervised learning의 대안이라고 볼 수 있는데, Pos tagging, chunking, named entity과 같은 task(Unsupervised learning)을 사용하여 학습에 도움을 줌.


3. Framework

위 논문에서는 학습 순서를 2가지로 하였는데, 첫 번째는, 많은 텍스트를 language model에 학습시킨다. 두 번째로, labeled_data를 가지고 fine tuning을 진행하는 것이다.

3.1 Unsupervised pre-training

Unlabeled된 corpus of tokens U=[u1,u2,u3,un]\mathcal{U} = [u_{1}, u_{2}, u_{3} \cdots, u_{n}] 을 가지고, 다음과 같은 function을 maximize하는 것을 목표로 한다.

L1(U)=ilogP(uiuik,,ui1;Θ)L_{1}(\mathcal{U}) = \sum_{i}\log P(u_{i}|u_{i-k}, \cdots, u_{i-1};\Theta)

여기서 kk는 context window의 size이다. optimizer는 SGD를 사용. 확률 값에서는 k개의 단어를 사용하여 그 다음 uiu_{i}가 나올 확률을 최대한 max\max하는 것이다.

구조는 Transformer Decoder 모델을 여러 layer를 쌓아서 사용하고, 식은 다음과 같다

h0=UWe+Wphl=transformer block(hl1)for all i in NP(u)=softmax(hnWeT)h_{0} = UW_{e} + W_{p} \\ h_{l} = transformer_\ block(h_{l-1}) for \ all \ i \ in\ N\\ P(u) = softmax(h_{n}W^T_{e})

여기서 U=(uk,,u1)U = (u_{-k}, \cdots, u_{-1})는 token들의 context vector, n 은 layer의 수, WeW_{e}는 토큰 임베딩의 행렬, WpW_{p}는 position embedding matrix 이다.

그래서 위의 그림을 보면, 12개의 transformer를의 Encoder를 쌓아 만든 구조임을 알 수 있다. Transformer의 구조가 궁금하다면, 내가 작성한 Transformer의 글을 참고하세요.

[논문 리뷰] Attention is All you need

3.2 Supervised fine-tuning

앞의 학습이 끝나면, 이젠 우리가 아는 Supervised-learning을 진행하면 된다. Input data는 C=(x1,x2,,xm)\mathcal{C} = (x^1, x^2, \cdots, x^m)로 구성되어 있고, 이에 대한 ylabely_{label}들도 있다. Input data는 Pre-trained 했던 trasnformer 구조를 그대로 지나며, hlmh^m_{l}를 얻고, P(yx1,,xm)=softmax(hlmWy)P(y|x^1, \cdots, x^m) = softmax(h^m_{l}W_{y})를 사용하여 이 확률(L2(C)L_{2}(\mathcal{C}))이 가장 높은 값을 가지게 학습 형태를 지니는 것이다.

L2(C)=(x,y)logP(yx1,,xm)L_{2}(\mathcal{C}) = \sum_{(x,y)}{\log P(y|x^1,\ldots, x^m)}

위 그림에서 알 수 있듯이, fine tuning을 진행하면 학습 과정을 뭐로 하냐에 따라 Classification, Entailment, Similarity 등 다양한 task를 더 효율적으로 진행할 수 있다.

결론적으로, 각각의 function 값을 최대로 하고, 이들의 balance를 맞추기 위해서 위와 같은 식으로 정리를 하였다.

L3(C)=L2(C)+λ L1(C)L_{3}(\mathcal{C}) = L_{2}(\mathcal{C}) + \lambda \ * L_{1}(\mathcal{C})

아래 λ\lambda를 수정하며 학습 과정을 검사하였다.

3.3 Task-specific input transformations

위 그림에서 나와있듯이, Classification은 그냥 text 그 자체로 넣어주면 되고, Multiple choice나 Entailment과 같은 task는 어느정도 변환을 해주기만 하면 가능하다. 옛날의 tast들은 특정 task를 위한 아키텍쳐를 만들었어야 되었지만 이제는 아키텍쳐 보다는 단순하게 input의 형태를 바꿔서 모델 학습 시간을 전체적으로 줄여주게 된다.


4. Experiments

4.1 Setup

각각의 Task에 맞게 Dataset의 특징을 살려서 학습을 진행하였다.

<Model specifications >

위 모델은 기본적인 Transformer 구조로, masked self - attention heads 를 통해 학습을 하였다. (기본의 self-attention heads 구조와 조금 다르다)

신기한 점은 Transformer 구조에서 원래 sinusoidal embedding 보다 learned positional embedding을 사용했다는 점이다.

4.2 Supervised fine-tuning

실제 각 Task에서 높은 수치 값을 보여준다.

한줄로 요약하면?

원래 모델은 input_data만으로 미리 학습시킨(Pre-trained) generative language model을 fine-tuning 하여 성능이 굉장히 높아졌다!

profile
그냥 끄적여 보는 논문..

0개의 댓글