every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it
0. 前言
从GPT1 到GPT3

1. GPT1
时间:2018年
作者: Alec Radford Karthik Narasimhan Tim Salimans Ilya Sutskever
1.1 整理理解
在GPT-1之前(和ELMo同一年),传统的NLP模型往往使用大量的数据对有监督的模型进行任务相关的模型训练,但是这种有监督学习的任务存在两个缺点:
- 需要大量的标注数据,高质量的标注数据往往很难获得,因为在很多任务中,图像的标签并不是唯一的或者实例标签并不存在明确的边界;
- 根据一个任务训练的模型很难泛化到其它任务中,这个模型只能叫做"领域专家"而不是真正的理解了NLP。
GPT1的思想是先再无标签的数据上学习通用的语言模型,再在特定的任务上进行微调。
GPT1的思想是先再无标签的数据上学习通用的语言模型,再在特定的任务上进行微调。
GPT1的思想是先再无标签的数据上学习通用的语言模型,再在特定的任务上进行微调。
主要的原因还是现实生活中,无标签数据占大多数,而有标签数据往往很少,而且有标签数据往往需要花费大量的人力物力去标注。所以,GPT1的思想就是先在无标签数据上学习通用的语言模型,然后再在特定的任务上进行微调。
1.2 进一步
1.2.1 网络结构
下面是标准的Transformer结构,GPT1就是基于这个结构进行改进的(采用decoder,并删除其中没有mask的多头注意力(红框))。
具体来说,GPT1采用的是decoder部分,由于其是单向的,所以encoder中的多头注意力不适用(没有mask的话,预测当前词能看到其前面和后面的),所以采用了decoder部分(由于其有mask,预测当前词只能看到其前面的词)。
整体由12个decoder组成。
1.2.2 关于输入
由于GPT1下游有不同的任务,而这些任务之间的输入格式是不一样的,所以对不同的输入(分类、推理、相似、问答)进行了统一,这样后续微调是就不用再动输入形式了。如下图。

其中分词采用的是Byte Pair Encoding (BPE)。
简单来说,根据子词频率搞的进行合并。
1.2.3 无监督预训练
优化目标:
- k: 滑动窗口大小
- P: 条件概率
- Θ \Theta Θ : 模型参数
1.2.4 微调
输入是m各token x 1 , . . . , x m {x^1,...,x^m} x1,...,xm , 对应的标签是y。
首先将这些token输入到预训练好的模型中,得到最终的特征向量 h l m h_l^{m} hlm,然后再通过全连接层得到预测结果y。

优化目标:
微调阶段增加**语言模型(language model)**作为辅助,最终的由优化目标为:
1.3 能力
在有监督学习的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只是一个简单的领域专家,而非通用的语言学家。
1.4 结论
- 使用Transformer作为基础结构,避免了LSTM在捕获长期依赖关系上的困难。
- 使用无监督预训练,在大量无标签数据上进行预训练,提高了模型的泛化能力。
- 使用微调,在特定任务上进行微调,提高了模型的性能。
2. GPT2
2.1 整体理解
GPT2相比GPT1做的更加"极端",直接无监督训练,抛弃的微调过程。讲究的是"大力出奇迹"。
作者猜测,单任务训练在单一领域数据集上的普遍性是当前系统缺乏泛化能力的主要原因之一。
所以作者采用在在更广泛的领域和数据集上训练模型,以获得更好的泛化能力。
模型依然采用的是Transformer结构的decoder部分,分为四个不同的版本。层数分别为12、24、36、48。其中,
- 12层为了GPT1作对比;
- 24层为了BERT作对比;
- 36层用于对比;
- 48层为真正的GPT2。
模型种类:
名成 | 层数 | 参数 | 输入维度 | 备注 |
---|---|---|---|---|
smallest | 12 | 117M | 768 | 和GPT1对比 |
medium | 24 | 345M | 1024 | 和BERT对比 |
large | 36 | 762M | 1280 | |
largeest | 48 | 1542M | 1600 | GPT2 |

