HelloAI
L3 第 9 篇 🐣 难度 🕒 12 分钟

BERT vs GPT:两大 LLM 流派的本质区别

都是 Transformer,为啥一个做"理解"一个做"生成"?两者的训练目标差一个根本性的设计选择。

阿莱
2026/7/10

L3-08 我们看到 Transformer 有三种架构:Encoder-Only(BERT)、Decoder-Only(GPT)、Encoder-Decoder(T5)。

这一篇专门讲 BERT vs GPT——它们是 NLP 领域的两大宗派,长期对峙,最后……GPT 流派完胜。

理解这个故事,你能看懂为什么”ChatGPT” 不叫”ChatBERT”。

第一站:相同点

  • 都基于 Transformer
  • 都用 大规模预训练 + 小规模微调 的范式
  • 训练数据都是 海量互联网文本
  • 都用 自注意力作为核心

差别在哪?训练目标 + 注意力遮罩

第二站:BERT(Encoder-Only)

2018 年发布

Google 在 2018 年 10 月发布 BERT(Bidirectional Encoder Representations from Transformers)。当时是 NLP 界的核爆。

训练目标:填空(MLM)

Masked Language Modeling(MLM) — 把句子里随机 15% 的词替换成 [MASK],让模型猜:

原句: "I love eating apples at the park"
遮蔽: "I love [MASK] apples at the [MASK]"
任务: 猜 [MASK] = "eating" / "park"

要做到这个,模型必须 同时看左右上下文—— “apples at the ___“——可能是 park / store / market “love [MASK] apples”——可能是 eating / picking / growing 两个上下文一结合,才能精确猜出。

注意力遮罩:双向

每个位置可以看所有其它位置(前后都行)——这就是”Bidirectional”的意思。

"I love [MASK] apples at the park"

任意位置可以看任意其它位置

优点:每个 token 都有完整的上下文理解。 缺点不能生成文本——你想”续写”的话,它没法判断”该写什么”,因为它训练时就靠”看到所有词”才能猜。

适合的任务

  • 文本分类(情感分析、垃圾邮件):用 [CLS] token 的输出
  • 命名实体识别(NER):每个 token 标签
  • 抽取式问答(在原文中划出答案)
  • 句子嵌入(搜索、检索)

BERT 的爆发

2018-2020 年,BERT 及其变种(RoBERTa、ALBERT、DistilBERT、ELECTRA)几乎统治了所有 NLP 任务的 SOTA 榜单。

第三站:GPT(Decoder-Only)

2018-2020 年的”小弟”

OpenAI 同年(2018)发了 GPT-1,但当时没人在意——效果不如 BERT。

GPT-2(2019)开始引起注意。 GPT-3(2020)让所有人惊了。 ChatGPT(2022)改变了世界。

训练目标:预测下一个

Causal Language Modeling(CLM) —— 给前面的词,猜下一个:

"I love eating"  →  下一个是 "apples"?"pizza"?"meat"?
"I love eating apples"  → 下一个是 "at"?"and"?"."?
...

非常简单——没有 mask 操作,就是顺着读,猜下一个

注意力遮罩:因果(单向)

每个位置只能看自己和前面

"I love eating apples at the park"
   0    1     2      3     4   5    6

位置 0 只能看 0
位置 1 只能看 0-1
位置 2 只能看 0-1-2
...
位置 6 能看 0-6 所有

这叫因果遮罩(Causal Mask)——模拟”边生成边看”。生成时第 N 个词必然在第 N+1 个之前出现,所以训练时也要这样。

适合的任务

  • 文本生成(写文章、对话、代码):天然支持
  • 续写补全(GitHub Copilot):天然
  • 对话(ChatGPT):天然
  • 翻译:用 prompt “Translate to Chinese: …”
  • ……几乎所有 NLP 任务:通过 in-context learning

一个核心优势:In-Context Learning

GPT-3 让所有人震惊的事——你不用微调,只要在 prompt 里给几个例子,模型就能学

