Learn AI · 模型硬功底(由内而外)
第 6 课 / 经典论文 P05  ·  阶段二:预训练范式(Devlin et al., 2018)

BERT:
把「双向」夺回来
——你 RAG 里那个 embedding 模型,根在这

前五课你拼齐了零件:self-attention(按语境取信息)、encoder-decoder(序列变序列)、embedding(语义=几何)。这一课起,零件要拼成真正能预训练的语言模型。 BERT 回答一个你天天受益却没拆过的问题:为什么我们现在不用从零训模型,下载一个预训练权重微调一下就能用?而且——为什么做检索/embedding 几乎都用 BERT 系,而不是 GPT 系?
self-attention 本来能看整句(双向)。
但只要你的训练目标是「预测下一个词」,就必须挡住右边——看右边=偷看答案,于是被迫单向。
BERT 的洞见:换一个不怕偷看的目标(完形填空),双向就夺回来了。

一、立靶:「双向」为什么会丢?

self-attention 的本事是每个 token 同时看全序列。照理说,理解「它」是什么、「bank」是哪个 bank,左右都看才看得准。可此前的语言模型(以及马上要学的 GPT)几乎都单向——只看左边。为什么自废一半武功?

根因:目标函数把手脚绑住了

传统语言模型的训练目标是「预测下一个词」(自回归)。要预测位置 i 的词,就绝不能让模型看到位置 i 及右边——否则答案就在输入里,模型直接抄,啥也学不到。 所以单向不是技术做不到双向,是「预测下一个词」这个目标本身,逻辑上要求挡住右边

论文要的:一个既能用上「左右两边语境」、又不会偷看答案的自监督目标。

二、抽框架:BERT 的三步换装

换什么怎么换解决了什么
① 换目标 → MLM随机盖住 15% 的词,让模型用左右两边一起猜被盖的(完形填空)答案被盖住了,看全句不算偷看 → 双向解锁
② 加目标 → NSP给两句话,判断 B 是不是 A 的真实下一句句子间关系,服务问答/推理
③ 换架构 → encoder-only只堆 Transformer 的编码器,扔掉 decoder不生成、只理解,每层都真双向
MLM 的细节(论文的讲究处)

盖住的 15% 里,并不是全换成 [MASK]80% 换 [MASK]、10% 换一个随机词、10% 保持原词不动。 为什么这么拧?因为微调时根本没有 [MASK] 这个符号——如果预训练只见过 [MASK],一到下游就「水土不服」。这 80/10/10 是为了缩小预训练和微调之间的差距。这种「为了对齐两个阶段而做的小设计」,正是你做 prompt/eval 时该有的嗅觉。

二·五、换个说法:完形填空 vs 接龙(通俗版)

两种做题方式对应模型能看到的语境
句子接龙:只给你上半句,往下接GPT(单向语言模型)只有左边
完形填空:整段挖几个空,前后文都给你BERT(MLM)左右都有

做完形填空,你当然两边都瞄——这正是 BERT 比单向模型「理解」更全的来源。但完形填空的人,不擅长从头编一篇连贯长文(那是接龙的活)。一个目标的差别,决定了两条路线的性格。

三、动手玩:盖住一个词,看「单向 vs 双向」能用的语境差多少

同一句话盖住中间一个词,切换两种模式,看高亮的「可利用语境」范围——以及单向模式下,为什么常常填不准

模式: 

四、对照表(一):三大路线在这里分叉

维度BERT
encoder-only(本篇 P05)
GPT
decoder-only(下一篇 P06)
seq2seq
encoder-decoder(P03)
看的方向双向单向(只看左)编码双向 + 解码单向
预训练目标MLM(完形填空)预测下一个词(接龙)翻译/重建目标
最擅长理解:分类、抽取、检索生成:续写、对话、写代码转换:翻译、摘要
能直接聊天吗不能(不是生成型)(ChatGPT 这一支)能,但偏定向转换

记住这张分叉表:你日常用的 ChatGPT/Claude 是 decoder-only 那一支,而你 RAG 里的 embedding 模型是 BERT 这一支——它们血统不同,是因为预训练目标不同

五、对照表(二):预训练-微调,凭什么成了范式

BERT 之前:每个任务从头训BERT 之后:预训练-微调
怎么开工每个任务收一批标注数据,从零训一个模型下载一份预训练权重,接个小任务头微调
要多少标注大量(每任务都要)少量(通用知识已在预训练里)
效果受限于单任务数据量一次预训练,多任务全面刷新 SOTA(GLUE 等)

BERT 用 BooksCorpus + 英文维基预训练(base 版 12 层/1.1 亿参数,large 版 24 层/3.4 亿),然后在 11 个任务上微调全部刷榜。这一下把「预训练-微调」钉成了行业默认姿势——你今天「拉个权重微调」的工作流,起点就在这。

六、映射到你的项目

你工作里的东西其实就是这篇论文的什么
RAG 里 bge-small-zh 把句子编码成向量它是 BERT 系 encoder 的直系后代。检索要「双向理解整句」,正是 MLM 训出来的本事——这就是为什么编码用 BERT 系、不用 GPT 系。
「句向量 / 整段的语义表示」从哪来BERT 的 [CLS] 输出向量 = 整句语义浓缩,正是句向量最早的来源(现代多用 mean-pooling 改进)。
做 RAG 知识库时纠结的「切块 vs 整段」BERT 类编码器有固定长度上限(经典 512 token),长文必须切——这个老约束,根在编码器的双向注意力 O(n²) 成本。
「为什么不从零训,拉个权重就微调」就是 BERT 钉下的预训练-微调范式。你用过的所有 fine-tune,都站在这套范式上。

