1. 前言
前面我们已经顺着李沐这条线,逐步走到了:
注意力机制
自注意力
使用注意力机制的 Seq2Seq
到这里,其实已经离现代 NLP 的核心模型很近了。
因为后来的很多自然语言处理模型,本质上都建立在一个关键能力之上:
如何更好地学习上下文相关的语言表示。
而在这一点上,最具代表性的模型之一,就是:
BERT(Bidirectional Encoder Representations from Transformers)
BERT 的出现,可以说彻底改变了自然语言处理中的“预训练 + 微调”范式。
它让大家意识到:
先在大规模无标注文本上学通用语言表示,再在下游任务上微调,效果会非常强。
所以这一节的重点,就是把 BERT 的核心思想真正讲清楚:
BERT 到底是什么
它和前面的语言模型、RNN、Seq2Seq 有什么不同
为什么它叫“双向”
为什么它能成为一个里程碑模型
2. 什么是 BERT
BERT 的全称是:
Bidirectional Encoder Representations from Transformers
中文可以理解成:
来自 Transformer 的双向编码表示
这个名字其实已经把它的核心说出来了:
第一,Transformer
说明它的底层结构不是 RNN,而是基于自注意力的 Transformer 编码器。
第二,Bidirectional
说明它不是单向看上下文,而是双向利用上下文。
第三,Representations
说明它的核心目标不是直接做某个单独任务,而是先学习高质量的语言表示。
所以你可以先把 BERT 粗略理解成:
一个基于 Transformer 编码器、能学习深层双向上下文表示的预训练语言模型。
3. BERT 为什么重要
BERT 重要,不只是因为它“效果好”,
更因为它把 NLP 的工作流彻底带到了一个新阶段。
在 BERT 之前,很多 NLP 模型往往是:
针对某个具体任务单独设计
从头训练
很依赖任务特定结构
而 BERT 带来的思路是:
先做大规模通用预训练,再针对具体任务微调。
这样带来的好处非常明显:
3.1 通用语言知识可以复用
模型先在海量语料中学到语言规律。
3.2 下游任务不再从零开始
只需要在已有表示基础上做适配。
3.3 小数据任务也能受益
因为预训练已经学到了大量知识。
所以 BERT 不只是一个模型,
它更是一种:
预训练语言模型范式的代表
4. BERT 和前面的语言模型有什么区别
这个对比一定要讲清楚。
前面的语言模型
我们前面学过的语言模型,核心是:
根据前文预测下一个 token
这通常是单向的。
例如:
从左到右预测
当前词不能看到未来词
这类模型更适合做自回归生成。
BERT
BERT 不走这条路线。
它不是简单做“下一个词预测”,而是通过特殊预训练任务,让模型:
同时利用左边和右边的上下文来学习当前词的表示。
所以 BERT 更像一个:
擅长语言理解的双向预训练编码器
而不是一个标准的自回归生成器。
5. 为什么 BERT 叫“双向”
因为它在训练表示时,希望每个位置的表示都能同时看到:
左边上下文
右边上下文
例如一句话里某个词的含义,很多时候必须结合前后文一起理解。
这和前面的单向语言模型不一样。
单向语言模型
当前位置表示通常只能依赖左边,或者右边。
BERT
当前位置表示可以依赖左右两边。
所以 BERT 的“Bidirectional”指的就是:
深层双向上下文建模能力
这也是它在语言理解任务上特别强的原因之一。
6. 为什么双向上下文这么重要
因为自然语言里,很多词的意义并不是固定的,
而是强烈依赖上下文。
例如一个词出现在不同句子里,
它的真正语义可能会变。
所以,如果模型只能单向看上下文,往往会丢掉很多信息。
而双向表示则更符合真实语言理解过程:
理解一个词,不只是看它前面出现了什么,也要看它后面跟着什么。
这就是 BERT 能学到更强表示的根本原因。
7. BERT 的底层为什么是 Transformer Encoder
因为前面我们已经学过:
自注意力非常适合建模全局依赖,而且并行能力强。
BERT 正是建立在这个基础上。
它没有用 RNN、GRU、LSTM 来逐步递推序列,
而是使用:
多层 Transformer Encoder 堆叠
这样做的好处包括:
7.1 能直接建模长距离依赖
任意两个位置都能通过自注意力直接相连。
7.2 更适合并行训练
不像 RNN 那样必须一步一步展开。
7.3 更容易学上下文化表示
每一层都能让各位置相互交互更新表示。
所以可以说:
没有自注意力和 Transformer Encoder,就没有 BERT 这种现代预训练模型。
8. BERT 的输入长什么样
BERT 的输入不是简单一串普通 token。
它通常会在原始 token 序列基础上加入一些特殊标记。
最常见的有:
[CLS][SEP][MASK]
其中:
[CLS]
通常放在句子最前面,用来汇总整句表示。
后面做分类任务时,常常直接用它的输出表示。
[SEP]
用于分隔句子。
在句对任务里尤其常见。
[MASK]
用于预训练中的掩码语言模型任务。
所以 BERT 输入通常不是“纯文本 token 序列”,
而是:
带特殊标记的结构化输入序列
9. BERT 为什么需要[CLS]
因为很多 NLP 任务最终需要一个“整句表示”,例如:
句子分类
情感分析
自然语言推理
BERT 的做法是:
在句首加一个特殊 token
[CLS]
然后经过多层 Transformer 编码后,[CLS]位置的输出向量就可以被当作:
整段输入的综合表示
这是一种非常巧妙的设计。
因为它避免了额外手工设计池化策略,直接把“句子级表示”嵌进了模型结构里。
10. BERT 为什么需要[SEP]
[SEP]的作用是:
分隔不同句子或不同片段
例如在句对任务中,输入可能是:
[CLS] 句子A [SEP] 句子B [SEP]这样模型就能清楚知道:
哪部分属于第一句
哪部分属于第二句
这对于:
问答
句子匹配
自然语言推理
这类任务非常重要。
所以[SEP]不只是一个普通分隔符,
它是 BERT 任务组织方式的一部分。
11. BERT 的预训练任务是什么
BERT 最经典的两个预训练任务是:
Masked Language Modeling(MLM,掩码语言模型)
Next Sentence Prediction(NSP,下一句预测)
这两个任务共同帮助 BERT 学习语言表示。
12. 什么是掩码语言模型(MLM)
这是 BERT 最核心的预训练任务。
它的基本做法是:
在输入序列中随机遮住一些 token,让模型根据上下文去预测这些被遮住的词。
例如原句:
I love deep learning可能变成:
I love [MASK] learning然后让模型预测:
deep这和传统“下一个词预测”非常不同。
传统语言模型
只能单向看上下文。
MLM
被遮住的位置可以同时利用左右上下文。
所以 MLM 正是 BERT 实现“双向上下文建模”的关键。
13. 为什么 MLM 能让 BERT 学双向表示
因为在预测[MASK]的时候,模型既可以看左边,也可以看右边。
例如:
the cat sat on the [MASK]模型既能看前面:
the cat sat on
也能结合整个句子结构去判断后面合理的词。
所以 MLM 不再要求模型按照时间方向生成,
而是要求它:
利用完整上下文恢复被遮住的信息
这就非常适合训练双向语言表示。
14. 为什么 BERT 不直接做普通语言模型
因为普通自回归语言模型天然是单向的。
它要预测下一个词,就不能偷看未来。
但 BERT 的目标不是“生成下一个词”,
而是:
学一个尽可能强的上下文表示模型
所以它改用 MLM 这种“填空式预训练”,
从而允许模型同时看左右上下文。
也就是说:
BERT 更偏“理解式预训练”,而不是“生成式预训练”。
15. 什么是下一句预测(NSP)
除了 MLM,原始 BERT 还有一个经典任务:
Next Sentence Prediction(下一句预测)
它的目标是:
给模型两个句子,判断第二句是不是第一句的真实后续。
例如:
句子 A:今天天气很好。
句子 B:我们去公园散步吧。
这两个句子可能是连贯的。
而如果句子 B 换成:
服务器显存不足。
那就显然不连贯。
NSP 的目的是让 BERT 学习:
句子之间的关系
这对句对任务有帮助。
16. BERT 的输入表示不只是 token embedding
BERT 的输入表示通常由三部分相加得到:
Token Embedding
Segment Embedding
Position Embedding
也就是说,每个输入位置的最终表示,不只是词本身,还包含:
词是谁
token embedding
它属于哪一段句子
segment embedding
它在序列中的位置在哪里
position embedding
所以 BERT 的输入比前面很多模型都更结构化。
17. 为什么 BERT 还需要位置编码
因为 Transformer / 自注意力本身不像 RNN 那样天然按时间顺序递推。
它并不知道:
哪个词在前
哪个词在后
所以必须额外告诉模型位置信息。
这就是 position embedding 的作用:
把序列顺序信息显式注入模型
没有位置编码,
自注意力虽然能看见所有 token,
却分不清它们原本的先后顺序。
18. BERT 主要适合什么任务
BERT 特别适合:
自然语言理解类任务
例如:
文本分类
情感分析
命名实体识别
问答
自然语言推理
句子匹配
原因很简单:
它是双向的
它擅长学上下文化表示
它的
[CLS]表示天然适合句级任务它的 token 级表示也适合序列标注
所以 BERT 更像一个:
强大的通用语言理解底座
19. BERT 和 GPT 最本质的差别是什么
这一点虽然本节不一定展开太多,但可以先点一下。
BERT
双向
以理解为主
预训练任务是 MLM
更适合理解类任务
GPT
单向自回归
以生成为主
预训练任务是下一个 token 预测
更适合文本生成
所以你可以简单理解成:
BERT 更像“会读懂”的模型
GPT 更像“会续写”的模型
当然现代模型已经越来越融合,但这个基本区分仍然很有帮助。
20. 李沐这一节最想让你理解什么
这一节最核心的,不是让你一口气记住所有 BERT 细节,
而是先把下面这条主线抓住:
第一,BERT 是基于 Transformer Encoder 的双向预训练模型
这决定了它的结构基础。
第二,BERT 的关键在于预训练范式
先大规模预训练,再在下游任务上微调。
第三,MLM 是它实现双向建模的核心机制
这是和普通语言模型最大的不同。
第四,BERT 是现代 NLP 的关键里程碑
后面很多模型都和它有深刻联系。
所以这一节真正要建立的是:
BERT 在整个 NLP 发展脉络中的位置感。
21. 本节总结
这一节我们学习了 BERT,核心内容可以总结为以下几点。
21.1 BERT 是基于 Transformer Encoder 的双向预训练语言模型
它擅长学习上下文化表示。
21.2 它的重要性不仅在模型本身,更在“预训练 + 微调”范式
这是现代 NLP 的重要基础。
21.3 BERT 的核心预训练任务是 MLM
通过预测被遮住的词来学习双向上下文表示。
21.4 原始 BERT 还使用了 NSP 任务
用于学习句子之间的关系。
21.5 BERT 更偏向语言理解任务
而不是标准自回归文本生成任务。
22. 学习感悟
BERT 这一节特别关键,因为它让我们第一次真正看到:
语言模型不一定非得只会“往后猜”,
它也可以通过更巧妙的预训练任务,学会“把整句看懂”。
这一步非常重要。
因为它把 NLP 的重点,从“单任务从零训练”,带到了:
先学通用语言知识,再迁移到具体任务。
从这个角度看,BERT 不只是一个模型,
更是一种时代转折。