논문

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

송채채 2024. 2. 1. 11:12

이 글은 GPT-1의 논문인 Improving Language Understanding by Generative Pre-Training (Radford et al., 2018)을 리뷰합니다.

2018년에 등장한 Generative Pre-trained Transformer(GPT-1)은 자연어 처리 분야에서의 초기 모델 중 하나로, 이미지 기반의 pre-training을 자연어 처리에 적용한 첫 논문입니다. 이 모델은 12개의 트랜스포머 레이어를 쌓아서 사용되었으며, 동일한 모델을 다양한 자연어 처리 태스크에 활용하기 위해 추가 작업이 이루어졌습니다. 모델은 512 토큰 길이와 1.17억 개의 파라미터를 사용하며 당시에는 큰 규모의 모델로 여겨졌습니다.

GPT-1은 대규모 라벨이 없는(unlabeled) 데이터셋을 활용한 사전 훈련 후, 각 태스크에 맞게 미세 조정(fine-tuning)을 수행함으로써 하나의 모델로 다양한 자연어 처리 태스크에서 최고 수준의 성능(State Of Art)을 보여주었습니다. 이후 GPT-1은 자연어 처리 분야의 연구에 기여하고, GPT-2, GPT-3, GPT-4 등의 후속 모델의 개발로 이어지게 되었습니다.


GPT-1이 해결하고자 한 문제는 다음 2가지가 있습니다.

  1. 당시 연구는 각각의 태스크에 맞는 목적함수가 제안하는 방향이었기 때문에, 어떤 손실함수가 다양한 태스크에 효율적으로 전이(transfer) 할 수 있는 목적함수인지를 알기 어렵습니다.
  2. 범용적인 태스크에 대해 학습된 표현을 각 target task에 맞게 변형하는 과정을 어떻게 해야 가장 효율적인지를 알 수 없었습니다. 즉, 태스크마다 데이터셋 구조와 정답 레이블이 다르므로 어떤 형식으로 변환하는 과정을 거쳐야할 지가 문제였습니다.

GPT는 이러한 문제점을 해결하기 위해 transformer모델을 사용합니다.

Framework

  • 모델의 학습 과정은 2개의 stage로 구성됩니다.
  1. 첫번째 stage는 대량의 텍스트로 높은 범용성의 language model을 학습시킵니다.
  2. 두번째 stage는 labeled 데이터를 이용해서 개별 태스크에 맞게 fine-tuning을 진행합니다.

첫번째 stage - Unsupervised pre-training

$$L_1(U) = \sum_i \log P(u_i | u_{i-k}, \ldots, u_{i-1}; \Theta)$$

이 수식은 GPT-1 모델의 비지도 학습을 나타내는데 사용되는 손실 함수입니다.

  • L_1(U): 비지도 학습을 위한 손실 함수
  • sum_i: 시퀀스 U의 모든 토큰에 대한 합을 나타냄
  • log P(ui | u{i-k}, \ldots, u{i-1}; \Theta): 현재 토큰 u_i가 주어진 이전 토큰들 u{i-k}, \ldots, u_{i-1}에 대한 조건부 확률의 로그값
  • Theta: 모델 파라미터
  1. Context Window 설정: k는 context window의 크기를 나타냅니다. 예를 들어, k = 2라면 현재 토큰의 예측은 이전 두 토큰에 의존합니다.
  2. 조건부 확률 모델: P(ui | u{i-k}, \ldots, u_{i-1}; \Theta)는 현재 토큰 u_i가 이전 토큰들에 대해 주어졌을 때의 조건부 확률을 나타냅니다.
  3. 합산: 모든 토큰에 대한 log를 합하여 손실 함수를 계산합니다. 이 손실 함수는 모델이 주어진 문맥에서 다음 토큰을 얼마나 잘 예측하는지를 나타냅니다.
  4. SGD(stochastic gradient descent): 손실 함수를 최소화하기 위해 모델 파라미터 Theta는 경사하강법(SGD)을 사용하여 학습됩니다. SGD는 손실을 최소화하기 위해 모델 파라미터를 조정하는 최적화 알고리즘 중 하나입니다.

이런 방식으로 GPT-1은 주어진 문맥에서 다음 토큰을 예측하는 데 초점을 맞추어 비지도 학습을 수행하며, Transformer 구조를 사용하여 문맥의 긴 거리 의존성을 효과적으로 학습합니다.


모델은 multi-layer Transformer decoder로 구성됩니다.

$$h_0 = UW_e + W_p$$

$$h_l = {transformer_block}(h_{l-1}) \quad \forall i \in [1, n]$$