训练数据采集自Reddit,命令为WebText,数据量为:40G。 其中剔除了Wikipedia的文章。
2.2 模型和数据
2.2.1 模型结构
整体来说和GPT1类似,由多个decoder层组合而来,略微做了一点小改动。
- Layer Normalization移动到每个Transformer Block之前;
- self-attention之后增加了Layer Normalization;
- 修改了残差连接的权重 1 N 1 \over \sqrt{N} N 1
- 词表增加到50257;
- 上下文大小从512增加到1024;'
- bactch size 512。
左边是GPT1的block,右边是GPT2的block。
2.2.1 数据
GPT-2的文章取自于Reddit上高赞的文章,命名为WebText。数据集共有约800万篇文章,累计体积约40G。为了避免和测试集的冲突,WebText移除了涉及Wikipedia的文章。
2.3 训练目标
训练目标:
即,根据输入预测下文,可以表示为: p ( o u t p u t ∣ i n p u t ) p(output|input) p(output∣input)
2.4 能力
- 在8各语言模型任务中,在zero-shot情况下,有7个超过了SOTA
- 在文本总结表现不佳,但它的效果与由监督的模型接近。
2.5 小结
**GPT-2的最大贡献是验证了通过海量数据和大量参数训练出来的词向量模型有迁移到其它类别任务中而不需要额外的训练。**但是很多实验也表明,GPT-2的无监督学习的能力还有很大的提升空间,甚至在有些任务上的表现不比随机的好。尽管在有些zero-shot的任务上的表现不错,但是我们仍不清楚GPT-2的这种策略究竟能做成什么样子。GPT-2表明随着模型容量和数据量的增大,其潜能还有进一步开发的空间,基于这个思想,诞生了我们下面要介绍的GPT-3。
3. GPT3
之前的研究主要基于pretrain+finetune,当模型在下游任务上训练以后,往往失去了泛化能力,为此,GPT3相比GPT2更进一步,模型更大,训练数据更多。
3.1 不同方法
3.1.1 fine-tuing(微调)
主流的一种方式,对预训练任务在有标签的数据上进行监督训练。
微调的主要优点是可以在许多基准测试中表现出色。主要缺点是每个任务都需要一个新的大数据集,可能导致模型在分布外泛化能力差 [MPL19],以及可能利用训练数据中的虚假特征 [GSL+18, NK19],这可能导致与人类表现的不公平比较

3.1.2 few-shot learning(少样本学习)
少样本(Few-Shot, FS)是我们在本研究中使用的术语,指的是模型在推理时给定少量任务示例的设置,作为条件输入 [RWC+19],但不允许更新权重。
对于一个典型的数据集,一个示例具有上下文和期望结果(例如,一个英语句子及其法语翻译),少样本学习通过提供 K 个上下文和完成示例来实现,然后再给出一个上下文示例,模型需提供相应的完成。
我们通常将 K 设置在 10 到 100 之间,因为这是模型上下文窗口(nctx = 2048)能够容纳的示例数量。少样本学习的主要优点是显著减少对任务特定数据的需求,并降低从大型但狭窄的微调数据集中学习过于狭窄分布的潜在风险。
主要缺点是这种方法的结果迄今为止远不及最先进的微调模型。 此外,仍然需要少量的任务特定数据。如其名称所示,这里描述的语言模型的少样本学习与在其他机器学习上下文中使用的少样本学习相关 [HYC01, VBL+16]------两者都涉及基于广泛任务分布(在此情况下隐含于预训练数据)进行学习,然后快速适应新任务。
简单来说: 在推理阶段,给少量的样本,然后进行推理,不需要微调。
严格来说: 不是传统意义上的学习,因为没有参数的更新。

3.1.3 one-shot learning(单样本学习)
一例样本(One-Shot, 1S)与少样本学习相同,唯一的区别是只允许一个示例,并提供任务的自然语言描述,区分一例样本、少样本和零样本的原因在于,它最接近某些任务向人类传达的方式。例如,当要求人类生成一个关于人类工人服务的数据集(例如 Mechanical Turk)时,通常会给出一个任务示例。相反,如果没有示例,有时很难传达任务的内容或格式。

3.1.4 zero-shot learning(零样本学习)
零样本(Zero-Shot, 0S)与一例样本相同,但不允许提供任何示例,模型只获得描述任务的自然语言指令。 这种方法提供了最大的便利性、潜在的鲁棒性,并避免了虚假关联(除非这些关联在大规模预训练数据中非常普遍),但也是最具挑战性的设置。
在某些情况下,即使是人类在没有先前示例的情况下也可能难以理解任务的格式,因此这种设置在某些情况下是"过于困难"的。
例如,如果有人被要求"制作一张关于200米短跑的世界纪录表",这个请求可能会模糊不清,因为可能不清楚表格的具体格式应是什么,或应包含哪些内容(即使经过仔细澄清,确切理解所需内容也可能很困难)。
尽管如此,至少在某些情况下,零样本最接近人类执行任务的方式------例如,在图 2.1 的翻译示例中,人类可能仅凭文本指令就知道该怎么做。

