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-shotZero-shot 是只给任务说明不给示例请判断下面句子的情感是正面还是负面。 句子这部电影非常精彩我很喜欢。 答案模型需要直接输出正面One-shotOne-shot 是给一个示例请判断句子的情感是正面还是负面。 句子剧情拖沓我不喜欢。 答案负面 句子这部电影非常精彩我很喜欢。 答案模型需要根据前面一个例子理解任务。Few-shotFew-shot 是给多个示例请判断句子的情感是正面还是负面。 句子剧情拖沓我不喜欢。 答案负面 句子演员演技很好故事也很感人。 答案正面 句子这部电影节奏混乱看得很累。 答案负面 句子画面很美音乐也很好听。 答案模型需要继续输出正面这里最关键的是模型参数没有更新任务信息完全通过 prompt 中的自然语言和示例提供。这就是 GPT-3 论文中非常重要的思想in-context learning。三、什么是 In-context LearningIn-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 TransformerGPT-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-shotGPT-3 论文非常系统地定义了三种评估方式。1. Zero-shotZero-shot 指模型只看到任务描述不看到任何示例。例如Translate English to French: cheese 模型需要直接输出fromage这种方式最接近“直接听懂任务指令”。但是 GPT-3 不是经过 instruction tuning 的模型因此它的 zero-shot 能力并不像今天的 ChatGPT 那么稳定。2. One-shotOne-shot 指模型看到一个任务示例。例如Translate English to French: sea otter loutre de mer cheese 模型需要根据唯一示例判断任务是英文到法文翻译然后输出fromage3. Few-shotFew-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-2GPT-3论文标题Language Models are Unsupervised Multitask LearnersLanguage Models are Few-Shot Learners最大参数量约 1.5B175B核心能力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 到 PromptingGPT-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 是从“预训练语言模型”走向“大语言模型”的标志性节点。