当前位置:   article > 正文

OpenAI-GPT(Generative Pre-Training)详解_openai的训练阶段

openai的训练阶段

在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)

1. 无监督的预训练

在这里插入图片描述
总体来说,我们想要基于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最后求和进行梯度更新。

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) 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全部都提及到了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/598389
推荐阅读
相关标签
  

闽ICP备14008679号