赞
踩
在GPT出现之后,通用的预训练方式是预训练整个网络然后通过fine-tune去改进具体的任务。(需要注意的是,ELMo先出现的,然后是GPT)
GPT出现之后,引发了Bert,XLNet等一系列的地震式改进。对NLP任务的影响十分深远。
GPT的核心思想是先通过无标签的文本去训练生成语言模型,再根据具体的NLP任务(如文本蕴涵、QA、文本分类等),来通过有标签的数据对模型进行fine-tuning。
具体来说,在这篇论文中提出了半监督的方法,即结合了无监督的预训练和有监督的fine-tuning。论文采用两阶段训练。首先,在未标记数据集上训练语言模型来学习神经网络模型的初始参数。随后,使用相应NLP任务中的有标签的数据地将这些参数微调,来适应当前任务。
模型的结构是使用了多层的单向Transformer结构(Decoder)(《Attention is All you need》提出)。下图是GPT语言模型的结构:
训练的两个阶段如下:(1和2)
总体来说,我们想要基于u-k,…,u-1 去预测出u是什么
h
0
h_0
h0状态是由上下文词与词嵌入矩阵相乘,并加上位置嵌入矩阵得到的。
然后随后的
h
1
h_1
h1
h
2
h_2
h2…都是每一个时间点所得到的“隐藏层
h
h
h”,直到最后一个
h
n
h_n
hn,将其与之前词嵌入矩阵相乘经过
s
o
f
t
m
a
x
softmax
softmax,即生成目标词的概率分布。
S o f t m a x Softmax Softmax的权重矩阵是 W e T W_e^T WeT,而输入端 W e W_e We也是词嵌入矩阵,这里注意一下即可。
注:上述过程是从公式的角度来看GPT预训练过程,从输入输出的角度来看,输入假设为ABCD,其输出(或者说label)其实也是ABCD,只不过其内部会自动每次基于前文来预测下一个词,比如:虽然输入整体是ABCD,但实际上模型内部首先会基于输入的<start>起始符去预测输出的第一个词,然后输出的第一个词和label里的第一个位置上的A算loss;然后再基于输入的<start> A去预测第二个词,然后第二个词和labe里的第二个位置上的B算loss,以此类推。所以输入输出的角度来看,输入输出都是相同的一句话,只不过模型内部会进行一个个词的预测,一个个算loss最后求和进行梯度更新。
模型细节 我们的模型大体上和原始的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) N(0,0.02) 的分布。我们使用了subword(其包括wordpiece)的方式,dropout为0.1,我们同样适用了改进版L2,另外与原始transformer不同我们使用预训练的位置嵌入。
微调细节 我们直接使用预训练模型的参数,然后加上0.1的dropout,对于大多数任务我们的学习率为6.25e-5和32的batch大小。只需要微调3个epoch左右就能收敛。我们还使用了线性的学习率衰减,和0.2%训练步数来预热(即学习率达到达到最大值的步数)。
选用Transformer的Decoder是因为模型整体有线性层和softmax,和Decoder更相似。
微调的时候要学习所有的参数!!
GPT为什么不能双向?这个答案写的非常的好,Bert、GPT、ELMo全部都提及到了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。