七、检索练习(关掉上文,凭记忆答)

1. 传统语言模型为什么只能「单向」?
2. BERT 靠什么把「双向」夺回来?
3. 为什么 RAG 的 embedding 模型用 BERT 系而不是 GPT 系?

八、常见问题 FAQ

把这一课接到你真实工作上的几个关键问。点开看答。

为什么做检索/embedding 几乎都是 BERT 系,而 ChatGPT/Claude 却是 GPT 系?

一句话:编码要「理解」,对话要「生成」,两件事的最优训练目标不同。

检索的核心是把一段话压成一个能代表整句语义的向量。要压得准,得左右双向地理解全句——这正是 MLM(BERT)练出来的本事。所以 bge / e5 / gte 这些 embedding 模型,几乎都是 BERT 系 encoder。

对话/续写要的是一个词一个词往下生成,天然是单向自回归——这是 GPT(decoder-only)的主场。

注:近年也有用大 decoder 模型抽 embedding 的做法(如某些 LLM-based embedder),但主流检索栈仍以 BERT 系为骨干。路线选择 = 预训练目标选择,这是你做技术判断时最该握住的一条线。🔮

NSP 后来被「淘汰」了,那还要学它吗?

要——但要知道它的归宿。BERT 原论文用 NSP 学句子间关系,但后续的 RoBERTa 做消融实验发现:去掉 NSP、把 MLM 训得更狠,效果反而更好。所以现代很多 BERT 变体移除了 NSP

学它的价值在于:理解 BERT 当年「为下游问答/推理铺路」的设计动机,以及——一个看似合理的预训练任务,要靠消融实验才能验证它到底有没有用。这正是你「重证据、轻断言」的那套做派在论文里的样子。

理解一定用 encoder、生成一定用 decoder 吗?那为什么现在大模型几乎都是 decoder-only?

大方向对,但不是铁律。先说 encoder 和 decoder 的真正区别——不是两种神秘零件,结构高度雷同(都是 self-attention + FFN),核心差别就一条:self-attention 让不让看右边。encoder 不挡(双向)、decoder 用因果掩码挡住右边(单向)。decoder 的「因果掩码」,就是「预测下一个词不能偷看答案」的物理实现。

为什么不是铁律:decoder-only 也能做理解(分类/抽取靠 in-context learning 现场学)。事实上现在通用大模型几乎全是 decoder-only(GPT/Claude/Llama),理解生成一把抓;encoder-only(BERT 系)如今主要活在 embedding/检索这种纯理解、要双向、又不需生成的场景(你的 bge)。

为什么 decoder 赢了通用赛道?两个性质不对称:

单向(decoder)双向(encoder)
对生成硬约束(必须单向)做不了流畅生成
对理解够用(也能理解)是优势,但非必需

一句话:生成离不开单向,理解离得开双向 → 那把生成扛起来、理解也凑合的 decoder-only,成了更通用的路。所以纯检索还用 encoder,通用大模型都走 decoder-only。🔮

seq2seq 的「编码双向 + 解码单向」是什么意思?

seq2seq 是同一个模型里有两半——读的那半双向,写的那半单向。因为「读」和「写」任务性质不同。以翻译 我爱你 → I love you 为例:

Encoder(读源句"我爱你")Decoder(写译文"I love you")
在干嘛理解已给定的输入逐词生成输出
信息全不全源句整句在手写到 "love" 时,后面还没写出
能否双向(理解越全越好)不能(看右边=偷看没写的词)

关键:读「已知的东西」可以双向(信息全在);写「还没写完的东西」必须单向(不偷看未来)

而且 decoder 写每个词时同时看两处:① masked self-attention 看自己已写的左边目标词;② cross-attention 回头看 encoder 对整句源句的理解——第 ② 条就是 P02 Bahdanau「align and translate」的起源(生成 "love" 时对齐到源句的"爱")。

所以三条路线统一在「哪半双向」一个维度上:encoder-only(BERT)=只读·双向;decoder-only(GPT)=只写·单向;encoder-decoder(seq2seq/T5)=读双向+写单向,是前两条的组合,不是第三种零件。

本课主源

读原典:Devlin et al. — BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (arXiv:1810.04805)

建立直觉首选:Jay Alammar — The Illustrated BERT(图解 MLM、预训练-微调、特征抽取)。

下一篇 P06 GPT-1:走另一条岔路——decoder-only、单向、为生成而生。BERT(理解)与 GPT(生成)两条路线,从这里分开,最终各成一片天。

我是你的老师,随时提问。 比如:「[CLS] 向量为什么能代表整句?」「BERT 的 512 token 上限是哪来的、能不能突破?」 「既然 BERT 更懂理解,为什么 RAG 的『生成』那一步又回到 GPT?」——别带着模糊往下走。

参考:
Devlin et al., BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding, 2018;Liu et al., RoBERTa, 2019;Alammar, The Illustrated BERT.