英文转中文:
hello → 你好
goodbye → 再见
thank you → ???

模型自己猜出来”谢谢”。这就是 few-shot learningin-context learning

BERT 做不到这件事——它没”生成”的能力。

第四站:决战时刻

到 2020-2022 年,两派的关系:

维度BERTGPT
学术影响极大极大
下游任务表现在”理解”任务上略强在”生成”任务上完胜
生态微调一个 BERT 是 NLP 标配API 调用 GPT-3 是新兴
应用搜索、分类、抽取写作助手、客服、Chat

学术界更喜欢 BERT 一段时间,因为论文容易发(微调跑 benchmark)。

2022 年 ChatGPT 出来后,游戏结束了

第五站:为什么 GPT 赢了

原因 1:通用性

预测下一个词是个”几乎能解决所有 NLP 任务”的目标——

  • 翻译?“Translate: A → B”
  • 分类?“This text is: [positive/negative]”
  • 问答?“Q: … A: …”
  • 总结?“Summarize: …”

所有任务都能套进”生成”的框架。BERT 做这些需要专门微调。

原因 2:规模化

GPT 的训练目标允许它吃任何文本——不需要标注,互联网就是数据。 BERT 也是无监督,但 MLM 让训练效率略低。

结果:当数据/参数规模上去后,GPT 比 BERT 学得更全面。

原因 3:对话天然

ChatGPT 之所以引爆,因为对话是 GPT 架构的”自然形态”。 BERT 上做对话需要复杂的工程。

原因 4:In-Context Learning 是降维打击

不需要微调就能完成任务——这让 LLM 从”工具”变成”通用助手”。BERT 永远做不到。

第六站:今天的格局

路径用什么
聊天 / 写作 / 创作GPT 系(GPT-4, Claude, Gemini, Llama)
搜索引擎重排BERT 系
句子嵌入BERT 系(如 sentence-transformers)
结构化抽取BERT 系
翻译转向 GPT 系(Encoder-Decoder 在退役)
跨模态GPT 系(GPT-4V, Claude 3.5)

BERT 没死——它在搜索、嵌入、抽取这些场景仍是首选。但风头确实被 GPT 抢光了

第七站:可能的复兴?

历史经常反转——

近年有些研究发现:

  • BERT 类模型在某些 reasoning 任务上仍然强(需要双向上下文理解)
  • 多模态领域有混合架构(图像 encoder + 文本 decoder)
  • Embedding 模型几乎全是 Encoder-Only 架构

预言:未来可能不再是”BERT vs GPT”,而是根据任务混合——理解端用 Encoder,生成端用 Decoder。

第八站:用代码体验

用 BERT 做文本分类

from transformers import pipeline

classifier = pipeline("sentiment-analysis")  # 默认是 BERT 微调版
result = classifier("I love this product!")
print(result)
# [{'label': 'POSITIVE', 'score': 0.999}]

用 GPT 做对话

from transformers import pipeline

generator = pipeline("text-generation", model="gpt2")
result = generator("The future of AI is", max_length=50)
print(result[0]['generated_text'])

一句话总结

BERT = 看完整句子做理解GPT = 一边读一边猜做生成

在”通用性”和”对话”这两个用户需求的胜利里,GPT 完胜。 但 BERT 在”嵌入”和”理解”任务上仍然不可替代。

💡 一个工程的真相

2026 年的真实情况:

  • 绝大多数面向用户的产品 = Decoder-Only LLM(GPT 系)
  • 搜索/检索后端的核心组件 = BERT 系
  • 完整系统 = 两者结合(如 RAG 用 BERT 做检索,用 GPT 做生成)

学好 BERT 不是因为它能撑你的下一个项目——是因为整个 NLP 历史里有它一半。

下一步推荐:L4 路径——把 BERT/GPT 用起来做应用。

📬

读到这里说明你认真在学 🎯

订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。