3.1.5 小结
这三种"shot"方法虽然在推理时给出的示例数量不同,但实际上它们在适应新任务时的机制是不同的。
- 零样本(Zero-Shot): 模型仅依赖于自然语言指令,没有示例。 这种方式要求模型充分利用其在预训练阶段所学的知识和模式,来理解和完成任务。
- 一例样本(One-Shot): 模型在推理时提供一个示例,使其能够更好地理解任务的格式和要求。 这个示例可以帮助模型更准确地进行推理。
- 少样本(Few-Shot):提供多个示例, 使模型能够捕捉到更多的任务特征和模式,从而提高性能。
虽然在这三种设置中都没有进行参数更新,但模型在处理任务时利用的上下文信息和已知示例的数量不同,导致其在理解和推理能力上的差异。因此,它们的表现通常会有所不同。少样本和一例样本方法通常能更有效地指导模型,从而提升性能。
不是传统意义上更新参数进行"学习",而是利用上下文信息进行"学习"。
这三种方法都是在推理阶段进行的,而不是在训练阶段进行的。因此,它们不需要额外的训练数据,只需要在预训练阶段学习到的知识。
这三种方法都是在推理阶段进行的,而不是在训练阶段进行的。因此,它们不需要额外的训练数据,只需要在预训练阶段学习到的知识。
这三种方法都是在推理阶段进行的,而不是在训练阶段进行的。因此,它们不需要额外的训练数据,只需要在预训练阶段学习到的知识。
3.2 模型与数据
3.2.1 模型
GPT-3进一步将模型扩大。GPT2参数量为1.5B(15亿),GPT3参数量扩大到175B(1750亿)。整整扩大了116倍。
对比更加丰富,总共有8种不同的模型,参数量从125M到175B不等。
模型整体和GTP2类似 ,主要区别是将其中的attention替换为sparse attention,即稀疏注意力机制。稀疏注意力机制可以减少计算量,从而提高模型的训练速度和效率。
传统的attention是两两token进行计算,复杂度为O(n^2),而稀疏注意力机制只对部分token进行计算,复杂度为O(nlogn),从而大大减少了计算量。

3.2.2 数据
GPT-3的训练数据包括低质量的Common Crawl(对其进行了过滤),高质量的WebText2,Books1,Books2和Wikipedia。GPT-3根据数据集的不同的质量赋予了不同的权值,权值越高的在训练的时候越容易抽样到。
总数据量达到570G

训练时间:
3.3 结果
GPT3主要利用的是上下文学习(in-context learning),具体可以细分为上面提到的三种方式(zero-shot、one-shot、few-shot)。
尽管在推理阶段没有更新参数,上下文学习(in-context learning)仍被称为"学习",是因为模型利用其预训练过程中获得的知识和模式来适应新任务。这种适应过程虽然不涉及参数调整,但模型能够根据提供的示例和指令识别并执行任务,因此仍然被视为一种学习形式。实际上,它更多地是依赖于模型的泛化能力和上下文理解,而非传统意义上的学习。
如下图所示,随着参数的增加模型更强,同时few-shot > one-shot > zero-shot。

下图,可以看到随着参数的增加,模型在各个任务上的表现都得到了提升。
- 当测试案例数量越多时,效果越好。
- 当测试案例很多时,prompt(自然语言描述)变得不那么重要,因为模型已经学会了如何处理任务。
3.4 小结
- 随着模型增大(GPT2 1.5B,GPT3 175B),数据量增大(GPT2 40G GPT3 570G),模型在各个任务上的表现都得到了提升。
- 存在一定的数据污染问题
- GPT-3在处理某些任务时可能会出现错误或不准确的结果,以及不合理或不合逻辑的结果。
4. 总结
时间 | 模型 | 参数量 | 层数 | 词向量长度 | 训练数据 |
---|---|---|---|---|---|
2018.6 | GPT1 | 117M | 12 | 768 | 5G |
2019.2 | GPT2 | 1.5B(1542M) | 48 | 1600 | 40G |
2020.5 | GPT3 | 175B | 36 | 12288 | 570G |
关于参数,如下是GPT2-small示例:
参考