前言
GPT2是OpenAI公司在2019年8年发布的一篇论文,论文名字是《Language Models are Unsupervised Multitask Learners》语言模型是无监督的多任务学习。在模型架构上与GPT1相比没有太大的区别,但是其训练所使用的数据和模型的参数大大增加,并且增加了zero-shot设置。接下来本文将进行GPT2的介绍。
一、GPT2理论
1.论文总结
尽管前面出现了GPT1、BERT这类预训练的大模型,但是其仍然需要在带标签的数据上进行下游任务上的微调,这是一件比较麻烦的事情。当前的大模型缺少泛化性的主要原因是在单领域的数据集上进行训练。GPT2想实现的目标是通用的多任务模型框架,只需要在大规模的数据集上做预训练,而不用改变模型的结构和参数就能进行各种下游任务的推理,也就是zero-shot操作。(zero-shot learning,零样本学习,指的是模型在大规模数据集上进行预训练后,可以直接在下游任务上进行推理,而不再需要样本进行微调。)
语言模型可以建模成:
但是在多任务领域中,对于相同的输入,不同的任务形式其输出也应该有所区别。因此多任务学习可以建模成
在之前的多任务学习研究中,对于不同的任务调节通常是在模型架构方面进行改变,但是自然语言是一种灵活的表达形式,例如,对于模型翻译的训练样本可以写成{translate to french,english text,french text},对于阅读理解的训练样本可以写成{answer the question, document,question, answer}形式。
论文中猜测,一个足够大的语言模型将开始学习推断和执行自然语言序列中演示的任务,以便更好地预测它们,而不管它们的获取方法如何。通俗的理解就是,对于不同的训练样本甚至同一个样本中的不同token,模型会学习到不同的下游任务,这也就是这篇文章《语言模型是无监督的多任务学习》的含义所在,在一个大规模的训练集上进行训练时,本身就是相当于在同时进行不同的任务的学习。
因此,GPT2要做的就是增大模型的规模以及数据量,然后看一下在不做微调的情况下(zero-shot)能否去直接预测不同的下游任务。
2.模型结构
GPT2的模型结构相较于GPT1在解码器方面有了一点小改变,如下图所示:
左图为GPT1的模型结构,右图为GPT2。其改变主要是层归一化层(Layer Norm)被移到了attention前面,使用了一种修正的初始化方法,同时通过因子
1
/
N
1/\sqrt{N}
1/N缩放残差层的权重,N是线性层的数量。词表大小扩展到了50257,输入的token从512扩展为1024,batchsize也扩展到了512。参数两最大达到了15亿参数,相比于GPT1的参数量扩大了进15倍。GPT2有以下几个尺寸:
parameters | layers | d m o d e l _{model} model |
---|---|---|
117M | 12 | 768 |
345M | 24 | 1024 |
762M | 36 | 1280 |
1542M | 48 | 1600 |
二、GPT2预训练
GPT2的训练数据为WebText,可以理解为从网上根据点赞量爬取的比较优质的文本,共4500万个网页链接,共计40GB的文本。
其预训练过程与GPT1类似,由于解码器中存在着因果掩码,所以可以进行并行训练,即给模型一次性输入长为4的序列
[
′
B
O
S
′
,
u
1
,
u
2
,
u
3
]
[ ′ BOS ′ , u_1 , u_2 , u_3 ]
[′BOS′,u1,u2,u3] ,然后模型同样输出长度为4的序列
[
u
1
,
u
2
,
u
3
,
′
E
O
S
′
]
[ u_1 , u_2 , u_3 , ′ EOS ′ ]
[u1,u2,u3,′EOS′],然后让其与标签(即模型的输入)算Loss,然后进行反向传播更新参数。
三、GPT2微调
由于GPT2是zero-shot的,所以在数据集上进行完预训练后,可以不用进行微调,直接对于不同的下游任务进行推理即可。
总结
GPT2相对于GPT1来说,将在单任务上进行微调扩展到了zero-shot的多任务上。尽管GPT-2在设计上没有刻意针对多任务学习进行优化,但其展示出了在多种自然语言处理任务上的潜力,包括文本生成、翻译、问答等。GPT-2生成的文本在流畅性、连贯性和可读性方面表现出色,虽然对于GPT1在模型结构上没有较大的改变,但是其通过增加数据集规模和模型参数,证明了语言模型是可以在预训练时自己进行多任务的学习,为之后GPT3出色的表现打下了基础。