$$P(u) = {softmax}(h_nW_e^T)$$

  • U: u_{-k}, \ldots, u_{-1}의 토큰들을 포함하는 context vector를 나타냄. 현재 토큰과 연관된 이전 토큰들의 정보를 담고 있음
  • W_e: 토큰들을 임베딩하는 데 사용되는 행렬로, 각 토큰에 대한 임베딩을 포함함
  • W_p: 문장 내 단어의 상대적인 위치 정보를 포함하는 행렬. Transformer 모델은 위치 정보를 더하여 단어의 순서 정보를 고려할 수 있음
  1. h_0: 초기 hidden state (h_0)는 주어진 토큰의 context vector를 토큰 embedding matrix (W_e)와 곱하고, position embedding matrix (W_p)를 더하여 얻어집니다.
    • 이렇게 얻어진 초기 hidden state는 Transformer의 첫 번째 레이어에 입력으로 사용됩니다.
  2. h_l : l번째 레이어의 hidden state를 나타냅니다. 각 레이어는 Transformer 블록에 의해 처리됩니다. transformer_block 함수는 이전 레이어의 hidden state를 입력으로 받아 해당 레이어에서의 hidden state를 반환합니다. 이러한 과정이 n번 반복됩니다.
  3. P(u): 앞 수식에서 처리된 h_n 토큰은 embedding matrix (W_e)와 내적한 후 softmax 함수를 적용하여 확률 분포로 변환됩니다. 이렇게 얻어진 확률 분포는 주어진 문맥에서 다음 토큰의 확률을 나타냅니다.

두번째 stage - Supervised fine-tuning

Unsupervised pre-training 후, 각 target task에 대해 supervised learning을 진행하는데, 이때 목적함수로 L2 손실을 사용합니다.

$$P(y | x_1, \ldots, x_m) = {softmax}(h_m \cdot W_y)$$

$$L_2(C) = \sum_{(x, y)} \log P(y | x^1, \ldots, x^m)$$

  1. 첫번째 수식: 입력된 x에 대한 y의 확률을 softmax 함수를 통해 계산합니다.
  2. 두번째 수식: 라벨이 있는 데이터셋 C에 대한 손실함수가 최소화되도록 모델을 학습시킵니다.

또한 fine-tuning 과정에서 아래와 같이 언어 모델의 목적함수를 추가적인 auxiliary 목적함수로 지정해줄경우 L3(C) 다음과 같은 장점을 얻을 수 있다.

 

$$L_3(C) = L_2(C) + \lambda \cdot L_1(C)$$

 

여기서 L_3는 최종 손실 함수이며, L_2는 주어진 태스크에 대한 손실 함수, L_1은 auxiliary 목적함수에 해당합니다. lambda는 두 손실 함수 간의 상대적인 중요성을 나타내는 하이퍼파라미터입니다.

예를 들어, 두 문장의 유사도를 예측하는 작업이 주어졌다고 가정하면:
L_2 함수가 주어진 문장 쌍에 대한 "entailment" (함의), "contradiction" (모순), "neutral" (중립)의 확률을 출력하고, 이것을 정답 레이블과 비교하여 오차를 계산합니다.

동시에 L_1 함수는 언어 모델이 주어진 문장에서 다음 토큰을 얼마나 정확하게 예측하는지에 대한 오차를 계산합니다. 부가적으로 사용하는 auxiliary 목적함수는 L_2와 L_1을 함께 최적화하므로, 주어진 작업뿐만 아니라 언어 모델 자체의 품질도 향상시키는 데 도움이 될 수 있습니다.

Task-specific input transformations

text classification 같은 경우, 아무런 수정없이 이전에 언급한 방식으로 바로 파인튜닝을 진행할 수 있습니다. 하지만, 2-3개의 문자쌍으로 구성된 텍스트를 입력으로 받는 task의 경우 입력 형태를 변환해주어야 합니다.

모든 변환은 임의로 초기화된 (randomly initailized) 시작토큰(start) 종료토큰(end)을 추가합니다. 여러개의 문자쌍은 delimeter 토큰은($)를 넣어서 태스크에 맞게 구분합니다.

  1. Textual Entailment (함의 분류):
    • 입력: 전제 문장과 가설 문장의 토큰 시퀀스를 연결합니다.
    • 연결 시 구분자 토큰 ($)을 사이에 둡니다.
    • 예시: "The cat is on the mat $ The mat is under the cat"
  2. Similarity (유사도):
    • 입력: 두 문장 A,B 중에 무엇이 먼저 들어오든 상관이 없어야합니다. (유사도 작업이기 때문에)
    • 예시: "Sentence A"와 "Sentence B"를 고려할 때, "Sentence A $ Sentence B"와 "Sentence B $ Sentence A" 두 가지 순서를 각각 모델에 입력합니다.
  3. Question Answering (질문 응답) 또는 Commonsense Reasoning (상식적 추론):
    • 입력: 각 답변을 문맥과 질문 사이에 구분자 토큰으로 두어 연결합니다.
    • 예시: "Context document"와 "Question"에 "Answer 1"를 고려할 때, "[Context document $ Question $ Answer 1]"와 같이 구성합니다.

참고자료

  • Radford, A. et al. (no date) ‘Improving language understanding by generative pre-training’. [바로가기]
  • [논문리뷰] GPT-1: Improving language understanding by generative pre-training 논문 리뷰 [바로가기]
  • [논문리뷰] GPT-1 : Improving Language Understanding by Generative Pre-Training (OpenAI) [바로가기]
  • [논문리뷰] GPT-1 리뷰 [바로가기]
  • 목적 함수(Objective function)와 최적화(Optimization) [바로가기]
  • 목적함수 손실함수 비용함수 차이 [바로가기]
  • 06-09 소프트맥스 회귀(Softmax Regression). 딥 러닝을 이용한 자연어 처리 입문 [바로가기]
  • 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다. [바로가기]

 

반응형