10 GPT-3 论文精读:Few-shot Learning 为什么会出现?
在上一篇文章中,我们精读了 GPT-2。
GPT-2 的核心思想是:
语言模型是无监督多任务学习器也就是说,当一个语言模型在足够大、足够多样的网页文本上进行训练后,它可能会从自然语言中自动学到许多任务模式,并在没有下游任务微调的情况下完成部分 NLP 任务。GPT-2 已经开始展示 zero-shot 能力,但这种能力还比较初级。它更多是通过文本续写的方式,在某些任务上表现出“像是在做任务”的能力。
到了 GPT-3,问题进一步变成:
如果继续扩大模型规模,语言模型能否只通过任务描述和少量示例,就在不更新参数的情况下完成新任务?
这就是 GPT-3 论文的核心问题。GPT-3 对应的论文是:
Language Models are Few-Shot Learners这篇论文由 OpenAI 在 2020 年提出。GPT-3 是一个 1750 亿参数的自回归语言模型,也是大语言模型发展史上的关键节点之一。如果说 GPT-1 证明了“生成式预训练 + 微调”可行,GPT-2 开始探索“zero-shot 任务迁移”,那么 GPT-3 则系统展示了:
模型规模扩大后,语言模型可以通过上下文中的任务描述和少量样例完成任务。这就是 few-shot learning,也就是少样本学习。
一、GPT-3 想解决什么问题?
在 GPT-3 之前,预训练语言模型通常还需要下游任务微调。例如 BERT 和 GPT-1 都采用类似流程:
大规模无标注预训练 ↓ 下游任务有监督微调 ↓ 任务评估这种方式虽然有效,但仍然有明显问题。
首先,每个任务都需要标注数据。
例如情感分类需要情感标签,自然语言推理需要句子关系标签,阅读理解需要问题和答案标注。对于每个新任务,都要重新构造数据集。
其次,每个任务都需要更新模型参数。
模型在任务 A 上微调后,可能就不再适合任务 B;如果任务很多,就需要保存多个任务版本的模型。
再次,这种方式和人类学习新任务的方式不太一样。
人类通常不需要几万条标注样本才能理解一个任务。比如我们只要看到几个例子:
输入:这部电影太好看了。 输出:正面 输入:剧情拖沓,我不喜欢。 输出:负面然后再看到:
输入:演员演技很好,故事也很感人。 输出:我们很容易判断应该输出:
正面GPT-3 想探索的就是类似能力:
模型能不能通过上下文中的自然语言描述和少量示例,临时理解任务,而不需要更新参数?
这就是 GPT-3 论文中的 few-shot learning。
二、GPT-3 的核心思想:任务通过上下文给出
GPT-3 最大的变化不是换了一个完全不同的模型结构,而是改变了模型使用方式。
GPT-2 已经提出:
不微调,直接让语言模型 zero-shot 做任务GPT-3 进一步提出:
不仅可以 zero-shot,还可以在 prompt 中给几个示例,让模型根据上下文学会任务格式。例如情感分类任务。
Zero-shot
Zero-shot 是只给任务说明,不给示例:
请判断下面句子的情感是正面还是负面。 句子:这部电影非常精彩,我很喜欢。 答案:模型需要直接输出:
正面One-shot
One-shot 是给一个示例:
请判断句子的情感是正面还是负面。 句子:剧情拖沓,我不喜欢。 答案:负面 句子:这部电影非常精彩,我很喜欢。 答案:模型需要根据前面一个例子理解任务。
Few-shot
Few-shot 是给多个示例:
请判断句子的情感是正面还是负面。 句子:剧情拖沓,我不喜欢。 答案:负面 句子:演员演技很好,故事也很感人。 答案:正面 句子:这部电影节奏混乱,看得很累。 答案:负面 句子:画面很美,音乐也很好听。 答案:模型需要继续输出:
正面这里最关键的是:
模型参数没有更新,任务信息完全通过 prompt 中的自然语言和示例提供。
这就是 GPT-3 论文中非常重要的思想:in-context learning。
三、什么是 In-context Learning?
In-context learning 可以翻译为上下文学习。它指的是:
模型在不进行梯度更新的情况下,仅根据输入上下文中的任务描述和示例,临时适应一个新任务。
这和传统微调非常不同。传统微调是:
给模型很多任务样本 ↓ 计算损失 ↓ 反向传播 ↓ 更新模型参数 ↓ 得到适配任务的新模型而 in-context learning 是:
把任务描述和示例写进 prompt ↓ 模型读取上下文 ↓ 模型根据上下文模式直接输出答案 ↓ 模型参数不变也就是说,GPT-3 的 few-shot learning 不是传统机器学习中的“少量样本微调”。它不是用少量样本更新参数,而是把少量样本作为上下文的一部分,让模型在当前输入中“看懂”任务。
这点非常重要。很多初学者看到 few-shot learning,会误以为 GPT-3 用几个样本做了微调。实际上,GPT-3 论文强调的是:
没有梯度更新 没有任务特定微调 只有文本形式的任务描述和示例所以 GPT-3 的 few-shot 更准确地说是:
few-shot prompting或者:
in-context few-shot learning四、GPT-3 的模型结构:更大的 Decoder-only Transformer
GPT-3 没有彻底改变 GPT-2 的结构。它仍然是 Decoder-only Transformer,仍然使用自回归语言建模目标。整体流程可以写成:
输入 token 序列 ↓ Token Embedding + Position Embedding ↓ Transformer Decoder Block × N ↓ 输出隐藏状态 ↓ LM Head ↓ 预测下一个 token它的训练目标仍然是:
对应的负对数似然损失可以写成:
其中:
是当前位置 token;
表示当前位置之前的所有 token;
模型目标是让真实下一个 token 的概率尽可能高。
也就是说,GPT-3 依然是在做最基本的 next-token prediction。但 GPT-3 的规模大幅增加。论文中训练了多个不同大小的模型,从 125M 参数一直到 175B 参数。最大模型 GPT-3 175B 包含 96 层 Transformer,隐藏维度为 12288,注意力头数为 96,上下文长度为 2048 tokens。可以简单对比一下:
| 模型 | 参数量 | 主要特点 |
|---|---|---|
| GPT-1 | 约 117M | 验证生成式预训练 + 微调 |
| GPT-2 | 最大约 1.5B | 探索 zero-shot 任务迁移 |
| GPT-3 | 最大 175B | 系统展示 zero-shot / one-shot / few-shot 能力 |
GPT-3 相比 GPT-2 最大版本大约扩大了两个数量级。这也是 GPT-3 能力变化的重要原因之一。
五、GPT-3 的训练数据:更大、更混合的文本语料
GPT-3 使用了混合文本数据进行训练。主要来源包括:
Common Crawl WebText2 Books1 Books2 Wikipedia其中 Common Crawl 是网页抓取数据,规模非常大,但质量参差不齐。为了提高质量,GPT-3 对 Common Crawl 进行了过滤和去重。WebText2 可以看作 GPT-2 WebText 思路的延续,来自经过用户筛选的网页文本。Books1 和 Books2 提供了更长、更连贯的书籍文本。Wikipedia 提供了百科式知识和规范文本。这些数据来源的组合让 GPT-3 能够接触到非常多样的语言形式:
网页文章 百科知识 书籍叙事 问答格式 教程文本 代码片段 新闻内容 论坛讨论为什么数据多样性很重要?因为 GPT-3 的 few-shot 能力不是来自任务微调,而是来自预训练时见过的大量自然文本模式。如果训练语料中包含大量类似下面的格式:
Question: ... Answer: ...模型就可能学会问答模式。如果训练语料中包含:
English: ... French: ...模型就可能学到翻译模式。如果训练语料中包含:
Input: ... Output: ...模型就可能学会根据上下文推断输入输出映射。所以 GPT-3 的 few-shot 能力和训练数据中的任务模式密切相关。
六、GPT-3 如何评估 Zero-shot、One-shot 和 Few-shot?
GPT-3 论文非常系统地定义了三种评估方式。
1. Zero-shot
Zero-shot 指模型只看到任务描述,不看到任何示例。例如:
Translate English to French: cheese =>模型需要直接输出:
fromage这种方式最接近“直接听懂任务指令”。但是 GPT-3 不是经过 instruction tuning 的模型,因此它的 zero-shot 能力并不像今天的 ChatGPT 那么稳定。
2. One-shot
One-shot 指模型看到一个任务示例。例如:
Translate English to French: sea otter => loutre de mer cheese =>模型需要根据唯一示例,判断任务是英文到法文翻译,然后输出:
fromage3. Few-shot
Few-shot 指模型看到多个任务示例。例如:
Translate English to French: sea otter => loutre de mer peppermint => menthe poivrée plush giraffe => girafe peluche cheese =>模型继续输出:
fromage在 few-shot setting 中,示例数量受上下文长度限制。GPT-3 的上下文长度是 2048 tokens,所以能放入的示例数量有限。注意,这些示例只是作为文本输入放进 prompt 中。模型不会对这些示例进行反向传播,也不会更新参数。这就是 GPT-3 和传统 supervised fine-tuning 的核心区别。
七、Few-shot Learning 为什么会出现?
现在我们回到本章标题:
Few-shot Learning 为什么会出现?
从 GPT-3 的角度看,few-shot learning 的出现主要来自三个因素。
1. 语言建模目标本身具有任务统一性
GPT-3 训练目标非常简单:
根据前文预测下一个 token但自然语言中的很多任务都可以写成“前文 → 后文”的形式。例如翻译任务:
English: I love you. Chinese: 我爱你。摘要任务:
Article: ... Summary: ...问答任务:
Question: ... Answer: ...分类任务:
Review: ... Sentiment: positive这些任务本质上都可以转成条件文本生成。因此,语言模型只要足够强,就可以把这些任务统一到 next-token prediction 中。
2. 大规模数据中天然包含任务示例
互联网文本中包含大量类似“输入-输出”的结构。例如:
问题和答案 标题和正文 文章和摘要 代码注释和代码 英文和译文 教程中的示例 表格中的键值对GPT-3 在预训练中可能见过大量这样的模式。所以当我们在 prompt 中写出几个示例时,模型可能会识别出:
这些示例描述了一个任务模式 我应该按照同样模式继续生成3. 模型规模扩大后,上下文模式识别能力增强
小模型也能做文本续写,但它可能无法稳定理解复杂 prompt 中的任务模式。模型变大后,参数容量更强,能记住和组合更多语言模式,也能更好地利用长上下文。例如看到:
输入:3 + 5 输出:8 输入:7 + 2 输出:9 输入:9 + 6 输出:较小模型可能只是继续生成看似合理的数字。较大模型更可能理解这是一个加法任务,并输出:
15这就是 GPT-3 的关键观察:
随着模型规模增加,模型在上下文中识别任务并继续执行任务的能力显著增强。
八、GPT-3 的实验结果应该怎么看?
GPT-3 论文评估了非常多任务,包括语言建模、问答、翻译、完形填空、常识推理、阅读理解、自然语言推理、数学计算、词语重排、使用新词造句等。这篇论文的重点不是某一个任务的单点成绩,而是系统展示:
同一个模型 不做任务微调 只通过 prompt 可以在很多任务上表现出非平凡能力1. 语言建模
GPT-3 在多个语言建模数据集上表现强,说明更大规模的自回归语言模型可以更好地建模文本分布。这也是后续任务能力的基础。
2. 问答任务
GPT-3 在一些问答数据集上展现了较强 few-shot 能力。当 prompt 中给出几个问答示例后,模型可以按照相同格式回答新问题。这说明模型不只是“背答案”,还能够根据上下文中的问答格式完成任务。
3. 翻译任务
GPT-3 在翻译任务上也表现出一定能力,尤其是翻译成英文时更强。这说明大规模英文主导语料中仍然包含一定跨语言模式,但其多语言能力并不均衡。
4. 算术与推理任务
GPT-3 论文中特别测试了简单算术、词语重排、使用新词造句等任务。这些任务很有代表性,因为它们不只是检索知识,还要求模型根据上下文规则进行临时适应。
例如:
A "dax" is a small animal. Use "dax" in a sentence:模型需要根据上下文理解一个新词,并在句子中正确使用它。这说明 GPT-3 具备一定的临时任务适应能力。
5. 生成能力
GPT-3 还展示了强大的长文本生成能力。论文中提到,人类评估者在区分 GPT-3 生成新闻和人类写作新闻时并不总是容易。这说明 GPT-3 的语言流畅性和篇章生成能力相比 GPT-2 有明显提升。
九、GPT-3 和 GPT-2 的核心区别
现在可以把 GPT-2 和 GPT-3 放在一起看。
| 对比维度 | GPT-2 | GPT-3 |
|---|---|---|
| 论文标题 | Language Models are Unsupervised Multitask Learners | Language Models are Few-Shot Learners |
| 最大参数量 | 约 1.5B | 175B |
| 核心能力 | zero-shot 任务迁移初步出现 | zero-shot / one-shot / few-shot 系统展示 |
| 是否微调 | 不针对任务微调 | 不针对任务微调 |
| 任务形式 | 通过文本提示续写 | 通过任务说明和示例进行上下文学习 |
| 关键意义 | 证明语言模型可无监督多任务 | 证明规模化模型可 few-shot 适应任务 |
GPT-2 关注的是:
模型能不能在没有任务训练的情况下直接做任务?GPT-3 进一步关注:
如果在上下文中给模型几个示例,它能不能临时学会任务?所以,GPT-3 是从 zero-shot 走向 in-context few-shot 的关键节点。
十、GPT-3 和传统微调有什么区别?
GPT-3 的 few-shot learning 和传统 supervised fine-tuning 很容易混淆。我们用表格对比一下。
| 对比维度 | 传统微调 | GPT-3 Few-shot Prompting |
|---|---|---|
| 是否更新参数 | 更新参数 | 不更新参数 |
| 是否需要训练过程 | 需要反向传播 | 不需要反向传播 |
| 样本使用方式 | 作为训练数据 | 作为 prompt 上下文 |
| 任务适配方式 | 修改模型参数 | 修改输入文本 |
| 模型副本 | 每个任务可能一个模型 | 一个模型处理多个任务 |
| 成本 | 需要训练资源 | 主要消耗上下文长度和推理成本 |
传统微调像是:
把任务知识写进模型参数里GPT-3 few-shot prompting 更像是:
把任务规则写进上下文里,让模型临时遵循这就是两者最大的区别。这也是为什么 GPT-3 改变了大家使用语言模型的方式。以前我们更关心:
如何微调模型?GPT-3 之后,大家开始更关心:
如何设计 prompt? 如何提供示例? 如何让模型在上下文中理解任务?这就是 prompt engineering 和 in-context learning 兴起的原因。
十一、GPT-3 的局限性
GPT-3 非常重要,但并不完美。
1. Few-shot 能力不稳定
GPT-3 的 few-shot 表现受到 prompt 格式、示例选择、示例顺序、任务表述方式影响。
同一个任务,换一种 prompt,结果可能明显不同。
这说明 GPT-3 还没有真正稳定地“理解任务”,而是很依赖上下文模式。
2. 仍然容易产生幻觉
GPT-3 的训练目标是预测高概率文本,而不是保证事实真实。
因此它可能生成看起来合理但实际上错误的内容。
例如编造不存在的引用、错误解释事实、给出不可靠答案。
3. 推理能力有限
GPT-3 在简单算术和推理任务上表现出一定能力,但复杂多步推理仍然容易出错。
后来 Chain-of-Thought、Self-Consistency、Tool Use、RL 推理模型等工作,都是在继续解决这个问题。
4. 数据污染和评测问题
GPT-3 使用大规模网页语料训练,很难完全避免训练数据与评测数据重叠。
论文也讨论了一些数据污染和 benchmark 评估相关问题。
这提醒我们:大模型评测并不简单,尤其是当训练数据来自大规模互联网时。
5. 缺少指令对齐
GPT-3 原始模型并不是 ChatGPT。
它没有经过后来的 SFT、RLHF 或 DPO 对齐训练。
因此,它虽然具备很强的文本生成能力,但不一定能稳定遵循用户指令,也不一定安全可靠。
这也是为什么后面会出现 InstructGPT。
十二、GPT-3 在大语言模型发展中的位置
GPT-3 是大语言模型发展史上的关键转折点。
它把研究重点从:
预训练模型如何微调到下游任务?推进到:
大模型能否通过上下文直接完成任务?这带来了三个重要变化。
1. 从 Fine-tuning 到 Prompting
GPT-3 之后,prompt 成为模型使用方式中的核心概念。
很多任务不再首先考虑微调,而是先尝试通过自然语言指令和示例完成。
2. 从任务专用模型到通用接口
GPT-3 展示了一个模型可以通过不同 prompt 适配多种任务。
这让语言模型逐渐从“某个 NLP 任务的模型”变成“通用语言接口”。
3. 从模型结构创新到规模效应
GPT-3 没有提出全新架构,而是主要通过扩大模型规模、数据规模和计算量来提升能力。
这让研究者更加重视 scaling law,也为后来的 Chinchilla、PaLM、LLaMA、DeepSeek 等模型提供了重要背景。
可以这样理解:
GPT-1:生成式预训练可以迁移 GPT-2:语言模型可以 zero-shot 做任务 GPT-3:大语言模型可以 few-shot 上下文学习 InstructGPT:大语言模型需要对齐用户意图 ChatGPT:对齐后的大语言模型成为通用对话接口GPT-3 是从“预训练语言模型”走向“大语言模型”的标志性节点。
