Post

[Paper]GPT1

OpenAI에서 2018년에 발표한 “Improving Language Understanding by Generative Pre-Training”은 GPT(Generative Pre-trained Transformer)라고 불리는 언어 모델을 소개합니다.

Ⅰ. Introduction

unlabeled data에서 언어의 정보를 얻는 모델은 NLP에서의 지도 학습 의존도를 완화하는 방법을 제공합니다.

이러한 데이터의 좋은 표현을 학습하는 것은 상당한 성능 향상을 이루지만 word-level의 정보를 활용하는 것은 어렵습니다. 먼저 어떤 타입의 최적화 목표가 텍스트 표현 학습에 유용한지 확실하지 않고, 학습된 표현을 목표 작업으로 전달하는 효과적인 방법도 없습니다. 이러한 불확실성들이 언어 처리를 위한 효과적인 준지도 학습 접근 방법을 어렵게 만들고 있습니다.

해당 논문에서 준지도 사전학습과 지도 파인튜닝의 결합을 사용하여 준지도 접근법을 소개합니다. 다양한 작업에서 전달가능한 일반적인 표현을 학습하는 것이 목표입니다.

두 단계의 학습 절차를 소개합니다. 처음으로 unlabeled data에서의 언어 모델링 목적을 NN model에서 초기 파라미터를 학습하는 것이고, 해당 파라미터를 연관된 supervised objective를 사용하여 목표 작업의 파라미터로 채택하는 것입니다.

ⅰ. Semi-supervised learning

해당 연구는 넓은 범주로 준지도 학습에 속합니다. 초기의 접근법은 unlabeled data를 계산하여 지도 학습의 특성으로 사용했습니다. 최근 몇년동안 word embedding의 유용함을 설명하였습니다. 그러나 word-level 정보를 전달하는데 중점을 두었지만 여기서는 높은 수준의 의미를 수집하는데 중점을 두었습니다.

ⅱ. Unsupervised pre-training

비지도 사전학습은 준지도 학습의 특별한 케이스로 지도 학습 목표를 수정하는 대신 좋은 초기화 지점을 찾는 것이 목표입니다.

해당 연구와 유사한 연구들은 언어 모델링 목표를 사용하는 사전학습 신경망과 지도 학습 목적으로 목표 작업에서 파인튜닝 하는 것입니다.transformer 아키텍처를 통해 긴 범위의 언어 구조를 수집할 수 있도록 했습니다.

ⅲ. Auxiliary training objectives

보조 비지도 학습 목표를 더하는 것은 준지도 학습의 대체 형태입니다. 해당 연구에서도 보조 목표를 사용했습니다. 하지만 앞서 설명했듯이 비지도 사전학습은 이미 몇몇의 목표 작업과 관련된 몇몇의 언어학적인 측면을 학습합니다.

Ⅲ. Framwork

학습 단계는 두 단계로 구성되어 대량의 텍스트 말뭉치에서 고용량 언어 모델을 학습하고, 미세조정 단계에서 labeled data를 가지고 판별 작업을 진행합니다.

ⅰ. Unsupervised pre-training

토큰 말뭉치 \(U = {u_1, . . . , u_n}\)가 주어졌을 때, 아래와 같은 우도를 최대화하는 표준 언어 모델링 목표를 설정할 수 있습니다.

\[\begin{equation} L_1(U) = \sum_{i} \log P(u_i \vert u_{i-k}, . . . , u_{i-1}; \Theta) \tag{1} \end{equation}\]
  • k: context window
  • P: Θ 파라미터를 가지는 신경망을 사용하여 모델링된 조건부 확률

언어 모델을 위한 다층 Transformer decoder를 사용합니다. 이러한 모델은 멀티헤드 셀프 어텐션 연산자를 입력 context 토큰에 적용한 후 위치별 피드포워드를 통해 목표 토큰에 대한 출력 분포를 생성합니다.

\[\begin{equation} \begin{array}{ll} h_0 = UWe + W_p \\ h_l = \text{transformer_block}(h_{l-1}) \quad \forall i \in [1, n] \\ P(u) = softmax(h_n W^T_e) \end{array}{ll} \tag{2} \end{equation}\]
  • \(U = (u−k, . . . , u−1)\) : 토큰의 컨텍스트 벡터
  • n : 레이어의 수
  • \(W_e\) : 토큰 임베딩 행렬
  • \(W_p\) : 위치 임베딩 행렬

ⅱ. Supervised pre-training

앞선 모델을 훈련한 후 파라미터를 지도 목표 작업으로 사용합니다.

