OpenAI-GPT(Generative Pre-Training)详解

在GPT出现之前,通用的使用预训练的方式是word2vec,即学习词语的表达。而在GPT出现之后,通用的预训练方式是预训练整个网络然后通过fine-tune去改进具体的任务。

GPT出现之后,引发了Bert,XLNet等一系列的地震式改进。对NLP任务的影响十分深远。

GPT的核心思想是先通过无标签的文本去训练生成语言模型,再根据具体的NLP任务(如文本蕴涵、QA、文本分类等),来通过有标签的数据对模型进行fine-tuning。

具体来说,在这篇论文中提出了半监督的方法,即结合了无监督的预训练和有监督的fine-tuning。论文采用两阶段训练。首先,在未标记数据集上训练语言模型来学习神经网络模型的初始参数。随后,使用相应NLP任务中的有标签的数据地将这些参数微调,来适应当前任务。

模型的结构是使用了多层的单向Transformer结构(Decoder)(《Attention is All you need》提出)。下图是GPT语言模型的结构:
在这里插入图片描述
在这里插入图片描述
训练的两个阶段如下:(1和2)

1. 无监督的预训练

在这里插入图片描述
S o f t m a x Softmax 的权重矩阵是 W e T W_e^T ,而输入端 W e W_e 也是词嵌入矩阵,这里注意一下即可。

2. 有监督的fine-tuning

在这里插入图片描述

3. 具体任务的模型微调

在这里插入图片描述

4. 实验

模型细节 我们的模型大体上和原始的transformer一致,我们训练了一个12层的只有decoder的transformer,使用有遮蔽自注意力头(包含768维状态和12个注意力头)。对于 position-wise feed-forward networks 我们使用3072维的内部状态。我们使用adam优化器,最高学习率为2.5e-4。学习率从0开始上升2000步然后通过cosine曲线下降到0,我们训练了100个epochs,64的batch size,相邻序列长度为512,因为大量使用了layernorm,我们的初始化只是用 N ( 0 , 0.02 ) N(0,0.02) 的分布。我们使用了subword(其包括wordpiece)的方式,dropout为0.1,我们同样适用了改进版L2,另外与原始transformer不同我们使用预训练的位置嵌入。

微调细节 我们直接使用预训练模型的参数,然后加上0.1的dropout,对于大多数任务我们的学习率为6.25e-5和32的batch大小。只需要微调3个epoch左右就能收敛。我们还使用了线性的学习率衰减,和0.2%训练步数来预热(即学习率达到达到最大值的步数)。

5. 补充

选用Transformer的Decoder是因为模型整体有线性层和softmax,和Decoder更相似。
微调的时候要学习所有的参数!!

GPT为什么不能双向?这个答案写的非常的好,Bert、GPT、ELMo全部都提及到了。