GPT 系列:从 GPT-1 到 GPT-3 的演进逻辑

2 分钟阅读
·

没有机器学习背景的工程师补大模型原理的第五站:GPT-1 的预训练加微调、GPT-2 的零样本苗头、GPT-3 的 1750 亿参数与上下文学习,以及 scaling law 和 Chinchilla 给出的规模规律。

本文是「零基础学大模型原理」系列的第 5 篇。这个系列记录一个没有任何机器学习背景的工程师,在 ChatGPT 发布之后从零补原理的过程。

上一篇结尾留了一个问题:如果任务只是语言建模,即给定前文预测下一个词,编码器一侧没有独立输入,只保留解码器和因果掩码是否就足够。这两周顺着这个问题读了 OpenAI 的三篇 GPT 论文。GPT-1 和 GPT-2 是技术报告,写法比正式论文口语;GPT-3 是正式论文,主体是实验结果,结构部分篇幅较少。我也用 Jay Alammar 的 The Illustrated GPT-2 核对结构细节。三代模型的结构差异不大,主要变化在规模和使用方式。本文按时间顺序记录,前置是上一篇,记得因果掩码如何屏蔽未来位置即可。

GPT-1 的预训练和微调

2018 年 6 月的 GPT-1 报告讨论一个问题:有大量未标注文本和一批带标注的 NLP 任务时,如何用前者帮助后者。当时常见做法是为每个任务单独设计、训练模型,文本中可复用的统计规律没有被共享。GPT-1 分两步训练。第一步是无监督预训练:将一个 12 层、1.17 亿参数的 decoder-only Transformer 训练在 BooksCorpus(七千多本未出版的书)上,目标是预测下一个词。第二步是有监督微调:对于分类、蕴含、相似度判断和选择题等下游任务,按论文定义的格式将输入拼为序列。分类任务直接输入句子;选择题将问题分别与每个选项拼接。在序列末尾位置的表示上添加线性层,再用标注数据继续训练。

结构选择上有一个我当时停下来想了一会的点:为什么用解码器,而不是编码器。同样在 2018 年,BERT(10 月)采用编码器路线,通过遮住部分词再预测它们来训练,主要用于理解类任务。GPT 采用自回归解码器。后面的发展表明,这两条路线的适用方式逐渐不同。GPT-1 微调后在论文列出的 12 个任务中有 9 个超过当时的最好结果,表明预训练后的表示可以作为下游任务的起点。限制也很明确:每换一个任务都需要重新微调,模型不能直接覆盖所有任务。

GPT-2 的零样本任务

2019 年 2 月的 GPT-2 报告标题直接提出了主张:Language Models are Unsupervised Multitask Learners,语言模型是无监督的多任务学习者。模型扩大到 15 亿参数、48 层;训练数据换成从 Reddit 高赞链接中收集的 WebText,包含约 800 万网页。它不做下游微调,而是把任务描述写入输入,观察模型能否以零样本(zero-shot)方式完成任务。例如,做摘要时在文章末尾接上 “TL;DR:“;做翻译时,把「法文句子 = 英文句子」的对子排几行,最后留一个等号让模型续写。

结果不如针对任务微调的模型,但阅读理解、摘要和翻译等任务的分数并非为零。报告的解释是,互联网文本中包含不同任务的示例。要降低下一个词预测损失,模型需要拟合这些文本中的输入输出关系,因此预训练可以表现出无监督多任务学习的效果。微调会将部分能力适配到指定任务;不微调时,模型仍可能在输入提示下完成一部分任务。

这一代还有一段发布背景。OpenAI 当时以「可能被用来批量生成假新闻」为由,没有一次发布完整模型。2019 年 2 月只发布了最小的 1.17 亿版本,之后大半年分几次发布更大的版本,15 亿参数的完整模型在 2019 年 11 月发布。社区对此有过争论:一方认为这是负责任的分阶段发布,另一方认为「太危险不敢放」更像营销话术。我读这篇报告时事情已经过去快四年。回看这次发布,它让「模型要不要发布、怎么发布」成为一个需要单独决策的问题,后来的讨论也反复涉及这个问题。

自回归生成为什么使用解码器

把三篇论文串起来之前,先回答上一篇留下的问题:这条路线为什么只用解码器。自回归语言模型将一段文本的概率分解为逐词条件概率的乘积:

训练时使用 teacher forcing:整段真实文本会同时输入模型。在预测 时,模型只能利用 ;实现中通常将输入和标签错开一个位置,使输入位置 的输出预测 。因果掩码阻止每个位置关注后续位置,因此可以在一次前向计算中并行得到所有位置的损失。生成时则从左到右逐词进行:给定开头,模型输出下一个词的概率分布,采样一个词接到末尾,再预测下一个词。

训练目标和生成过程都基于「给定左边所有词,预测右边一个词」。对比之下,BERT 的掩码语言模型训练会遮住 15% 的词并预测它们,目标不是从左到右生成。因此 BERT 本身不能从开头连续生成文本;它适合分类和抽取任务,生成任务需要额外设计。我当时的理解是,自回归目标为后续扩大模型规模提供了统一的训练和推理形式。

