Zhangzhe's Blog

The projection of my life.

0%

GPT: Improving Language Understanding by Generative Pre-Training

URL

TL;DR

  • GPT (Generative Pre-Training) 是一种基于 transformer decoder 结构的语言预训练模型,和视觉预训练模型不同的是使用没有 label 的文本数据做自监督预训练训练。

  • GPT 训练主要分成两个步骤:

    1. 在无标注数据上做自监督预训练,具体训练目标函数是:根据前 k 个词预测下一个词
    2. 在有监督数据集上做有监督微调,具体微调目标函数是:任务相关预测 + 根据前 k 个词预测下一个词
  • 由于 transformer decoder 中存在 mask,所以不像 Bert 可以根据前后文推理中间缺失的词(完型填空任务),GPT 只能使用根据前文推后文的方法,因此也更适合做文本生成任务

  • 预训练好的模型在下游任务上微调时,只需要对网络输出头做较小的修改即可适配,效果很好。

Algorithm

  • 发展历程: Transformer -> GPT -> Bert -> GPT2 -> GPT3 -> GPT4

example

GPT 模型擅长文本生成,因此以文本生成举例:输入"Hello, world!" 要求生成后续内容。

1. tokenize

2. token embeding

  • 因为 id 串不是神经网络可以处理的格式,所以需要 id 的向量化
  • token embedding 过程本身也是一个查表过程,表格的大小是 vocabulary_size * embedding_sizeGPT-2vocabulary size == 50257embedding size == 768
  • 查表后得到一个 4 * 768token embedding

3. position embeding

  • 给每个 token id 顺序编码一个 position id, 因此 position id[0, 1, 2, 3]
  • 然后将 position id 变成模型可识别的向量,也是一个查表过程,表格本身是可以通过梯度下降学习的,表格的大小是 max_seq_len * embedding_sizemax_seq_len 表示 最大支持的上下文长度GPT-2 中为 1024
  • position embedding 只用在 transformer 第一层之前

4. 生成输入 hidden states

  • token embedding + position embedding = hidden states
  • hidden statesshape = 4 * 768

5. Casual Decoder Layer

  • 这个是 GPT 系列模型的核心,是一种因果注意力机制
  • 因果注意力(Casual)是指每个 hidden state 只能关注之前位置的 hidden state,而不能关注之后的
  • 例如: Hello, world!seq_len == 4,那么注意力矩阵是 4x4,但此矩阵需要是下三角矩阵,即 “,” 只能关注 Hello,而不能关注 world

6. Casual Decoder Layer 输出的 hidden states 再输入下一层 Casual Decoder Layer

  • 输出的 hidden states 和输入的 hidden statesshape 保持一致
  • 再输入下一层 Casual Decoder LayerGPT-212

7. 最后一层输出的 hidden states 的最后一个 hidden state 用于分类

  • 经过重复 12 层的 Casual Decoder Layer,最后输出 hidden states (shape = 4 x 768)
  • 取最后一维 hidden state (shape = 1 x 768) 通过一层或多层 fully connect 映射到 vocabulary size
  • vocabulary size 上取 argmax 得到最大概率的下一个词

8. 合并预测到的词到语句末尾

  • 如果预测的词不是结束符,且语句总长小于 max_seq_len,则将预测得到的词加到原语句末尾
  • 加完之后的长度为 5 的语句继续通过 12Casual Decoder Layer 去预测下一个词
  • 重复直到结束符或 max_seq_len

model architecture

  • token embedding

gpt2-token-embeddings-wte-2.png

  • postion embedding

gpt2-positional-encoding.png

  • model architecture

gpt2-input-embedding-positional-encoding-3.png

Unsupervised pre-training

  • 使用标准语言建模(用前面的词预测下一个词)目标来最大化如下的似然函数:
    目标函数: L1(U)=ilogP(uiuik,...,ui1Θ)L_1(U)=\sum_ilogP(u_i|u_{i-k},...,u_{i-1} | \Theta)
    其中:U 表示 token 的上下文向量,k 为窗口大小, Θ\Theta 为模型参数

  • 模型使用 Transformer decoder 结构,整体计算流程可简写为:

    • h0=UWe+Wph_0=UW_e+W_p
    • hl=transformerblock(hl1),   i[1,n]h_l=transformer\\_block(h_{l-1}),\ \ \ \forall i\in[1,n]
    • P(u)=softmax(hnWeT)P(u)=softmax(h_nW_e^T)

    其中: n 表示 transformer 层数,U 表示上下文 tokenWeW_e 表示 tokenembedding 矩阵, WpW_p 表示 position embedding 矩阵

Supervised fine-tuning

  • 有监督 fine-tuning 使用的数据可表示为:

    • 输入 x1,x2,...,xmx_1, x_2, ..., x_m
    • 标签 y
  • 预测 P(yxi,...,xm)=softmax(hlmWy)P(y|x_i,...,x_m)=softmax(h_l^mW_y) 这里使用 最后一个一层的最后一个 token 对应的输出

  • 因此,有监督目标函数为: L2(C)=(x,y)logP(yx1,...,xm)L_2(C)=\sum_{(x,y)}logP(y|x_1,...,x_m) ,其中 C 表示 fine-tuning 使用的有标签数据集

  • 作者发现在 fine-tuning 阶段,加上无监督损失函数效果会更好,即: L3(C)=L2(C)+λL1(C)L_3(C)=L_2(C)+\lambda * L_1(C)

Task-specific input transformations

  • 本节讨论的是在 fine-tunning 以及 inference 阶段如何构造模型输入

GPT.png

  • 上图举例了四个常见 NLP 任务:

    • 分类:图中的 StartExtract 分别是两个保留的特殊 token,分别表示输入的开始和输出特征的抽取(linear 层只输入 transformer 最后一层的最后一个 token 的输出,因此在最后填充一个 Extract 特殊标记 token)

    • 蕴含:用于分析 前提(premise) 是否蕴含 假设(hypothesis),本质是一个 蕴含 / 不蕴含 / 不确定 三分类问题,中间的 Delim 是特殊标识 token,表示分割含义

    • 相似:用于分析两个句子是否具有相似关系,由于相似具有对称性,所以需要构造两种顺序的输入,本质是二分类

    • 多选:其中 context 包含上下文文本和问题,需要针对每个答案构建一个 contextanswer 对,最后用 softmax 计算 answer 概率分布

Thought

  • GPT 使用了 Transformer decoder,由于 mask 的存在,无法知道之后的句子,因此选择了比 Bert 更难的标准语言建模(根据前 k 个词预测下一个词)的代理任务,对应的模型无监督预训练效果上限也相应提高。
  • 由于 Bert 使用的 Transformer encoder,因此可以看到句子的上下文,因此 Bert 使用了较为简单的完形填空无监督目标函数。
  • Bert 晚于 GPT,借鉴了很多 GPT 的思想,效果也优于 GPT,但 GPT 开启了语言模型无监督预训练先河,有可能成为 AIGC 的原型机。