作者:千天夜
方向:大模型论文精读 / NLP / Transformer
论文:Language Models are Few-Shot Learners
核心关键词:GPT-3、Few-shot、In-context Learning、Decoder-only、Prompt、Scaling Law


摘要

如果说 BERT 代表了“预训练 + 微调”的大规模语言理解时代,那么 GPT-3 则把大模型推向了另一个方向:

预训练一个足够大的语言模型,
然后不微调,
只通过自然语言指令和少量示例完成任务。

这篇论文最著名的观点就是标题本身:

Language Models are Few-Shot Learners
语言模型本身就是小样本学习器

当然,这里的 few-shot 和传统机器学习里的 few-shot 不完全一样。GPT-3 论文里的 few-shot 指的是:把几个任务示例放进 prompt 里,让模型在上下文中理解任务,而不是拿少量样本更新模型参数。

这篇文章我会按照论文主线,从研究动机、模型结构、训练数据、in-context learning、实验结论和局限性几个方面精读 GPT-3。中间也会重点解释几个容易混淆的问题:

1. RNN 表征是什么?
2. GPT-3 到底有没有 encode?
3. Encoder 模块和普通 encode 有什么区别?
4. 双向就是 Encoder,单向就是 Decoder 吗?
5. GPT-3 的 few-shot 到底是不是微调?

一、论文想解决什么问题?

在 GPT-3 之前,NLP 的主流路线大致是:

大规模无监督预训练
        ↓
下游任务微调
        ↓
得到任务专用模型

比如 BERT 就是典型代表。

我们先在大量文本上预训练一个通用语言模型,然后针对情感分类、问答、自然语言推理、命名实体识别等任务分别微调。

这种方法很强,但它有一个问题:

每来一个新任务,往往还需要一批标注数据和一次微调过程。

而人类不是这样学习的。

比如别人告诉我们:

请把英文翻译成中文:
apple -> 苹果
dog -> 狗
cat ->

我们基本马上就知道,cat 应该翻译成

我们不需要重新训练大脑参数,也不需要几万条标注样本。

GPT-3 论文想验证的就是:

如果语言模型足够大,
它能不能也像人类一样,
只通过任务说明和少量例子理解新任务?

这就是 GPT-3 论文的核心问题。


二、从 RNN 表征到 Transformer 表征

在理解 GPT-3 之前,我们先补一个概念:RNN 表征是什么?

早期 NLP 里,我们经常用 RNN、LSTM、GRU 处理序列。

比如一句话:

I love this movie

RNN 会按顺序读:

I → love → this → movie

每读一个词,都会更新一次隐藏状态:

h1 = RNN(I)
h2 = RNN(love, h1)
h3 = RNN(this, h2)
h4 = RNN(movie, h3)

最后的 h4 就可以看作这句话的向量表示,也就是所谓的 文本表征

所以,RNN 表征可以简单理解为:

用循环神经网络把文本序列压缩成向量表示。

但是 RNN 有一个问题:它是顺序计算的。

必须先算 h1,才能算 h2;
必须先算 h2,才能算 h3。

这导致长距离依赖难学,训练也不够并行。

Transformer 的出现,就是为了解决这个问题。它不用循环结构,而是通过 self-attention 让 token 之间直接建立联系。

比如一句话:

The animal didn't cross the street because it was too tired.

模型需要知道 it 指的是 animal,而不是 street。RNN 要靠隐藏状态一层层传过去,而 Transformer 可以通过 attention 直接让 it 关注到 animal

因此,从 RNN 到 Transformer,本质上是:

从“顺序传递上下文”
变成
“通过 attention 直接建模 token 关系”

三、GPT-3 到底有没有 Encoder?

这个问题非常容易混。

很多人听到 GPT-3 是 Decoder-only Transformer,就会以为:

GPT-3 没有 encode。

但这句话是不准确的。

准确说法应该是:

GPT-3 有文本编码过程,
但 GPT-3 没有 Transformer Encoder 模块。

这两个东西不是一回事。

任何语言模型处理文本时,都要先做编码。

比如输入:

The cat is

GPT-3 会先做:

原始文本
  ↓
Tokenizer 分词
  ↓
Token ID
  ↓
Token Embedding
  ↓
Transformer 层
  ↓
预测下一个 token

这里的:

文本 → token → id → embedding

当然可以叫 encode。

所以 GPT-3 不是“不编码文本”。

GPT-3 只是没有使用 BERT 那种 Transformer Encoder stack


四、Encoder、Decoder、encode 三个概念不要混

这里是我认为初学者最容易卡住的地方。

我们要区分三个概念:

1. encode:一个动作,把文本变成向量表示
2. Encoder:Transformer 里的一类结构模块
3. Decoder:Transformer 里另一类结构模块

