GPT系列文章
GPT1
GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结:GPT 是一种半监督学习,采用两阶段任务模型,通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-training 中采用了 12 层的修改过的 Transformer Decoder 结构,在 Fine-tuning 中会根据不同任务提出不同的分微调方式,从而达到适配各类 NLP 任务的目的
Improving Language Understanding by Generative Pre-Training
使用通用的预训练来提高语言的理解能力
发表时间:2018年
这篇文献的主要贡献是提出了一种基于生成式预训练的语言理解模型,该模型可以在各种自然语言处理任务上取得显著的性能提升。
在当时的NLP领域,与计算机视觉相比,缺乏大量的标注数据集。然而,无标注的文本语料库却非常丰富。因此,作者首先在大量的非标注语料库中进行生成式预训练(Generative Pre-Training),然后针对每个特定的任务进行区分性微调(Discriminative Fine-Tuning)。这种方法使得模型能够在不同的NLP任务上取得很好的表现。
这里可以说和BERT一样将CV领域成熟的迁移学习的技术引入到了NLP领域中
采用了半监督(Semi-Supervised)的训练方式,即通过无监督学习进行预训练,再通过监督学习进行微调。在评估了RNN网络和transformer网络之后,作者发现后者可以很好地捕捉较长的语言结构,从而使得模型在处理子任务时具有更好的泛化性。这种方法为模型的训练带来了很好的效果。
对于GPT1系列的文章我们主要介绍的就是GPT1系列的一个训练过程并展示一下对应的实验结果和数据。
无监督学习下的预训练(Pre-Training)
通过输入文本片段:
U
=
{
u
1
,
…
,
u
n
}
\mathcal{U}=\left\{u_{1}, \ldots, u_{n}\right\}
U={u1,…,un}
其中u1可以表示为单个字符,U可以表示为一个包含许多字符的字符串,根据前k个词来预测下一个词ui的概率:
P ( u i ∣ u i − k , … , u i − 1 ) P\left(u_{i} \mid u_{i-k}, \ldots, u_{i-1}\right) P(ui∣ui−k,…,ui−1)
然后最大化似然函数来进行训练。目标函数如下所示:
P ( u i , u i − 1 , … , u 1 ) = P ( u 1 ) ⋅ P ( u 2 ∣ u 1 ) ⋅ P ( u 3 ∣ u 2 , u 1 ) ⋯ P ( u i ∣ u i − 1 , … , u 1 ) P\left(u_{i}, u_{i-1}, \ldots, u_{1}\right)=P\left(u_{1}\right) \cdot P\left(u_{2} \mid u_{1}\right) \cdot P\left(u_{3} \mid u_{2}, u_{1}\right) \cdots P\left(u_{i} \mid u_{i-1}, \ldots, u_{1}\right) P(ui,ui−1,…,u1)=P(u1)⋅P(u2∣u1)⋅P(u3∣u2,u1)⋯P(ui∣ui−1,…,u1)
L 1 ( U ) = ∑ i = k + 1 n log P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_{1}(\mathcal{U})=\sum_{i=k+1}^{n} \log P\left(u_{i} \mid u_{i-k}, \ldots, u_{i-1} ; \Theta\right) L1(U)=i=k+1∑nlogP(ui∣ui−k,…,ui−1;Θ)
其中k表示给定k个词的情况下,通过模型Θ预测出ui的概率,并将所有出现的词的概率取对数相加作为文本出现的联合概率。预训练的目标即为优化该L1目标函数。
此外,模型仅使用了Transforme的解码器(Decoder)进行预训练
预测过程涉及将n个词进行词嵌入(Word Embedding),然后加上位置嵌入(Position Embedding)。接下来,文本序列通过多层 Transformer 块进行处理,并在最后一层 Transformer 块后进行最后一次投影。最后,经由 Softmax 操作,输出文本中每个词的概率分布。
其中U是tokens的上下文向量,n是层数,We 是词嵌入矩阵token embedding matrix,Wp 是position embedding matrix位置编码矩阵。
h 0 = U W e + W p h l = transformer_block ( h l − 1 ) ∀ i ∈ [ 1 , n ] P ( u ) = softmax ( h n W e T ) \begin{aligned} h_{0} & =U W_{e}+W_{p} \\ h_{l} & =\operatorname{transformer\_ block}\left(h_{l-1}\right) \forall i \in[1, n] \\ P(u) & =\operatorname{softmax}\left(h_{n} W_{e}^{T}\right) \end{aligned} h0hlP(u)=UWe+Wp=transformer_block(hl−1)∀i∈[1,n]=softmax(hnWeT)
GPT预训练模型仅仅只采用transformer的解码器(decoder),是源于解码器中的第一层多头注意力(Multi-Head Attention)采用了掩码(Masked)的操作。论文中采用该方法,将k作为上下文窗口,涂抹掉信息来预测下一个词。这种掩码操作被称为自回归性质,它可以确保模型在生成序列时遵循语言的线性顺序,而不会出现随意跳跃或重复生成的情况。
监督学习下的微调(fine-tuning)
在进行大量无标注的文本语料库训练后,模型还需要在某些特定的目标任务下进行微调。给定文本
x 1 , … , x m x^{1}, \ldots, x^{m} x1,…,xm
和相应的标注信息y,将它们输入到预训练模型中进行微调。在微调过程中,hlm表示最后一层Transformer块的输出,Wy表示最后一层输出层的参数。
P ( y ∣ x 1 , … , x m ) = softmax ( h l m W y ) . P\left(y \mid x^{1}, \ldots, x^{m}\right)=\operatorname{softmax}\left(h_{l}^{m} W_{y}\right) . P(y∣x1,…,xm)=softmax(hlmWy).
L 2 ( C ) = ∑ ( x , y ) log P ( y ∣ x 1 , … , x m ) L_{2}(\mathcal{C})=\sum_{(x, y)} \log P\left(y \mid x^{1}, \ldots, x^{m}\right) L2(C)=(x,y)∑logP(y∣x1,…,xm)
另外,将预训练好的语言模型作为辅助目标进行 Fine-tuning 不仅可以使监督模型更具泛化性,还可以加速收敛。于是我们有了最终的损失函数的形式:
L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_{3}(\mathcal{C})=L_{2}(\mathcal{C})+\lambda * L_{1}(\mathcal{C}) L3(C)=L2(C)+λ∗L1(C)
模型结构图与举例
图 1:(左)本工作中使用的 Transformer 架构。 (右)用于对不同任务进行微调的输入转换。 我们将所有结构化输入转换为令牌序列,以便由我们的预训练模型进行处理,然后是线性+softmax层。
这里的堆叠12层的解码器结构,就和BERT中的基本模型这里的堆叠12次解码器的结构相互对应起来了。
通过添加的线性层(Linear),也是上文说的Wy参数,进行下游的任务的时候不修改transformer的结构来进行微调的实现。
- 分类 (Classification):输入开始符(Start),文本(Text),抽取符(Extract),线性层即输出分类数。
- 包含(Entailment):输入开始符(Start),文本(Text),分隔符(Delim),假设(Hypothesis),抽取符(Extract),线性层输出类似包含,不包含,无关三分类。
- 相似(Similarity):输入开始符(Start),文本(Text 1),分隔符(Delim),文本(Text 2),抽取符(Extract);输入开始符(Start),文本(Text2),分隔符(Delim),文本(Text1),抽取符(Extract)。经过相加后进入线性层,输出两端文本在不同语境下是否相似的。
- 多选(Multiple Choice):输入开始符(Start),文本(Context),分隔符(Delim),答案(Answer 1),抽取符(Extract);输入开始符(Start),文本(Context),分隔符(Delim),答案(Answer N),抽取符(Extract);每个输入都经过一个线性层而后通过softmax操作求出每个答案的置信度。
实验部分细节
最后实验是在包含7000篇没有发表的书籍上进行训练,使用12层的transformer解码器,每一层包含768维的网络进行训练,使用了3072维数的FFN(Position-wise Feed-Forward Network)层,使用了Adam优化器和GELU激活函数。
以上就是对现在大火的GPT模型最早的一个版本的简单的概述。
GPT2
在BERT模型发布并且开源之后,其在NLP上的性能已经超过了GPT1之后的GPT2这一篇文章就是对GPT1模型的一个改进。
Language Models are Unsupervised Multitask Learners
语言模型是无监督的多任务学习器
使用更大的数据集和更大的模型来去打败之前的BERT
研究背景
- 单任务,单领域任务的流行造成当前的机器学习系统缺乏泛化能力。而多任务学习是一个提升通用能力的很有前途的一个框架。但NLP中的多任务学习仍处于起步阶段,另一方面,当前的预训练和无监督微调的方式很流行,但仍需要监督训练。
- 证明语言模型可以在zero-shot setting下,不需要任何参数或架构修改执行下游任务,并取得相当不错的效果
首先摘要中讲到他们的语言模型在一个包含数百万网页的WebText数据集上没有任何显式监督的情况下进行学习。
GPT-2模型是一个有1.5B(15亿)参数的Transformer,在zero-shot setting下,在8个任务中的7个任务上都取得的sota。
GPT2论文中所提出的一个核心的观点就是基于zero-shot的一个推理过程。多任务学习与我们常规理解的有监督学习中的多任务不太一样,这里主要是指模型从大规模数据中学到的能力能够直接在多个任务之间进行迁移
,而不需要额外提供特定任务的数据,因此引出了 GPT-2 的主要观点:zero-shot。
这里也就是说:不论是 GPT-1 还是 BERT,NLP 任务中比较主流的 pre-train + fine-tuning 始终还是需要一定量的下游任务有监督数据去进行额外的训练,在模型层面也需要额外的模块去进行预测,仍然存在较多人工干预的成本。GPT-2 想彻底解决这个问题,通过 zero-shot,在迁移到其他任务上的时候不需要额外的标注数据,也不需要额外的模型训练。
模型结构
GPT2和GPT1在模型结构上基本上是相同的,这里只对改进的地方进行一下简单的概述。
在模型结构方面,整个 GPT-2 的模型框架与 GPT-1 相同,只是做了几个地方的调整,这些调整更多的是被当作训练时的 trick,而不作为 GPT-2 的创新,具体为以下几点:
- 后置层归一化( post-norm )改为前置层归一化( pre-norm )
GPT-2 进行上述模型调整的主要原因在于,随着模型层数不断增加,梯度消失和梯度爆炸的风险越来越大,这些调整能够减少预训练过程中各层之间的方差变化,使梯度更加稳定。
-
在模型最后一个自注意力层之后,额外增加一个层归一化;
-
输入序列的最大长度从 512 扩充到 1024;
之前的GPT1和BERT在做具体的微调的时候,或加入一些额外的开始符,结束符和分隔符等一些符号。这里要做基于zero-shot的推理的话就不能在存在这个了。
模型训练
GPT-2采用了一阶段的模型(预训练)代替了二阶段的模型(预训练+ Fine tuning)。在预训练阶段,GPT-2采用了多任务的方式进行学习,每一个任务都要保证其损失函数能收敛。不同的任务共享主干的Transformer参数,这样能进一步提升模型的泛化能力,因此在即使没有Fine-turning的情况下依旧有非常不错的表现。
模型参数大小对比:最大的GPT模型约1.17亿参数(117M);最大的BERT约3.4亿参数(340M),最大的GPT-2约15亿参数(1542M)
在训练数据方面,为了保证 zero-shot 的效果,必须要足够大且覆盖面广。所以 GPT-2 专门爬取了大量的网络文本数据,最后得到的数据集叫 WebText。它选取了 Reddit 上的高质量帖子,最终得到 4500w 网页链接,800w 有效的文本文档,语料大小为 40G。
在实验效果上,由于 GPT-2 主要是做 zero-shot,所以在实验部分,很多的实验对比都是在无监督的设定下进行的,也就是说他对比的都是无监督的算法。
从上述效果可以看到,GPT-2 在较多任务上对比无监督算法取得了一定的提升,证明了 zero-shot 的能力。但是,在很多任务上与有监督微调的方法相比还是有一些差距的,这可能也是 GPT-2 在当时影响力没有那么大的一个原因
但是通过这个趋势可以看出随着模型参数量和规模的增大,这些翻译,总结和回答问题任务中所表现出来的性能是不断线性的上升的这就为我们的GPT3的推出打下了一个基础。
GPT3
整体来看,GPT-3 相比于 GPT-2 有如下几点区别:(大力出奇迹的过程)
- 效果上,超出 GPT-2 非常多,能生成人类难以区分的新闻文章;
- 主推 few-shot,相比于 GPT-2 的 zero-shot,具有很强的创新性;
- 模型结构略微变化,采用 sparse attention 模块;
- 海量训练语料 45TB(清洗后 570GB),相比于 GPT-2 的 40GB;
- 海量模型参数,最大模型为 1750 亿,GPT-2 最大为 15 亿参数;
Language Models are Few-Shot Learners
GPT3又重新回到了不在追求极致的zero-shot的推理而是对不同的任务使用少量的训练的样本
总结:不管是GPT或者GPT-2,下游任务都需要大量的样本。这不符合人类的习惯,人类只需要少量的示例甚至只需要说明就适应一个全新的NLP下游任务。而GPT-3追求的就是人类这种无缝融合和切换多个任务的能力。GPT-3证明了通过增大参数量就能让语言模型提高下游任务在Few-Shot设置下的性能。
GPT-3证明了通过增大参数量就能让语言模型提高下游任务在Few-Shot设置下的性能。
研究背景
虽然 GPT-2 主推的 zero-shot 在创新度上有比较高的水平,但是由于其在效果上表现平平,所以在业界并没有取得比较大的影响力,而 GPT-3 正是为了解决效果上的问题而提出的。GPT-3 不再去追求那种极致的不需要任何样本就可以表现很好的模型,而是考虑像人类的学习方式那样,仅仅使用极少数样本就可以掌握某一个任务
1750亿参数、数据集45TB,训练花了3640pfs-day,训练一次的费用保守估计是460万美元,总训练成本估计达到了1200 万美元。暴力出奇迹。此时微软已经投资OpenAI(2019年投了10亿美元),微软也在2020年9月22日宣布取得了GPT-3的独家授权。
下游任务评估方法
-
One-shot Learning:
- 定义:在一次学习中,模型在训练阶段只看到一个样本的情况下,需要在推理阶段识别出新的样本。
- 特点:模型需要极高的泛化能力,能够从单一样本中快速学习并识别出同一类别的新样本。
-
Few-shot Learning:
- 定义:在少样本学习中,模型在训练阶段只看到很少数量的样本(通常几个到几十个),然后在推理阶段识别出同一类别的新样本。
- 特点:相比于传统的机器学习任务,少样本学习更接近于人类学习的方式,即通过少量样本快速学习新概念。
Zero-shot表示仅需给出任务描述,One-shot表示仅需给出任务描述和一个例子,Few-shot表示仅需给出任务描述和少量的例子,这三种方式都不再需要进行参数更新,仅需要把少量标注样本作为输入文本的上下文,GPT-3即可输出答案。
模型结构的改进
在模型结构上,GPT-3 延续使用 GPT 模型结构,但是引入了 Sparse Transformer 中的 sparse attention 模块(稀疏注意力)。
sparse attention 与传统 self-attention(称为 dense attention) 的区别在于:
- dense attention:每个 token 之间两两计算 attention,复杂度 O(n²)
- sparse attention:每个 token 只与其他 token 的一个子集计算 attention,复杂度 O(n*logn)
训练数据
训练数据:由于 GPT-3 在模型规模上的扩大,在训练数据方面也必须进行扩充来适配更大的模型使其发挥出相应的能力。
GPT-3 使用了多个数据集,其中最大的是 Common Crawl,原始未处理的数据达到了 45TB,其实在 GPT-2 的时候他们就有考虑使用这个数据集,但是后来还是觉得这个数据集太脏了所以没用,但是现在 GPT-3 的模型规模太大了,使得训练对数据量的需求也增加了很多,他们不得不重新考虑这个数据集。因此,他们必须在这个数据集上做一些额外的数据清洗工作来尽量保证数据的质量。
GPT4展望
GPT4作为现在最先进的一个大模型之一,已经不是单纯的一个语言模型了而是一个多模态的模型,可以处理图文数据并产生图片和视频。
应用包括了许多:微软公布了GPT加持的Copilot