GPT
GPT作为NLP预训练语言模型的基石之一,从gpt1,gpt2到gpt3,不断扩大模型规模,将问题从fine-tuning拓展到zero-shot,试图解决更基础,但是更困难的无监督学习问题,三篇论文中的模型结构相同,不同的是试图解决的问题。
GPT1
要解决的问题
NLP中有监督训练数据较少,存在大量的无标签文本数据,如何使用这些数据解决NLP领域中各类问题?GPT提出了 自监督预训练+fine tuning 的方式,主要解决两个问题
- 预训练的训练目标是什么?损失函数是什么?
- 预训练得到的特征表示如何迁移到下游任务中?
解决方案
使用语言模型作为预训练的目标,在下游任务上做有监督的fine tuning
预训练
预训练使用无标签语料作为输入,以语言模型的最大似然函数为训练目标(给定前n-1个token,预测第n个token的条件概率)
模型使用transformer-decoder结构,最后一层通过softmax计算预测词的概率
下游任务-fine tuning
fine-tuning 使用下游任务的有标签语料,增加一个全连接sfotmax输出层,预测对应标签,损失函数为所有训练数据的log最大似然
另外增加了一个辅助训练目标,在下游任务上训练语言模型,使用两个损失函数求和作为最终的训练目标($\lambda$ 为控制辅助训练目标对结果影响程度的参数)
针对不任务,仅仅使用softmax预测概率无法满足任务要求(如句子相似度衡量,需要输入两个句子,判断两个句子之间的相似度),gpt针对不同任务设计了不同类型的输入(Task-specific input transformations)
实现细节
模型细节
- 12层的transformer-decoder,768隐藏层维度+12注意力头数,去掉了与encoder输出共同计算的注意力层(或者说使用 masked Multi Self Attention的encoder)
- 使用GLUE作为激活函数
- 使用 bytepair encoding (BPE) 词典,包含4000词
- 使用模型学习position encoding,而不是transformer论文中的三角函数计算
训练细节
- 训练数据集为 BooksCorpus dataset(contains over 7,000 unique unpublished books)
- 预训练:优化器为Adam,最大学习率为 $2.5*10^{-4}$,dropout=0.1,在batchsize=64,seq_length=512的条件下,训练100个epoch
- 微调:lr = 6.25e-5 , batchsize = 32, dropout = 0.1,训练3个epoch
总结
本文主要针对两个问题提出了解决方案,并在不同NLP上验证,得到了不错的效果
预训练的训练目标是什么?
使用语言模型作为与训练目标(predict next token)
预训练得到的特征表示如何迁移到下游任务中?
Task-specific input transformations + softmax predict层 在下游任务微调
GPT2
在BERT刷榜之后,GPT2带着更大的模型、更多的训练数据卷土重来,不再将关注点聚焦于 预训练+微调,转而研究语言模型在无监督多任务学习上的可能性
要解决的问题
论文中提出目前NLP领域主流的 预训练+微调 存在问题,即该方法仍需要监督学习,需要下游任务的大量有标签训练数据。本文将NLP的一般任务和特定任务定义为两种条件分布
- 一般任务为 $p(output|input)$ 给定输入,对应输出的条件分布
- 特定任务 $p(output|input,task)$ 在特定任务上,输出不仅取决于输入,还取决于任务类型
传统的预训练+fine-tuning方式
- 预训练即模拟 $p(output|input)$条件分布
- fine-tuning 通过在不同任务上调整模型架构、参数等,模拟 $p(output|input,task)$条件分布
gpt2想要避免监督学习过程,即不在下游任务上做微调,引出了两个问题
- 如何预训练能使得预训练过程中学到下游任务的信息?(原文中的句子:the global minimum of the unsupervised objective
is also the global minimum of the supervised objective. 全局非监督的收敛 等价于 全局监督学习的收敛)- 举个例子:像人学英语一样,背单词+看文章看看多了,就算从来没刷过题,题目也能做得效果不错
- 如何不调整模型参数或者架构,实现从 $p(output|input)$ 到 $p(output|input,task)$ 转变,以适应下游任务?
解决方案
基本思路和GPT1区别不大,预训练语言模型+下游任务输入调整,不进行微调训练,个人觉得他的第二章Approach 前面关于理论来源的部分写的非常好,我读完感觉非常科学(也可能是我知识比较薄,看不出问题),分问题阐述一遍
如何预训练能使得预训练过程中学到下游任务的信息
Preliminary experiments confirmed that sufficiently large language models are able to perform multitask learning in this toy-ish setup but learning is much slower than in explicitly supervised approaches.
从两个角度解决该问题:
训练具备多任务学习能力的模型:语言模型
- 通过论文证明,语言模型具备多任务学习的能力,缺点是训练速度较慢
输入包含多任务信息的数据:WebText 数据集
本文认为网络文本信息量巨大,包括各种下游任务中需要的数据信息,使用大量网络文本训练,能够使得模型学到不同任务的信息(multi task learning)
本文构造了一个WebText数据集,作者举了一些包含下游任务(NMT)数据的例子
如何不调整模型参数或者架构,就能适应下游任务
延续了GPT中的一些思路,通过修改输入表达方式,实现对下游任务的适应,以从英文到法文的机器翻译任务为例,在输入源句子的同时,以”english sentence = french sentence”为条件合并输入模型(文中成为 task hint)
在摘要任务中,论文尝试剔除了这种 ”task hint“,发现任务指标下降了6.4个点,作者认为这证明了 使用自然语言提示模型针对任务改变的可行性
顺带探讨的问题
在研究论文主要问题时,还顺带提了一下数据污染问题,即训练数据集和测试数据集之间重叠的问题,作者推荐在构建划分新的NLP数据训练集和测试集时,使用基于n-gram重叠的方法验证是否存在该问题
实现细节
模型细节
使用BPE构建子词字典,为了避免无意义单词出现(”dog.“,”dog?”),限制不同类型字符共同出现,字典大小为 50257
将transformer檐式结构结构中的 Post-LN 修改为了 Pre-LN(即把layer normalization移动到每个子层的前面,输入做归一化,输出不做)
训练细节
batchsize=512,seq_length=1024
共有四个模型大小,最小的和gpt一一致,第二个与bert_large一致,最大的为GPT2
总结
本文使用更大的模型尝试证明语言模型在zero-shot上的可行性,在许多任务上取得不错的成绩。
GPT3
GPT3是对GPT2在zero shot learning上的进一步推进,GPT2效果没有达到预期,就在GPT3上继续增加模型和训练数据规模,提升效果,在完全预训练模型上继续推广,提出了三种将预训练应用到下游任务的非预训练方式(所谓的 in-context learning)
Few-Shot 解决下游任务时,在输入中提供几个任务样例
一个任务提示
几个任务样例(prompt)
One-shot
只给一个任务提示
Zero-shot 完全不给任务提示,只告诉任务是什么
GPT3将模型规模增大到原来的1000倍
又构建了一个集合以往各种文本数据的巨大数据集
总结
GPT3文章太长,我只粗略地读了一遍,总体思路还是企图证明大规模预训练语言模型,在下游任务中,即使没有经过预训练,也能实现不错的效果,相较于前两篇论文没有太多新的东西