4.1 普通 encode 是什么?

普通 encode 是泛称。

比如:

“猫” → token id → embedding vector

这就是编码。

无论是 BERT、GPT-3、T5、LLaMA、Qwen,只要处理文本,都需要这一步。

所以:

所有语言模型都有 encode 过程。

4.2 Transformer Encoder 是什么?

Transformer Encoder 是一种具体网络结构。

它的典型特点是:

双向 self-attention

也就是说,一个 token 可以同时看左边和右边。

比如句子:

I love this movie because it is exciting.

在 BERT 中,movie 可以看到:

左边:I love this
右边:because it is exciting

所以 BERT 更适合做:

理解
分类
抽取
匹配
检索

BERT 的典型流程是:

[CLS] I love this movie . [SEP]
        ↓
Transformer Encoder
        ↓
取 [CLS] 向量
        ↓
分类头
        ↓
positive

它像是:

先读完整句话,
再做判断。

4.3 GPT-3 的 Decoder-only 是什么?

GPT-3 是自回归语言模型,它的目标是:

根据前文预测下一个 token。

比如:

I love this

模型预测:

movie

所以 GPT-3 不能偷看未来 token。

它的注意力是因果的:

I      只能看 I
love   只能看 I love
this   只能看 I love this
movie  只能看 I love this movie

也就是:

后面的 token 可以看前面的 token,
前面的 token 不能看后面的 token。

这就是 GPT-3 的 causal attention / masked self-attention


五、双向就是 Encoder,单向就是 Decoder 吗?

作为入门理解,可以先这样记:

双向注意力 ≈ Encoder 风格
单向因果注意力 ≈ Decoder-only 风格

但是严格来说,不能简单等价。

更准确的说法是:

Encoder / Decoder 是结构角色;
双向 / 单向 是注意力可见范围。

BERT 是:

Encoder-only + 双向注意力 + 适合理解

GPT-3 是:

Decoder-only + 单向因果注意力 + 适合生成

原始 Transformer 是:

Encoder 读完整输入
Decoder 逐步生成输出

比如机器翻译:

English: I love you.
        ↓ Encoder
语义表示
        ↓ Decoder
French: Je t'aime.

但 GPT-3 没有 Encoder,也没有 cross-attention。

GPT-3 更像是:

prompt → 继续生成

比如:

Classify the sentiment.

Sentence: I love this movie.
Sentiment:

GPT-3 继续生成:

positive

所以 GPT-3 的所有任务,都被包装成了“文本续写”。


六、GPT-3 的核心:In-Context Learning

GPT-3 论文真正重要的地方,不是提出了一个新 attention 结构,而是提出并系统验证了:

大规模语言模型可以通过上下文进行任务学习。

这就是 In-Context Learning

它的形式非常简单:

任务说明 + 少量示例 + 新输入 → 模型生成答案

例如翻译任务:

Translate English to French:

sea otter => loutre de mer
cheese => fromage
apple =>

模型看到前面的示例后,会继续生成:

pomme

注意,这里没有梯度下降,没有反向传播,没有更新参数。

模型只是在 prompt 里识别出了一个模式:

这是英文到法文的映射任务。

这就是 GPT-3 论文里 few-shot 的核心。

传统机器学习里的 few-shot 通常是:

给少量样本,更新模型参数。

GPT-3 里的 few-shot 是:

给少量样本,不更新参数,只放进上下文。

所以 GPT-3 的 few-shot 更准确地说应该叫:

few-shot prompting
或者
in-context few-shot learning

七、Zero-shot、One-shot、Few-shot、Fine-tuning 的区别

GPT-3 论文非常重要的一点,是把不同任务适应方式分得很清楚。

7.1 Fine-tuning

Fine-tuning 是传统方法。

预训练模型
  ↓
任务数据集
  ↓
梯度更新
  ↓
任务专用模型

比如情感分类:

输入:This movie is wonderful.
标签:positive

用大量样本继续训练模型,让模型参数发生变化。

特点是:

需要训练数据
需要反向传播
需要更新参数
效果通常很强
但每个任务都要单独处理

7.2 Few-shot

GPT-3 里的 few-shot 是:

给多个示例,但不更新参数。

比如:

Sentence: I love this movie.
Sentiment: positive

Sentence: This film is terrible.
Sentiment: negative

Sentence: The acting is wonderful.
Sentiment: positive

Sentence: This movie is boring.
Sentiment:

模型输出:

negative

这里的前三个样本不是训练数据,而是 prompt 的一部分。

7.3 One-shot

One-shot 是只给一个示例:

Sentence: I love this movie.
Sentiment: positive

Sentence: This film is boring.
Sentiment:

模型要根据一个例子理解任务格式。

