GPT1.0
简述如下:GPT 1.0采取预训练+FineTuning两个阶段,它采取Transformer作为特征抽取器。预训练阶段采用“单向语言模型”作为训练任务,把语言知识编码到Transformer里。第二阶段,在第一阶段训练好的模型基础上,通过Finetuning来做具体的NLP任务。
从大框架上来说,Bert基本就是GPT 1.0的结构,除了预训练阶段采取的是“双向语言模型”之外,它们并没什么本质差异,其它的技术差异都是细枝末节,不影响大局,基本可忽略。
GPT2.0
GPT2.0大框架其实还是GPT 1.0的框架,但是把第二阶段的Finetuning做有监督地下游NLP任务,换成了无监督地做下游任务。本质上,GPT2.0选择了这么一条路来强化Bert或者是强化GPT 1.0的第一个预训练阶段:就是说首先把Transformer模型参数扩容,常规的Transformer Big包含24个叠加的Block,GPT2.0将Transformer层数增加到48层,参数规模15亿。真正的目的是:GPT 2.0准备用更多的训练数据来做预训练,更大的模型,更多的参数,意味着更高的模型容量,所以先扩容,免得Transformer楼层不够多的房间(模型容量)容纳不下过多的住户(就是NLP知识)。
GPT2.0的语料:GPT2.0找了800万互联网网页作为语言模型的训练数据,它们被称为WebText,互联网网页的优点是覆盖的主题范围非常广,这样训练出来的语言模型,通用性好,覆盖几乎任何领域的内容,这意味着它可以用于任意领域的下游任务,有点像图像领域的Imagenet的意思。GPT 2.0论文其实更强调训练数据的通用性强这点。当然,除了量大通用性强外,数据质量也很重要,高质量的数据必然包含更好的语言及人类知识,所以GPT 2.0还做了数据质量筛选,过滤出高质量的网页内容来。
GPT 2.0用这些网页做“单向语言模型”,GPT 2.0没有像Bert或者1.0版本一样,拿这个第一阶段的预训练模型有监督地去做第二阶段的Finetuning任务,而是选择了无监督地去做下游任务。另外论文中提到的对Transformer结构的微调,以及BPE输入方式,我相信都是不太关键的改动,应该不影响大局。
问题一:为什么GPT 2.0第二阶段不通过Finetuning去有监督地做下游任务呢?无监督地去做很多第二阶段的任务,只是GPT作者想说明在第一阶段Transformer学到了很多通用的包含各个领域的知识,第二部分各种实验是对这点的例证,如此而已。这是为何说第二阶段其实不重要,因为它不是论文的中心思想,而是说明中心思想的例子。
问题二:在预训练阶段,为什么GPT 2.0仍然固执地用单向语言模型,而不是双向语言模型呢?Bert在论文的实验部分已经证明了:Bert的效果比GPT好主要归因于这个双向语言模型。也许GPT 作者只想强调他们想做语言模型这个事情,毕竟生成内容后续单词这种模式,单向语言模型更方便,这估计是真正原因。
问题三:GPT 2.0 既然第二阶段是无监督的任务,而它不做Finetuning,那么你训练好一个语言模型,它当然会根据输入的一句话,给你蹦出后面可能紧跟那个单词,这是标准的语言模型过程,这个正常。但是如果这时候让它去做一个文本摘要任务,它怎么知道它现在在做什么事情呢,根据输入,应该输出什么东西呢?其实GPT 2.0在做下游无监督任务的时候,给定输入(对于不同类型的输入,加入一些引导字符,引导GPT正确地预测目标,比如如果做摘要,在输入时候加入“TL:DR”引导字符串),它的输出跟语言模型的输出是一样的,就是蹦出一个单词。那么问题来了:对于比如摘要任务,我们期待的输出结果是一句话或者几句话,你给我一个单词,有点太小气,那该怎么办?很简单,继续一个字一个字往出蹦,按照这些字从系统里蹦出来的时间顺序连起来,就是你想要的摘要结果,这种所有任务采取相同的往出蹦字的输出模式也是有点意思的。就是说,GPT2.0给出了一种新颖的生成式任务的做法,就是一个字一个字往出蹦,然后拼接出输出内容作为翻译结果或者摘要结果。传统的NLP网络的输出模式一般需要有个序列的产生结构的,而GPT 2.0完全是语言模型的产生结果方式:一个字一个字往出蹦,没有输出的序列结构。
归纳
我们可以从两个不同的角度来理解GPT 2.0。
一个角度是把它看作采取类似Elmo/GPT/Bert的两阶段模型解决NLP任务的一种后续改进策略,这种策略可以用来持续优化第一阶段的预训练过程。通过现在的Transformer架构,采用更高质量的数据,采用更宽泛的数据(Web数据量大了估计包含任何你能想到的领域),采用更大量的数据(WebText,800万网页),Transformer采用更复杂的模型(最大的GPT2.0模型是Transformer的两倍层深),那么在Transformer里能学会更多更好的NLP的通用知识。如果我们第二阶段仍然采取Finetuning,对下游任务的提升效果是可以很乐观地期待的。
另外一个角度也可以把GPT 2.0看成一个效果特别好的语言模型,可以用它来做语言生成类任务,比如摘要,QA这种,再比如给个故事的开头,让它给你写完后面的情节,目前看它的效果出奇的好。
Bert的另外一种改进模式
GPT2.0给出的思路是优化Bert的第一个预训练阶段,方向是扩充数据数量,提升数据质量,增强通用性,追求的是通过做大来做强。
另一个思路:机器学习里面还有有监督学习,NLP任务里也有不少有监督任务是有训练数据的,这些数据能用来改善Bert第二阶段学习各种知识的Transformer。这种做法一个典型的模型是最近微软推出的MT-DNN,核心思想:结构上底层就是标准的Bert Transformer,第一阶段采用Bert的预训练模型不动,在Finetuning阶段,在上层针对不同任务构造不同优化目标,所有不同上层任务共享底层Transformer参数,这样就强迫Transformer通过预训练做很多NLP任务,来学会新的知识,并编码到Transformer的参数中。
NLP主流模型进化
- 采取Bert的两阶段模式
- 特征抽取器采用Transformer
- Bert两阶段模式中,第一个预训练阶段的两种改进方向:
- 一种是强调通用性好以及规模大。加入越来越多高质量的各种类型的无监督数据,GPT 2.0指出了个明路,就是净化的高质量网页
- 第二种是通过多任务训练,加入各种新型的NLP任务数据,它的好处是有监督,能够有针对性的把任务相关的知识编码到网络参数里,所以明显的好处是学习目标明确,学习效率高;而对应的缺点是NLP的具体有监督任务,往往训练数据量少,于是包含的知识点少;而且有点偏科,学到的知识通用性不强。
- GPT2.0采取超深层Transformer+更大量的网页数据去做更好的语言模型,并进而做各种生成式任务是很有研究应用前景。