OpenAI-GPT(Generative Pre-Training)详解

在GPT出现以后,通用的预训练方式是预训练整个网络而后经过fine-tune去改进具体的任务。(须要注意的是,ELMo先出现的,而后是GPT)html

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

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

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

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

1. 无监督的预训练

在这里插入图片描述
h 0 h_0 状态是由上下文词与词嵌入矩阵相乘,并加上位置嵌入矩阵获得的。
而后随后的 h 1 h_1 h 2 h_2 …都是每个时间点所获得的“隐藏层 h h ”,直到最后一个 h n h_n ,将其与以前词嵌入矩阵相乘通过 s o f t m a x softmax ,即生成目标词的几率分布。学习

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不一样咱们使用预训练的位置嵌入。spa

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

5. 补充

选用Transformer的Decoder是由于模型总体有线性层和softmax,和Decoder更类似。
微调的时候要学习全部的参数!!
orm

GPT为何不能双向?这个答案写的很是的好,Bert、GPT、ELMo所有都说起到了。