self-attention 的本事是每个 token 同时看全序列。照理说,理解「它」是什么、「bank」是哪个 bank,左右都看才看得准。可此前的语言模型(以及马上要学的 GPT)几乎都单向——只看左边。为什么自废一半武功?
传统语言模型的训练目标是「预测下一个词」(自回归)。要预测位置 i 的词,就绝不能让模型看到位置 i 及右边——否则答案就在输入里,模型直接抄,啥也学不到。
所以单向不是技术做不到双向,是「预测下一个词」这个目标本身,逻辑上要求挡住右边。
论文要的:一个既能用上「左右两边语境」、又不会偷看答案的自监督目标。
| 换什么 | 怎么换 | 解决了什么 |
|---|---|---|
| ① 换目标 → MLM | 随机盖住 15% 的词,让模型用左右两边一起猜被盖的(完形填空) | 答案被盖住了,看全句不算偷看 → 双向解锁 |
| ② 加目标 → NSP | 给两句话,判断 B 是不是 A 的真实下一句 | 学句子间关系,服务问答/推理 |
| ③ 换架构 → encoder-only | 只堆 Transformer 的编码器,扔掉 decoder | 不生成、只理解,每层都真双向 |
盖住的 15% 里,并不是全换成 [MASK]:80% 换 [MASK]、10% 换一个随机词、10% 保持原词不动。
为什么这么拧?因为微调时根本没有 [MASK] 这个符号——如果预训练只见过 [MASK],一到下游就「水土不服」。这 80/10/10 是为了缩小预训练和微调之间的差距。这种「为了对齐两个阶段而做的小设计」,正是你做 prompt/eval 时该有的嗅觉。
| 两种做题方式 | 对应模型 | 能看到的语境 |
|---|---|---|
| 句子接龙:只给你上半句,往下接 | GPT(单向语言模型) | 只有左边 |
| 完形填空:整段挖几个空,前后文都给你 | BERT(MLM) | 左右都有 |
做完形填空,你当然两边都瞄——这正是 BERT 比单向模型「理解」更全的来源。但完形填空的人,不擅长从头编一篇连贯长文(那是接龙的活)。一个目标的差别,决定了两条路线的性格。
同一句话盖住中间一个词,切换两种模式,看高亮的「可利用语境」范围——以及单向模式下,为什么常常填不准。
| 维度 | 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,都站在这套范式上。 |
把这一课接到你真实工作上的几个关键问。点开看答。
一句话:编码要「理解」,对话要「生成」,两件事的最优训练目标不同。
检索的核心是把一段话压成一个能代表整句语义的向量。要压得准,得左右双向地理解全句——这正是 MLM(BERT)练出来的本事。所以 bge / e5 / gte 这些 embedding 模型,几乎都是 BERT 系 encoder。
对话/续写要的是一个词一个词往下生成,天然是单向自回归——这是 GPT(decoder-only)的主场。
注:近年也有用大 decoder 模型抽 embedding 的做法(如某些 LLM-based embedder),但主流检索栈仍以 BERT 系为骨干。路线选择 = 预训练目标选择,这是你做技术判断时最该握住的一条线。🔮
要——但要知道它的归宿。BERT 原论文用 NSP 学句子间关系,但后续的 RoBERTa 做消融实验发现:去掉 NSP、把 MLM 训得更狠,效果反而更好。所以现代很多 BERT 变体移除了 NSP。
学它的价值在于:理解 BERT 当年「为下游问答/推理铺路」的设计动机,以及——一个看似合理的预训练任务,要靠消融实验才能验证它到底有没有用。这正是你「重证据、轻断言」的那套做派在论文里的样子。
大方向对,但不是铁律。先说 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 是同一个模型里有两半——读的那半双向,写的那半单向。因为「读」和「写」任务性质不同。以翻译 我爱你 → 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.