虽然GPT在nlp下游任务中表现没有bert模型好,但是在文本生成任务上表示出色;
给定无label的输入token序列: u = { u 1 , . . . , u n } u=\{u_1,...,u_n\} u={u1,...,un}
使用生成式语言模型来最大化概率对其训练,其损失函数为: L 1 ( u ) = ∑ i l o g P ( u i ∣ u i − k , . . . , u i − 1 , θ ) L_1(u)=\sum_ilog P(u_i|u_{i-k},...,u_{i-1},\theta) L1(u)=i∑logP(ui∣ui−k,...,ui−1,θ)
公式中的k为上文窗口, θ \theta θ为neural network的参数;
GPT使用的是Transformer的多层Decoder部分,其输入为词向量和词对应的位置向量: h 0 = U W e + W p h_0=UW_e+W_p h0=UWe+Wp
原始 Transformer 采用正弦函数来产生位置向量,但这里采用模型来学习位置向量;同时注意GPT在使用Transformer的Decoder的时候把Decoder部分中的Encoder-Decoder的attention层删除了;
Transformer的Decoder部分使用6层layer,GPT使用的是12层layer的Decoder。因此其层与层之间的参数传递为: h l = t r a n s f o r m e r _ b l o c k ( h l − 1 ) , l ∈ [ 1 , n ] h_l=transformer\_block(h_{l-1}),l\in[1,n] hl=transformer_block(hl−1),l∈[1,n]
最后一层layer接一层softmax层,作为对下一个词的预测: P ( u ) = s o f t m a x ( h n W e T ) P(u)=softmax(h_nW_e^T) P(u)=softmax(hnWeT)
上面公式中的n为transformer的层数,l是第n层layer; W e W_e We为词token的Embedding Matrix, W p W_p Wp为位置信息的Position Embeding Matrix;
注意GPT中去掉了Transformer中Encoder与Decoder之间的注意力层;
在进行有监督的fine-tuning的时候,其模型和无监督类似,但是去掉了进行预测的softmax层,其12层的Decoder层依然保留进行微调;
给定有label的输入tokens: X = { x 1 , . . . , x m } X=\{x_1,...,x_m\} X={x1,...,xm}
为了在进行有监督预测的时候能获取输入的最大信息,在Encoder的最后一层的最后一个位置拼接一个softmax层进行输出预测label: P ( y ∣ x 1 , . . . , x m ) = s o f t m a x ( h l m W y ) P(y|x^1,...,x^m)=softmax(h_l^mW_y) P(y∣x1,...,xm)=softmax(hlmWy)
有监督微调模型的损失函数为: L 2 ( C ) = ∑ ( x , y ) l o g P ( y ∣ x 1 , . . . , x m ) L_2(C)=\sum_{(x,y)}log P(y|x^1,...,x^m) L2(C)=(x,y)∑logP(y∣x1,...,xm)
上面公式中的 h l m h_l^m hlm是预训练时获得的transformer的hidden输出, W y W_y Wy是下游任务中的matrix参数;
在预训练的时候有一个损失函数 L 1 L_1 L1,在微调阶段有另一个损失函数 L 2 L_2 L2,在使用下游任务微调的时候,将有监督数据不仅训练下游任务,同时训练无监督的语言模型(论文通过实验发现,在微调任务中引入语言模型能够改善监督学习的泛化性能,同时也能加速监督学习的收敛速度),则得到其微调时的损失函数为: L 3 ( C ) = L 2 ( C ) + λ L 1 ( C ) L_3(C)=L_2(C)+\lambda L_1(C) L3(C)=L2(C)+λL1(C)
公式中的 λ \lambda λ为设定的超参数;
注意,在GPT中,微调阶段BP的时候不仅调整参数矩阵 W y W_y Wy,同时调整Transformer中的Decoder部分的参数,词token的参数矩阵 W e W_e We;
在ELMO中只是调整下游任务的参数矩阵 W y W_y Wy,但是其双向LSTM的参数和词嵌入token的参数在BP的时候是保持不变的;
ELMO和GPT的这种差别就是Feature-base和Fine-tuning的区别;
在nlp中有很多下游任务,比如文本蕴含任务、文本分类任务、文本相似度任务、问答任务等;这些任务的输入是有一定区别的,比如在文本分类中输入只有一句话,在文本相似度分析的时候输入为两句话,因此我们需要对输入进行相应的变形;
task-specific input transformations就是为了解决不同下游任务输入不同而提出的,其实这也相当于对输入进行预处理。如上图所示,在文本分类中,在输入句子的起始端添加起始标志符“Start”,在输入句子的结束端添加“Extract”。在文本蕴含任务中,输入为两个句子,在第一个句子的起始端添加起始标志符“Start”,在两个句子中间添加一个句子分隔符“Delim”,最后在第二个句子的结束端添加一个结束标志符“Extract”;
文本蕴含有一个很严格的先后顺序,前面的句子是后面句子的前提,后面的句子是假设,前提和假设是不能交换的。但是在文本相似度任务中句子的先后顺序是没有严格要求的,就如上图中的Similarity文本相似度的例子中,如果将句子1和句子2进行交换,其相似意义是不变的,因此在进行文本相似度计算的时候可以交换句子1和句子2。这样在文本蕴含和文本相似度任务中其输入虽然是两个句子,但是文本相似度中会有两种不同的输入,这样经过Transformer之后文本相似度任务会有两个不同的输出,在transformer之后将两个输出进行contact然后经过Linear进行输出预测;
在图中的Multiple Choice中的Context是由若干个句子组成的问题文本,任务目标是基于问题文本从N个Answer中选出最合适的Answer,因此基于N个Answer构建N个句子对,并将其输入到Transformer中进行训练,在输出端将N个输出结果拼接一个Linear层,注意这里和文本相似度任务不同,文本相似度任务中是将transformer进行拼接再输入到Linear层中,最后文本相似度任务中的输出仅为一个,而Multiple Choice的输出为N个,最后从N个输出中选择概率最大的Answer。
GPT模型使用12层、仅包含Transformer的Decoder部分的模型,其结构如下:
自然语言推理任务natural language inference:NLI 也称作文本蕴含任务 textual entailment ,其目标是:给定一对句子,判定其关系是蕴含、矛盾、还是中立。这里评估了5个不同来源的数据集,包括图片标题SNLI、新闻文章RTE、维基百科文章 QNLI、科学考试SciTail、转录语音&通俗小说&政府报告 MNLI 。(下图中的5x表示集成5个模型)
问答和知识推理任务包含两个数据集(其中 9x 表示集成了 9 个模型):
其中 mc 表示 Mathews 相关系数,acc 表示准确率,pc 表示皮尔逊系数;
语义相似度任务检测两个句子在语义上是否等价。这里采用了3个数据集:Microsoft Paraphrase corpus:MRPC 、Quora Question Pairs:QQP、Semantic Textual Similarity benchmark:STS-B;
实验表明:迁移学习时 GPT 的每一层都对目标任务有帮助。下图为采用不同层数时,模型在 RACE 和 MultiNLI 任务上的表现。即:迁移学习时并不是使用 h → l \overrightarrow{\mathbf{h}}_{l} hl,而是 h → k , k = 1 , 2 , 3 , ⋯ , l \overrightarrow{\mathbf{h}}_{k}, k=1,2,3, \cdots, l hk,k=1,2,3,⋯,l;
与 LSTM 结构相比,Transformer 能够捕捉到更长的语言结构。因此 Transformer 的迁移学习效果更好,且表现更加稳定;
下图为直接使用预训练模型而不进行微调时,二者在新任务上的表现对比:LSTM 的预测结果更差,且波动更大;
通过实验表明:GPT 在微调任务中引入语言模型的损失这个辅助目标可以提升监督任务的性能;实际上辅助目标对于大数据集有效,对于小数据集效果不佳;
下表中:
关键点:
小细节:
GPT存在的问题:
GPT采用的是自回归模型,该模型只能获得当前词以前的信息,对于当前词之后的信息没办法获取,也就是没有办法获取全局信息;
启发点: