GPT模型:Improving Language Understanding by Generative Pre-Training

参考链接

https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf
https://github.com/openai/finetune-transformer-lm

论文模型概述

  • 论文模型训练过程包括两步:
    • 第一步: 在大预料库训练高容量的语言模型;
    • 第二步: 要特殊任务的有标签的数据集上微调预训练的语言模型

第一步:无监督预训练

  • 使用语言模型最大化下面的式子 L1(U)=ilogP(uiuik,,ui1;θ)L_1 (U)=∑_ilogP(u_i |u_{i-k},…,u_{i-1};θ)其中kk是上下文窗口大小,θθ是语言模型参数,我们使用一个神经网络来模拟条件概率PP
  • 在论文中,使用一个多层的transformer decoder来作为语言模型,这是transformer的一个变体。将transformer decoder中Encoder-Decoder Attention层去掉作为模型的主体,然后将decoder的输出经过一个softmax层,,来产生目标词的输出分布:h0=UWe+Wph_0=UW_e+W_phl=transformer_block(hll)i[i,n]h_l=transformer\_block(h_{l-l} ) ∀i∈[i,n]P(u)=softmax(hnWeT)P(u)=softmax(h_n W_e^T)其中U=(uik,,ui1)U=(u_{i-k},…,u_{i-1})表示uiu_i的上下文;WeW_e是词向量矩阵;WpW_p是位置向量矩阵。

第一步:有监督微调

  • 在这一步我们调整我们预训练语言模型的参数θθ以适应特殊的任务。假定我们特殊任务的预料库为CC其中样本为(x1,x2,,xm;y)(x^1,x^2,…,x^m ;y)。输入(x1,x2,,xm)(x^1,x^2,…,x^m)经过我们预训练好的模型,最后获得最后transformer块输出值hlmh_l^m。然后再语言模型后面增加一个线性映射层将hlmh_l^m映射到解空间:P(yx1,,xm)=softmax(hlmWy)P(y│x^1,…,x^m )=softmax(h_l^m*W_y)
  • 于是我们的训练变成最大化下面式子:L2(C)=(x+y)log(yx1,x2,,xm)L_2 (C)=∑_{(x+y)}log⁡(y|x^1,x^2,…,x^m)
  • 此外我们发现将一些语言模型的损失加和特殊任务的损失一起进去微调有两点好处:
    • 提升监督模型的泛化性
    • 加速收敛
  • 所以最后我们优化这样一个式子:L3(C)=L2(C)+λL1(C)L_3 (C)=L_2 (C)+λL_1 (C)
  • 在特殊任务中我们使用遍历式的方法将结构化输入转换成预训练语言模型能够处理的有序序列,如下图所示:
    GPT模型:Improving Language Understanding by Generative Pre-Training

理解:

  • GPT模型其实质是一个语言模型,它的主体使用的是Transform的decoder部分,因为decoder在逐词翻译的时候会mask掉当前位置以后的词,所以它也是一个天生的语言模型。
  • GPT堆叠了20层的decoder,而不包括encoder部分。因此在decoder中没有encoder-decoder attention的子层,但是仍然有self-attention layer子层,在该层会mask将来位置的词,这样可以使用它去做语言模型的任务:预测下一个词:
    GPT模型:Improving Language Understanding by Generative Pre-Training