위와 같이 입력 토큰의 시퀀스 \(x_1, . . . , x_m\)와 label y가 주어졌을때, 입력이 사전학습된 모델을 통해 최종 transformer block의 활성화 \(h_m^l\)를 얻은 후 추가적인 성형 출력 층의 \(W_y\) 파라미터로 전달되어 y를 예측합니다.

\[\begin{equation} P(y|x_1, . . . , x_m) = softmax(h_m^l W_y) \tag{3} \end{equation}\]

따라서, 아래와 같은 목적을 최대화합니다.

\[\begin{equation} L_2(C) = \sum_{(x,y)} \log P(y|x_1, . . . , x_m) \tag{4} \end{equation}\]

추가적으로 아래와 같이 언어 모델에 보조 목적으로 미세 조정을 포함시키면 (1)지도학습된 모델의 일반화를 향상시키고, (2)수렴을 가속화하는데 도움을 줍니다.

\[\begin{equation} L_3(C) = L_2(C) + \lambda \cdot L_1(C) \tag{5} \end{equation}\]

미세 조정 중에 추가로 필요한 파라미터는 Wy 및 구분자 토큰에 대한 임베딩뿐입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Transformer block
def block(x, ...):
    with tf.variable_scope(scope):
        nx = shape_list(x)[-1]
        a = attn(x, 'attn', nx, n_head, train=train, scale=scale)
        n = norm(x+a, 'ln_1')
        m = mlp(n, 'mlp', nx*4, train=train)
        h = norm(n+m, 'ln_2')
        return h

# classifier
def clf(x, ny, ...):
    with tf.variable_scope('clf'):
        nx = shape_list(x)[-1]
        w = tf.get_variable("w", [nx, ny], initializer=w_init)
        b = tf.get_variable("b", [ny], initializer=b_init)
        return tf.matmul(x, w)+b

# GPT1
def model(X, M, Y, ...):

    ...

    h = embed(X, we)
    for layer in range(n_layer):
        h = block(h, ...)
    lm_h = tf.reshape(h[:, :-1], [-1, n_embd])
    lm_logits = tf.matmul(lm_h, we, transpose_b=True)

    # Unsupervised pre-training
    lm_losses = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=lm_logits, labels=tf.reshape(X[:, 1:, 0], [-1]))
    
    ...

    clf_logits = clf(clf_h, 1, train=train)
    clf_logits = tf.reshape(clf_logits, [-1, 2])

    # Supervised pre-training
    clf_losses = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=clf_logits, labels=Y)
    return clf_logits, clf_losses, lm_losses

ⅲ. Task-specific input transformations

1 Figure 1 : (Left) 트랜스포머 아키텍처 (right) 작업 별 미세조정을 위한 입력 변환

traversal-style 접근법을 사용하여 구조화된 입력을 사전학습 모델이 처리 가능한 정렬된 시퀀스로 전환합니다. 이러한 입력 변환은 작업별로 전환할 필요가 없게하는 것을 보여줍니다.

  • Textual ntailment : Delim Token($)으로 문장을 연결합니다.
  • Similarity : 두 문장의 순서가 정해져 있지 않음으로 가능한 순서를 독립적으로 처리
  • QA & Commonsense Reasoning : 문서 context와 질문을 각 가능한 답변과 결합하여 해당 모델에 독립적으로 처리한 다음 softmax를 통해 가능한 답변의 분포를 생성합니다.

Ⅳ. Analysis

NLI, Question answering and commonsense reasoning, Semantic Similarity, Classification 등 다양한 작업에서 우수한 성능을 나타냈다. 2 Figure 2 : (좌) 사전학습된 LM 층 수의 증가 효과 (우) LM 사전학습 갱신 함수에 따른 작업별 zero-shot 성능 효과

  • Impact of number of layers transferred

    Transformer 층의 수의 증가로 성능이 향상되는 것을 확인 가능하며 이것은 임베딩을 전달하는 것으로 성능이 향상되는 것을 의미합니다. 즉, 사전 학습된 모델을 통해 LM이 작업에 필요한 정보를 효과적으로 전달할 수 있음을 나타냅니다.

  • Zero-shot Behaviors

    사전학습된 LM에 Transformer가 효과적인 이유로 생성 모델이 성능을 향상시키기위해 다양한 작업의 수행을 학습하고, Transformer의 attentional 메모리가 LSTM과 비교하여 Transfer를 지원하는 것입니다.

    미세조정 없이 기존의 생성 모델을 사용하여 작업을 수행하는 휴리스틱 방법을 설계하여 성능이 학습동안 안정적으로 증가하는 것을 확인할 수 있었고, 이는 다양한 작업 관련 기능을 지원한다는 것입니다.

  1. Improving Language Understanding by Generative Pre-Training
  2. OpenAI GPT github



This post is licensed under CC BY 4.0 by the author.