2018年6月 GPT-1:大量数据(约5GB文本)上无监督训练,然后针对具体任务在小的有监督数据集上做微调;关键词:“scalable, task-agnostic system”;8个GPU上训练一个月;预训练模型(1.1亿参数)可下载;Improving Language Understanding with Unsupervised Learningopenai.com/blog/language-unsupervised/
2019年2月 GPT-2:大量数据(约40GB文本)上无监督训练,然后针对具体任务在小的有监督数据集上做微调,尝试在一些任务上不微调(即使结果离SOTA还远);关键词“without task-specific training”;据说在256个Google Cloud TPU v3上训练,256刀每小时,训练时长未知[2];预训练模型(15亿参数)最终公开可下载;https://openai.com/blog/better-language-models/openai.com/blog/better-language-models/
2020年5月 GPT-3:大量数据(499B tokens)上无监督训练,不微调就超越SOTA;关键词“zero-shot, one-shot, few-shot”;训练据说话费1200万刀;1750亿参数,将会开放付费API。72页论文我既没精力也没心力读下来,因此推荐这篇总结博文:
1.1 论文
《Improving Language Understanding by Generative Pre-Training》,GPT 是"Generative Pre-Training"的简称,从名字看其含义是指的生成式的预训练。
GPT 采用两阶段过程,第一个阶段是利用语言模型进行预训练(无监督形式),第二阶段通过 Fine-tuning 的模式解决下游任务(监督模式下)。
2.1 第一阶段
GPT 的预训练过程,其实和 ELMO 是类似的,主要不同在于两点:
特征抽取器不是用的 RNN,而是用的 Transformer,上面提到过它的特征抽取能力要强于 RNN,这个选择很明显是很明智的;
ELMO使用上下文对单词进行预测,而 GPT 则只采用 Context-before 这个单词的上文来进行预测,而抛开了下文。
GPT 使用 Transformer 的 Decoder 结构,并对 Transformer Decoder 进行了一些改动,原本的 Decoder 包含了两个 Multi-Head Attention 结构,GPT 只保留了 Mask Multi-Head Attention,如下图所示。
无监督预训练
给定一个无标签的序列 ,语言模型的优化目标是最大化下面的似然值:其中k 是滑动窗口的大小,p是条件概率, theta是模型的参数。这些参数使用SGD进行优化。
其中 U = ( u − k , … , u − 1 ) U=(u_{-k},\dots,u_{-1}) U=(u−k,…,u−1)是当前时间片的上下文token,n是层数,We是词嵌入矩阵,Wp是位置嵌入矩阵。
2.2 第二阶段
在做下游任务的时候,利用第一步预训练好的参数初始化 GPT 的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了,这是个非常好的事情。再次,你可以用手头的任务去训练这个网络,对网络参数进行 Fine-tuning,【类似图像领域预训练的过程】
GPT 论文给了一个改造施工图如上:对于分类问题,不用怎么动,加上一个起始和终结符号即可;
对于句子关系判断问题,比如 Entailment,两个句子中间再加个分隔符即可;
对文本相似性判断问题,把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要;
对于多项选择问题,则多路输入,每一路把文章和答案选项拼接作为输入即可。从上图可看出,这种改造还是很方便的,不同任务只需要在输入部分施工即可。
2.3 效果
GPT-1使用了BooksCorpus数据集[7],这个数据集包含 [公式] 本没有发布的书籍。作者选这个数据集的原因有二:1. 数据集拥有更长的上下文依赖关系,使得模型能学得更长期的依赖关系;2. 这些书籍因为没有发布,所以很难在下游数据集上见到,更能验证模型的泛化能力。
1.3.1 无监督训练
使用字节对编码(byte pair encoding,BPE),共有40000个字节对;
词编码的长度为 768;
位置编码也需要学习;
12层的transformer,每个transformer块有 12个头;
位置编码的长度是3072 ;
Attention, 残差,Dropout等机制用来进行正则化,drop比例为 0.1;
激活函数为GLEU;
训练的batchsize为64,学习率为2.5e-4,序列长度为512 ,序列epoch为100;
模型参数数量为1.17亿。
1.3.2 有监督微调
无监督部分的模型也会用来微调;
训练的epoch为3,学习率为6.25e-5,这表明模型在无监督部分学到了大量有用的特征。
在有监督学习的12个任务中,GPT-1在9个任务上的表现超过了state-of-the-art的模型。在没有见过数据的zero-shot任务中,GPT-1的模型要比基于LSTM的模型稳定,且随着训练次数的增加,GPT-1的性能也逐渐提升,表明GPT-1有非常强的泛化能力,能够用到和有监督任务无关的其它NLP任务中。GPT-1证明了transformer对学习词向量的强大能力,在GPT-1得到的词向量基础上进行下游任务的学习,能够让下游任务取得更好的泛化能力。对于下游任务的训练,GPT-1往往只需要简单的微调便能取得非常好的效果。
GPT-1在未经微调的任务上虽然也有一定效果,但是其泛化能力远远低于经过微调的有监督任务,说明了GPT-1只是一个简单的领域专家,而非通用的语言学家。
4.1、总结
GPT 预训练时利用上文预测下一个单词,ELMO和BERT (下一篇将介绍)是根据上下文预测单词,因此在很多 NLP 任务上,GPT 的效果都比 BERT 要差。但是 GPT 更加适合用于文本生成的任务,因为文本生成通常都是基于当前已有的信息,生成下一个单词。
优点
RNN所捕捉到的信息较少,而Transformer可以捕捉到更长范围的信息。
计算速度比循环神经网络更快,易于并行化
实验结果显示Transformer的效果比ELMo和LSTM网络更好
缺点
对于某些类型的任务需要对输入数据的结构作调整
对比bert,没有采取双向形式,削弱了模型威力
基本是机器翻译,也进行了基本的人工矫正,凑活看吧
原论文:《Language Models are Unsupervised Multitask Learners》
原论文地址:https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf
OpenAI发布的一个小版本GPT-2:https://github.com/openai/gpt-2
官网:https://www.openai.com/blog/better-language-models/
原论文最后是一个十几页的附录,里面给出了GPT-2生成的一些例子,有兴趣的话可以阅读原论文。
其他资料:
https://www.jiqizhixin.com/articles/OpenAI-GPT-2
https://blog.csdn.net/u012526436/article/details/87882985
https://www.jianshu.com/p/874fd64584f5
GPT-2的目标旨在训练一个泛化能力更强的词向量模型,它并没有对GPT-1的网络进行过多的结构的创新与设计,只是使用了更多的网络参数和更大的数据集。下面我们对GPT-2展开详细的介绍。
GPT-2将所有NLP任务的输出转换成了和语言模型一样的方式,每轮只输出一个词。
假如是文本摘要类任务,那么GPT-2在输入的时候加“TL:DR”作为引导字符告诉模型这是文本摘要类任务。而模型的输出和语言模型是一样的,就是每轮输出一个词。当我们需要模型输出的结果是一句话或者几句话的时候,只需要将每轮输出的词连接起来就是我们想要的结果。GPT-2将所有NLP任务的输出转换成了和语言模型一样的方式,每轮只输出一个词。
2.1 GPT-2的核心思想
GPT-2的学习目标是使用无监督的预训练模型做有监督的任务。因为文本数据的时序性,一个输出序列可以表示为一系列条件概率的乘积:
基于上面的思想,作者认为,当一个语言模型的容量足够大时,它就足以覆盖所有的有监督任务,也就是说所有的有监督学习都是无监督语言模型的一个子集。例如当模型训练完“Micheal Jordan is the best basketball player in the history”语料的语言模型之后,便也学会了(question:“who is the best basketball player in the history ?”,answer:“Micheal Jordan”)的Q&A任务。
综上,GPT-2的核心思想概括为:任何有监督任务都是语言模型的一个子集,当模型的容量非常大且数据量足够丰富时,仅仅靠训练语言模型的学习便可以完成其他有监督学习的任务。
2.2 模型细节
同样使用了使用字节对编码构建字典,字典的大小为50257 ;
滑动窗口的大小为1024;
batchsize的大小为512;
Layer Normalization移动到了每一块的输入部分,在每个self-attention之后额外添加了一个Layer Normalization;
将残差层的初始化值用1/根号n 进行缩放,其中n是残差层的个数。
GPT-2训练了4组不同的层数和词向量的长度的模型,具体值见表2。通过这4个模型的实验结果我们可以看出随着模型的增大,模型的效果是不断提升的。
在8个语言模型任务中,仅仅通过zero-shot学习,GPT-2就有7个超过了state-of-the-art的方法;
在“Children’s Book Test”数据集上的命名实体识别任务中,GPT-2超过了state-of-the-art的方法约7%;
“LAMBADA”是测试模型捕捉长期依赖的能力的数据集,GPT-2将困惑度从99.8降到了8.6;
在阅读理解数据中,GPT-2超过了4个baseline模型中的三个;
在法译英任务中,GPT-2在zero-shot学习的基础上,超过了大多数的无监督方法,但是比有监督的state-of-the-art模型要差;
GPT-2在文本总结的表现不理想,但是它的效果也和有监督的模型非常接近。
2.4 总结
GPT-2的最大贡献是验证了通过海量数据和大量参数训练出来的词向量模型有迁移到其它类别任务中而不需要额外的训练。但是很多实验也表明,GPT-2的无监督学习的能力还有很大的提升空间,甚至在有些任务上的表现不比随机的好。尽管在有些zero-shot的任务上的表现不错,但是我们仍不清楚GPT-2的这种策略究竟能做成什么样子。GPT-2表明随着模型容量和数据量的增大,其潜能还有进一步开发的空间,基于这个思想,诞生了我们下面要介绍的GPT-3。
延续GPT的模型架构,用更多的数据,更大的模型,训练模型。
预测时,不需要Finetune,在某些任务上小样本条件下也能达到和BERT媲美的性能。
预测时,分别用自然语言描述任务(零样本)、一个示例(单样本,和人类学习很像)、少量示例作为上文文本,将续写的文本作为预测结果。
GPT-3共训练了5个不同的语料,分别是低质量的Common Crawl,高质量的WebText2,Books1,Books2和Wikipedia,GPT-3根据数据集的不同的质量赋予了不同的权值,权值越高的在训练的时候越容易抽样到,如表1所示。
GPT-3沿用了GPT-2的结构,但是在网络容量上做了很大的提升,具体如下:
GPT-3采用了96 层的多头transformer,头的个数为96;
词向量的长度是 12888;
上下文划窗的窗口大小提升至2048个token;
使用了alternating dense和locally banded sparse attention[11]。
参考资料
【1】https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf
【2】从Word Embedding到Bert模型——自然语言处理预训练技术发展史: https://www.jiqizhixin.com/articles/2018-12-10-8
【3】GPT2 https://www.sohu.com/a/336262203_129720 https://jalammar.github.io/illustrated-gpt2/
【4】Pytorch代码实现: huggingface/pytorch-openai-transformer-lm
【5】GPT简介https://www.cnblogs.com/yifanrensheng/p/13167796.html
【6】词向量之GPT-1,GPT-2和GPT-3
https://zhuanlan.zhihu.com/p/350017443