GPT-3 的 1750 亿参数和上下文学习

2020 年 5 月的 GPT-3 将参数量扩大到 1750 亿,模型有 96 层、2048 个 token 的上下文窗口,训练数据约 3000 亿 token,主要来自过滤后的 Common Crawl。结构上没有新增模块,论文的重点转向使用方式:不做梯度更新,只在输入中给出示范,再让模型完成任务。报告按输入中例子的数量分为三档:

  • zero-shot:只给任务描述,不给例子。
  • one-shot:给一条例子。
  • few-shot:给 K 条例子,K 一般在几十以内,以塞进上下文窗口为限。

三种方式都在一次前向推理中完成,权重不会更新。论文将「给例子就能完成任务」称为上下文学习(in-context learning),并展示了一组曲线:在部分任务中,模型越大,few-shot 相对 zero-shot 的提升越大。这表示模型利用输入示范的能力会随规模变化。1750 亿参数的模型在部分语言对的 few-shot 翻译上接近当时有监督系统的水平;三位数加减法、按示例格式造句和纠正语法等任务也有可观察的表现。

从 GPT-1 到 GPT-3,结构骨架变化很小,仍是上一篇的解码器和因果掩码。数据量、参数量和训练计算量持续扩大;使用方式则从「微调出一个专用模型」转为「通过输入指定任务」。OpenAI 在这条路线上持续扩大规模。

GPT-1/2/3 三代在参数规模、训练范式、能力边界上的演进时间线

参数、数据和算力的规模规律

模型规模得以持续扩大,部分原因是已有工作量化了损失与规模的关系。2020 年 1 月 Kaplan 等人的 Scaling Laws for Neural Language Models 系统测量了测试损失随模型参数量 N、数据量 D、算力 C 的变化,结论是这些关系在实验范围内近似幂律。以参数量为例:

幂律意味着两边取对数后呈近似直线:规模每增加一个数量级,损失按固定比例下降,论文测量范围内没有观察到平台。论文还给出两个结论:网络形状,例如更深或更宽,对损失的影响较小,参数总量更重要;在算力受限时,应优先增大模型并在训练尚未收敛时停止,而不是将较小模型训练到收敛。GPT-3 的参数与训练 token 配比也接近这一结论所偏好的方向。

2022 年 3 月 DeepMind 的 Chinchilla 论文修正了其中一条。它在固定算力下比较多组模型配置,发现按 Kaplan 的结论选择配置会使模型过大、训练数据过少;计算最优的配置要求参数量和训练 token 数同比扩大。按这个标准训练的 Chinchilla 有 700 亿参数,训练了 1.4 万亿 token,在多数评测中超过自家的 Gopher,后者有 2800 亿参数、训练了 3000 亿 token。按这一配比看,GPT-3 这一代模型的训练 token 相对参数量较少。这篇是我写这篇笔记前不久刚读到的。它的结论意味着后续模型需要增加训练数据,或在相同算力预算下使用更小的模型;只增加参数不符合其计算最优配比。

上下文学习如何起作用

GPT-3 论文读到最后,有个问题我一直没想明白:in-context learning 算不算「学会了」?模型会从 prompt 的几条例子中提取任务格式,输出会随例子变化;但推理时权重不变,结束当前上下文后,下次仍需重新提供例子。任务信息如何在当前推理中被表示,仍需要解释。当时读到的几种解释并不一致:一种认为互联网语料中有大量「任务描述加示例」的文本模式,模型在续写这类模式,例子提供检索线索;2022 年也有论文分析示范的作用,将示例中的标签替换为错误标签后,模型表现的下降小于预期。这说明模型可能更多地从示例中获得格式和话题信息,而非稳定地学习输入到输出的真实映射。这个问题在当时的文献中没有定论,先记下。直觉上我倾向第一种解释,但只是直觉。

GPT-1 到 GPT-3 的变化

GPT-1 建立了「预训练加微调」的范式,表明未标注文本可以为下游任务提供初始化;GPT-2 去掉微调后观察到零样本能力;GPT-3 将参数规模扩大,并显示给出几条例子可以改变任务表现,上下文学习的效果也随规模出现。Kaplan 的幂律为扩大规模提供了实验依据,Chinchilla 则指出参数和数据的配比需要调整。三代模型的核心结构基本保持不变,主要变化是规模和使用方式。

读 GPT-3 时,我一直拿它和已经用了两个多月的 ChatGPT 对比。论文中的 GPT-3 主要是续写模型:给它一段文本,它会继续生成;直接提问时,它也可能继续生成问题。ChatGPT 则能遵循指令、按格式回答,并拒绝部分问题。从 GPT-3 到 ChatGPT 还增加了训练步骤,不能仅用参数规模解释。OpenAI 在 2022 年 3 月发布过一篇 InstructGPT,介绍用人类反馈做指令微调,下一篇准备读它。

本篇参考的资料


641 字 · 45 段落
ximing

Written by ximingFollow onGitHub

相关文章