7.4 Zero-shot

Zero-shot 是不给示例,只给指令:

Classify the sentiment of this sentence:

This movie is boring.

Sentiment:

模型直接输出:

negative

从难度上看:

Fine-tuning < Few-shot < One-shot < Zero-shot

从数据依赖上看:

Fine-tuning 最大
Few-shot 较小
One-shot 更小
Zero-shot 最小

这正是 GPT-3 论文想强调的方向:

让模型尽量少依赖任务专用数据,
尽量通过自然语言交互完成任务。

八、GPT-3 的模型结构:没有新模块,重点是规模

GPT-3 不是一篇“发明新结构”的论文。

它基本沿用 GPT-2 风格的 Decoder-only Transformer。

论文真正想验证的是:

如果把自回归语言模型继续放大,
会不会出现更强的上下文学习能力?

GPT-3 最大模型有:

参数量:175B
层数:96 层
隐藏维度:12288
注意力头数:96
上下文窗口:2048 tokens
训练 token 数:300B

作者还训练了 8 个不同规模的模型,从 125M 到 175B,用来观察规模变化带来的性能趋势。

这个设计很重要。

因为作者不是只想证明:

GPT-3 很强。

而是想证明:

随着模型规模变大,
few-shot / one-shot / zero-shot 能力会整体增强。

所以 GPT-3 的关键词不是“新结构”,而是:

scale
scaling law
in-context learning
few-shot performance

九、GPT-3 的训练数据:Common Crawl + 高质量语料混合

GPT-3 的训练数据主要来自:

Common Crawl
WebText2
Books1
Books2
Wikipedia

其中 Common Crawl 最大,但网页数据质量参差不齐,所以作者没有直接全量使用,而是做了过滤、去重和混合采样。

这里有一个很重要的思想:

数据不是越多越好,
高质量数据要有更高采样权重。

如果完全按网页数据量采样,模型可能会被大量低质量文本影响,比如:

广告页面
SEO 垃圾文本
重复模板
论坛碎片
乱码内容

所以 GPT-3 的数据处理大致包括:

1. 对 Common Crawl 做质量过滤
2. 做文档级 fuzzy deduplication,去掉近似重复
3. 混入 WebText、Books、Wikipedia 等高质量语料

这个思想后来在大模型训练中越来越重要。

现在我们已经很清楚:

模型能力 = 模型规模 + 数据规模 + 数据质量 + 训练策略

不是单纯堆参数就够了。


十、实验结果:后面其实主要是验证,不是提出新理论

GPT-3 论文后面的实验非常多,包括:

语言建模
LAMBADA
闭卷问答
翻译
Winograd / Winogrande
阅读理解
SuperGLUE
自然语言推理
算术
单词重排
新闻生成

但这些实验大多是在验证同一个核心观点:

模型越大,in-context learning 能力通常越强。

更具体一点:

few-shot 通常强于 one-shot
one-shot 通常强于 zero-shot
大模型通常强于小模型

这不代表 GPT-3 在所有任务上都达到了最强。

论文也指出,GPT-3 在一些任务上仍然表现不稳定,尤其是复杂推理、长程一致性、精确计算、专业领域任务等。

比如算术任务很有意思。

GPT-3 在简单加减法上随着规模变大有明显提升,但这并不说明它真正掌握了稳定的数学算法。

更准确地说:

它从大量文本中学到了一些计算模式,
但还不能保证像符号计算器一样稳定可靠。

这也是后来为什么会出现:

Chain-of-Thought
工具调用
代码解释器
检索增强
计算器增强

因为语言模型本身的生成能力很强,但精确推理和精确计算仍然需要额外机制增强。


十一、闭卷问答:模型参数里真的存了知识吗?

GPT-3 的 closed-book QA 很有代表性。

所谓 closed-book QA,就是:

不接搜索引擎
不接数据库
不接外部知识库
直接靠模型参数回答问题

例如:

Q: Who wrote the novel 1984?
A: George Orwell

这种任务说明,语言模型在预训练过程中确实压缩了大量世界知识。

但问题也很明显:

模型可能答对,
也可能一本正经地胡说。

这就是大模型幻觉问题。

为什么会这样?

因为 GPT-3 的训练目标本质上是:

预测下一个 token

它不是一个数据库,也不是一个逻辑证明系统。

它生成的是“在当前上下文下最可能出现的文本”,而不是“经过事实校验后的答案”。

所以我们使用大模型时要记住:

语言模型很会生成合理文本,
但合理文本不一定等于真实事实。

十二、数据污染:大模型评测必须面对的问题

GPT-3 使用了大规模互联网语料,而很多 benchmark 题目也可能出现在互联网上。

这会带来一个问题:

