GPT全称是 Generative Pre-Trained Transformer。顾名思义,GPT的目的就是通过Transformer为基础模型,使用预训练技术得到的通用的文本模型。目前已经公布论文的有文本预训练GPT-1、GPT-2、GPT-3,以及InstructGPT。ChatGPT和InstructGPT在模型结构,训练方式上都完全一致,即都使用了指示学习(Instruct Learning)和人工反馈的强化学习来指导模型的训练,他们的不同仅仅是采集数据的方式上有差异。
GPT1、GPT2、GPT3的共同点是其结构都基于Transformer的Decoder层。
其区别在于:GPT是常规语言模型,GPT2的卖点是zero-shot,GPT3的卖点是few-shot
GPT1:Improving Language Understanding by Generative Pre-Training
目前NLU(Natural Language Understading)方向的局限性:有标签的数据相对较少,限制了模型性能的提升。
基本思想
先在没有标签的数据集上训练预训练语言模型,再在子任务上微调(自监督学习)。与之前的类似任务相比,亮点在于微调时只需要改变输入形式,而不需要改变模型结构。
无监督的预训练过程
给定一个序列,使用一个标准的语言模型目标来最大化下面的似然函数:
其中,代表模型参数,k为上下文窗口大小,这里只考虑左侧窗口的词汇信息(单向Transformer)。即给定一个模型(GPT中指的是Transformer decoder),给定前k个词,预测当前词。
预训练阶段是没有Start,Delim,Extract这些特殊符号的,模型通过微调阶段学习这些token。
GPT中,作者基于12层的Transformer改进。在GPT中,作者对position embedding矩阵进行随机初始化,让模型自己学习,而不是采用正余弦函数进行计算(原Transformer用的三角函数)。
有监督的微调阶段
有标签的数据集C上每个样本包含一个句子和对应的标签y。将输入预训练模型,获取decoder最后一层的对应的编码,将它传入一个额外的线性输出层来预测y:
最大化下列的目标函数:
在微调阶段引入预训练任务,把语言模型的目标引入到目标函数中,作为辅助函数,可以提高模型的通用能力,并且加速模型收敛:
其中,为可调节的超参数。
GPT和BERT的区别
GPT使用的Transformer的Decoder层(目标函数为标准的语言模型,每次只看到当前词之前的词,需要用到Decoder中的Masked Attention),BERT使用的Transformer的Encoder层(目标函数为带[Mask]的语言模型,通过上下文预测当前词,对应Encoder)。
为什么GPT的性能比BERT差
GPT预训练时的任务更难
BERT预训练用的数据集大小几乎是GPT的四倍
GPT-2:Language Models are Unsupervised Multitask Learners
相较于GPT的改进:
更大的数据,更大的模型,将卖点指向zero-shot。
去掉了fine-tuning层:不再针对不同的任务进行微调建模,而是不定义模型应该做什么任务,模型自动识别出来需要做什么任务。
调整Transformer:将layer normalization放到每个sub-block之前,并在最后一个self-attention后再增加一个layer normalization.
GPT2提出的最重要的思想是“所有的监督学习都是无监督语言模型的一个子集”,这个思想也是提示学习(Prompt Learning的前身)
能做的task:阅读理解、翻译、总结、问答
无监督的预训练阶段和GPT相同。
zero-shot的下游任务
下游任务转向做zero-shot而放弃微调。相较于GPT,由于缺少fine-tuning阶段,模型没有机会学习Start、Delim、Extract这些特殊的token。因此,GPT使用一种新的输入形态:增加文本提示,后来被称为Prompt。
GPT-3: Language Models are Few-Shot Learners
主要贡献
虽然pre-train+fine-tune在许多情况下效果显著,但是微调过程需要大量样本。这一框架不符合人类习惯,人类只需要少量的示例或任务说明就能适应一个新的NLP下游任务。本文证明了通过增大参数量就能让语言模型显著提高下游任务在Few-shot设置下的性能。(证明了大规模语言模型使用元学习策略的可能和fine-tune策略的非必要性)。175B parameters。
fine-tuning的问题
每一个新的任务都需要大量的标记数据不利于语言模型的应用。
提高模型表征能力的同时降低数据分布的复杂度是不合理的。比如,大模型不能在样本外推预测时具有好效果,说明fine-tuning导致模型的泛化性降低了。
人类在接触一个下游语言任务时不需要大量样本,只需要一句对新任务的描述或者几个案例。人类这种无缝融合和切换多个任务的能力是我们当前自然语言技术所欠缺的。
模型移除fine-tuning有两个解决方案
meta-learning:模型在训练阶段具备了一系列模式识别的能力和方法,并通过在预测过程中利用这些能力和方法以快速适应一个下游任务。最近的一些研究尝试通过in-context来实现上述过程,但效果不佳。
Large scale transformers:Transformer语言模型参数的每一次增大都会让文本理解能力和其他NLP下游任务的性能得到提升。此外,有研究指出,许多下游任务性能的log损失能让模型的性能和参数之间服从一个平滑的趋势。考虑到in-context learning回到学习到的知识和方法存在模型的参数中。本文假设:模型的情境学习能力也会随着参数规模的增长而增长。
情境学习(in-context learning):在被给定的几个任务示例或一个任务说明的情况下,模型应该能通过简单预测来补全任务中的其他示例。即,情境学习要求预训练模型要对任务本身进行理解。情境学习是元学习(Meta-learning)的一种,元学习的核心思想在于通过少量的数据寻找一个合适的初始化范围,使得模型能够在有限的数据集上快速拟合,并获得不错的效果。
情境学习分为三类:zero-shot learning、one-shot learning、few-shot learning。
GPT3是不做梯度更新的few-shot,对于所有子任务,GPT-3不做任何梯度更新或者是微调。
下游任务
本文聚焦于系统分析同一下游任务不同设置下,模型情境学习能力的差异。下游任务的设置有以下四类:
Fine-tuning(FT):FT利用成千上万的下游任务标注数据来更新预训练模型中的权重疑惑地强大的性能。但是,该方法不仅导致每个新的下游任务都需要大量的标注预料,还导致模型在样本外预测的能力很差。
Few-Shot(FS):模型在推理阶段可以得到少量的下游任务示例作为限制条件,但是不允许更新预训练模型中的权重。FS的主要优点是并不需要大量的下游任务数据,同时也防止了模型在fine-tune阶段的过拟合。FS的主要缺点是不仅与fine-tune的SOTA模型性能差距较大且仍需要少量的下游任务数据。
One-Shot(1S):这种方式与人类沟通的方式最相似。
Zero-Shot(0S):0S的方式是非常具有挑战的,即使是人类有时候也难以仅依赖任务描述而没有示例的情况下理解一个任务。但0S设置下的性能是最与人类的水平具有可比性的。
数据集生成
对抗学习(将GPT2数据集中的样本作为正例,CommonCrawl数据集中的样本作为负例,训练一个线性分类器,去预测CommonCrawl中的其他样本是属于正例还是负例,如果属于正例,则将它加入GPT3的数据集)+去重(lsh)
lsh算法:主要用于大规模数据时,计算两两之间的相似度。基本思想:基于一个假设,如果两个文本在原有数据空间是相似的,那么他们分别经过哈希函数转换以后的他们也具有很高的相似度。
局限性
文本生成上的效果较弱。
结构和算法的局限性。只能看当前词之前的信息(decoder);每个词都均匀地预测下一个词,没有哪一个词更重要。
只学习文本。未涉及其他模态
样本的有效性不够
无法解释
强化学习:基于环境的反馈而行动。需要每一步行动环境基于反馈,基于反馈不断调整训练对象的行为。