论文地址:pdf
论文代码:openai/gpt-2 (github.com)
论文介绍的是 OpenAI 对 GPT 的一个改进模型 GPT-2,其模型结构与 GPT 相比几乎没有什么变化,只是让模型变得更大更宽,并且取消了 Fine-tuning 的步骤。也就是说 GPT-2 采用了一阶段的模型(预训练)代替了二阶段的模型(预训练+微调),并且在语言模型(文本摘要等)相关领域取得了不错的效果。
GPT-2是GPT的升级版本,其最大的区别在于规模更多,训练数据更多,GPT是12层的transformer,BERT最深是24层的transformer,GPT-2则是48层,共有15亿个参数,其训练数据是一个称为WebText的数据集,该数据集做了一些简单的数据清理,并且覆盖领域十分广阔,论文中指出规模大的模型必须要用更多的数据才能收敛,并且实验结果表明目前模型仍然处于一个欠拟合的情况。其次,相比于BERT,其并没有采用双向的transformer,依旧采用单向transformer。其次,在预训练阶段,GPT-2采用了多任务的方式,不单单只在一个任务上进行学习,而是多个,每一个任务都要保证其损失函数能收敛,不同的任务是共享主体transformer参数的,该方案是借鉴了之前微软的MT-DNN,这样能进一步的提升模型的泛化能力,因此在即使没有fine-turning的情况下依旧有非常不错的表现。
引言
目前最好的 NLP 模型是结合无监督的 Pre-training 和监督学习的 Fune-tuning,但这种方法的缺点是针对某特定任务需要不同类型标注好的训练数据。作者认为这是狭隘的专家而不是通才,因此作者希望能够通过无监督学习训练出一个可以应对多种任务的通用系统。
作者认为目前的数据集往往都是针对某一特定任务,如 QA 领域的 SQuAD 2.0,机器翻译领域的 NIST04 和 WMT 2014 En-2-Fr等。而正是因为数据集的单一导致系统缺乏泛化性。作者想通过尽可能地构建和利用足够大的且多样化的数据集,以保证最终的模型能够应用于多个不同的 NLP 任务中。为此,作者专门爬了 Reddit 上 > 3 karma 的外链作为数据源,同时去除 wiki 数据,最终数据大小共 40G。由于 Reddit 上的数据会包括各个领域,所以既保证了数据质量、数量又保证了数据的多样性。
此外,据研究表明语言模型有望完成某些特定的任务,如常识推理和情感分析等,所以作者提出了去掉有监督的 Fine-tuning 阶段,仅采用无监督 Pre-training 的语言模型来直接应用到下游任务中。
在本文中,作者论证了这种方法的可行性,并证明了语言模型来相关领域具有很大的潜力。
GPT-2模型
作者从网上爬了一大堆语料,用来进行LM的pretrain,他们最后的数据集叫WebText,有800万左右的文档,40G的文本,并且还移除了Wikipedia的数据,因为后面要ZSL的任务里面有很多都是基于Wikipedia的语料的,这里其实就是保证了ZSL任务的前提。PS:ZSL就是Zero-shot Learning。
GPT-2 的核心是语言模型,语言具有天然的顺序性,通常可以表示为:
可以泛化成:
针对单个任务可以表示为估计一个条件分布:
对于一个通用的系统来说,可以适用于多种任务:
所以语言模型也能够学习某些监督学习的任务,并且不需要明确具体的监督符号。而监督学习由于数据量的关系通常只是无监督学习的一个子集,所以无监督学习的全局最小也必定是监督学习的全局最小,所以目前的问题变为了无监督学习是否能收敛。
作者通过初步论证指出,足够大的语言模型是能够进行多任务学习的,只是学习速度要比监督学习慢得多。
Input
在模型输入方面,GPT-2 采用的是 Byte Pair Encoding(以下简称 BPE)的 Subword 算法。BPE 是一种简单的数据压缩形式,可以有效地平衡词汇表大小和编码所需的 token 数量。它可以提高词表的空间使用效率,避免得到类似 ‘dog.’、‘dog!’、‘dog?’ 的词。
BPE 和我们之前的提到的 WordPiece 的区别在于,WordPiece 是基于概率生成 Subword 的,而 BPE 是基于贪心策略,每次都取最高频的字节对。
Model
在模型方面相对于 GPT 来说几乎没有什么修改,只是加入了两个 Layer normalization,一个加在每个 sub-block 输入的地方,另一个加在最后一个 self-attention block 的后面。
同时考虑到模型深度对残差路径的累积问题,GPT-2 采用了修正的初始化方法。在初始化时将残差层的权重缩放到 $\frac{1}{\sqrt{n}}倍, $$n$ 为残差层的数量。
此外,vocabulary 的大小扩展到了 50257,输入的上下文大小从 512 扩展到了 1024,并且使用更大的 batch size(512)。
与BERT模型的区别
GPT-2 采用的 Transformer 的 Decoder 模块堆叠而成,而 BERT 采用的是 Transformer 的 Encoder 模块构建的。两者一个很关键的区别在于,GPT-2 采用的是传统的语言模型,一次只输出一个单词(多个 token)。
实验
作者用了几种不同size的模型,见下图:
作者指出的是,最小的模型就是GPT,第二小的与大BERT是一个量级,最大的模型称为GPT-2。所有的model,在LM训练的时候,都处于欠拟合的状态。说明他们爬的这个大数据还是很好的!
作者直接将这个pretrain的模型,不用finetune的跑了各个下游的NLP任务,即ZSL(Zero-Shot Learning)设定,结果如下:
这里的WikiText2、PTB、enwiki8、text8、WikiText103、1BW是几个测试语言模型的数据集;LAMBADA是测试建模长句子能力的数据集,用于预测一句话的最后一个词;CBT是用于检验在不同类型的词上LM的表现,主要是Cloze任务。
作者还测试了一些其他的任务,比如推理的任务Winograd Schema Challange,还有阅读理解CoQA、摘要、翻译、QA等任务。
最后,作者还给出了一个说明训练难度的表格,用于说明这些任务的训练集与测试集的文本重合度比较高,所以SoTA的效果要打一些折扣,而GPT-2这里用到的训练数据则与测试集重合度较低,所以就更能说明GPT-2的提升效果啦!
参考资料
【Pre-Training】GPT-2:四只角的独角兽 (qq.com)
原文作者公众号:阿泽的学习笔记。