本文正在参加Improving Language Understanding by Generative Pre-Training
GPT-2: Language Models are Unsupervised Multitask Learners
GPT-3: Language Models are Few-Shot Learners
GPT简介
GPT是在Transformer发表后一年的工作,它主要是利用了Transformer的Decoder来进行语言模型的训练。他的预训练目标函数为:
整个模型的结构由一个输入的投影层将token id映射为embedding,中间12层的Transformer Decoder Layer和最终的一个输出投影层组成。
他的无监督预训练方式是自回归模式的,也就是说GPT是单向的语言模型,在预测下一个token时,只能看到前面的token。预训练的语料库为BooksCorpus数据集。
在进行下游有监督的任务时,GPT取最后一个token经过Transformer后的输出作为对输入的一个编码(类似于[CLS]在BERT中的功能),之后接一个Linear层映射到输出的维度。
GPT-2
GPT在发表后,很快BERT就出现了,并且以全面碾压的姿态在所有任务上完爆GPT-1,因此,OpenAI团队便也加大了GPT的训练数据和模型参数,但是在做到下游任务的时候,它会用一个叫做zero-shot的设定,zero-shot是说,在做到下游任务的时候,不需要下游任务的任何标注信息,那么也不需要去重新训练已经预训练好的模型。这样子的好处是我只要训练好一个模型,在任何地方都可以用。
根据沐神所说,如果作者就是在GPT-1的基础上用一个更大的数据集训练一个更大的模型,说得到结果比BERT好一些,可能也就好那么一点点,不是好那么多的情况下,大家会觉得GPT-2这篇文章就没什么意思了,工程味特别重。那么我换一个角度,选择一个更难的问题,我说做zero-shot。虽然结果可能没那么厉害了,没那么有优势,但是创新度一下就有了。
GPT-2的预训练语料则是在reddit上选取评分大于3分的网页,然后进行爬取得到的高质量语料,大约40G左右。
GPT-3
GPT-3的论文更像是一篇技术报告,长达63页,主要介绍了一些实验上的结果。GPT-3将模型的参数量直接提升到了1750亿参数,越GPT-2的100多倍,性能则是提升很大。
同时,GPT-3提出在下游任务上进行few-shot或者1-shot时,无需进行梯度更新的方式,这里可以通过如下的图示来解释:
左边展示了Zero-shot、1-shot和Few-shot的区别,他们都是在做预测,只是在输入数据时,zero-shot只说明任务,让模型就直接预测输出;1-shot则会在任务后面接一个例子提示一下模型;few-shot则是接若干个例子用来提示。
作者一共设置如下几种不同size的模型。
由于GPT-3的模型参数量暴增,所以预训练的语料也需要相应增加。首先,作者训练了一个简单的二分类器,分类器的正样例是GPT-2中爬取到的高质量数据,负例则是Common Crawl的低质量数据,接着再用这个分类器将所有的CommonCrawl数据进行分类,取出其中的正样例。然后使用lsh(局部敏感哈希算法)对相似的文档进行过滤,最后加入BERT、GPT2的那些预训练数据也作为语料,得到一个非常大的语料。
实验方面,GPT-3超过了绝大多数的zero-shot或者few-shot的state-of-the-art方法。
最后,作者也讨论了GPT-3的一些影响,诸如性别偏见、宗族偏见、宗教偏见等问题,而且无法保证长文本生成时的连贯性,存在下文不停重复上文的问题。
总结
GPT系列的模型让我们看到了语言模型届的”大力出奇迹“,到最终的GPT-3模型时参数量已经变成了1750亿的参数,是原始GPT(1.25亿)参数的1000多倍,不过GPT-3也在各种任务上展现了非常惊艳的效果,影响无疑是深远的,而且也证明了起码在现在阶段,通过增加参数而提升模型性能是远远还没有到顶的。