模型会不会在预训练时见过测试集?

如果见过,那么测试成绩就可能虚高。

这就是 Data Contamination,数据污染。

GPT-3 论文专门讨论了这个问题。作者尝试检测和移除 benchmark 重叠数据,但也承认过滤过程并不完美。

这个问题对我们做研究非常重要。

如果以后我们自己训练或评测大模型,一定要关注:

训练集和测试集是否重叠
benchmark 是否被互联网公开传播
是否做了去重
是否有私有测试集
是否使用时间切分
是否进行 contamination check

大模型时代,评测不只是“跑个分数”。

更重要的是:

这个分数到底可信不可信?

十三、GPT-3 的局限性

GPT-3 很强,但并不完美。

论文中提到的局限可以总结为:

1. 会生成错误事实
2. 长文本一致性不稳定
3. 复杂推理能力有限
4. 数学和精确计算不可靠
5. 对训练数据分布高度敏感
6. 训练和推理成本极高
7. 可能放大数据中的偏见
8. 可能被用于生成虚假信息

这一点非常关键。

GPT-3 不是“真正解决语言理解”的终点,而是证明了一件事:

规模扩大可以显著改变语言模型的能力边界。

它把研究重点从:

如何为每个任务设计模型?

推进到:

如何训练一个足够通用的模型,
让它通过自然语言交互适应不同任务?

十四、GPT-3 论文真正的贡献

读完整篇论文后,我认为 GPT-3 的贡献可以概括为四点。

14.1 系统验证了 Scaling 的威力

GPT-3 告诉我们:

模型规模扩大后,
不是简单地“语言建模 loss 变低”,
而是会带来更强的任务泛化能力。

这为后来的大模型路线奠定了基础。

14.2 把 In-Context Learning 推到了核心位置

GPT-3 之前,主流范式还是:

pretrain + fine-tune

GPT-3 之后,大家开始重视:

pretrain + prompt

也就是:

任务不一定要通过参数更新完成,
也可以通过上下文描述完成。

这正是今天大模型应用的基本形态。

14.3 统一了很多 NLP 任务的形式

GPT-3 把分类、翻译、问答、推理、摘要等任务都包装成:

输入文本 → 输出文本

比如分类不再一定需要分类头,而可以写成:

Sentence: I love this movie.
Sentiment:

然后让模型生成:

positive

这一步非常关键。

它让大模型从“任务专用系统”走向“通用文本接口”。

14.4 暴露了大模型时代的新问题

GPT-3 也让我们看到了新问题:

幻觉
偏见
数据污染
高成本
可解释性不足
滥用风险

所以 GPT-3 不只是技术论文,也是一篇大模型时代的转折点论文。


十五、和 BERT 的路线对比

最后再把 BERT 和 GPT-3 放在一起看。

对比项 BERT GPT-3
架构 Encoder-only Decoder-only
注意力 双向 self-attention 单向 causal attention
训练目标 Masked Language Modeling Next Token Prediction
典型用法 预训练 + 微调 预训练 + prompt
适合任务 理解、分类、抽取 生成、对话、续写、few-shot
是否天然生成文本 不强
是否依赖任务微调 通常依赖 论文中不微调
核心思想 学到强表征 学到通用上下文适应能力

一句话总结:

BERT 更像是一个强大的语言理解器;
GPT-3 更像是一个强大的文本续写器。

但正是因为“续写”这个形式足够通用,所以 GPT-3 可以把很多任务都转成 prompt completion。


十六、最终总结

《Language Models are Few-Shot Learners》这篇论文没有提出新的 Transformer 核心模块,也没有像 BERT 那样设计新的预训练目标。

它真正重要的地方在于:

当语言模型规模足够大时,
它可以在不更新参数的情况下,
仅凭自然语言指令和少量示例完成大量任务。

也就是说,GPT-3 把大模型研究从:

预训练 + 微调

推向了:

预训练 + 上下文学习

这也是今天我们使用 ChatGPT、Claude、Gemini、Qwen、LLaMA 等大模型的基本方式。

我们不再为每个任务训练一个模型,而是直接写 prompt:

请总结这段话
请翻译成英文
请解释这段代码
请判断情感倾向
请根据例子完成任务

这背后的思想源头之一,就是 GPT-3 这篇论文。

所以,如果只用一句话概括 GPT-3 的贡献,我会这样写:

GPT-3 证明了:大规模自回归语言模型不仅能生成文本,还能通过上下文表现出近似“小样本学习”的能力。

这也是它成为大模型发展史上关键节点的原因。


参考文献

  • Brown et al., Language Models are Few-Shot Learners, 2020.
  • Devlin et al., BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding, 2018.
  • Vaswani et al., Attention Is All You Need, 2017.
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