跳到主要内容

03 · 理解:把「完形填空」当成学习方式

1. 这一章讲什么

在自然语言处理——简称 NLP,即让机器对付人类语言的技术——里,GPT 是从左往右写;BERT 拿着同一套 Transformer 零件,却干另一件事——读懂。原书第 3 章讲三件事:BERT 的身体为什么适合理解(双向注意力+编码器堆叠)、它靠什么任务自己教自己(掩码语言模型 MLM)、以及预训练完怎么微调去做具体任务(文本分类)1

它和 02 章是全书的一对反差搭档:同样从第 1 章的零件出发,单向+预测下一个词,就长成生成模型(管往外写的);双向+完形填空,就长成理解型的。 后面第 5 章的微调技术、第 10 章的压缩技术,演示载体都是 BERT 这一族。

2. 顶层全景:遮住一个词,让模型猜

原句: [猫] [追] [老] [鼠] 词表索引: 猫=213 老鼠=?
│ 随机挑中「老鼠」→ 替换成 [MASK] (索引 103)

输入: [213] [追] [103] [?]
│ 双向编码器(每个词能看前后所有词)

输出: 每个位置一个 30522 维的分布(词表里每个词一分)
│ 只看 [MASK] 那个位置的分布

损失: 只对 [MASK] 位置算(其他位置标签设为 -100,不计损失)
→ 模型学会「靠上下文猜被遮的词」

图说:预训练数据不需要任何人工标注——这就是自监督——答案(被遮的词)是从原文里「偷」来的,不需要人标注。

3. 核心原理

3.1 双向:理解型任务的身体条件

做「它指谁」「这句话是正面还是负面」这类理解题,一个词既要看上文也要看下文——原书对 BERT 注意力的描述是「不仅关注其前面的词,还关注其后的词」2。这与 02 章的单向掩码正好相反:BERT 没有掩码,或者说是「全开」的。

身体结构上,BERT 是编码器堆叠:每层=自注意力+前馈+残差+层归一化(第 1 章那套),层层叠出深语义3。原书给了一个「专家合著百科全书」的比喻:每层是一位专家,前一层输出「总结」,后一层在总结上继续加深解读——比喻听个意思即可,机制上就是逐层提纯表示。

3.2 掩码语言模型:自己出题自己改

MLM 的做法原书写得很清楚:在输入文本中随机遮掩一部分词语,让模型靠其余部分预测被遮的词,从而在无标注数据上学到语义特征(词和词搭关系的规律)4

具体遮法有三个花样(原书 3.1.2 的 create_masked_data):一部分真替换成 [MASK] 标记(占位符),一部分换成随机词,一部分保持原样——模型不知道哪些被动了手脚,只能对每个位置都保持警惕5

主走查:一句话怎么变成一道完形填空。 原书 3.1.2 的演示输出给了真实痕迹:

掩码后的输入(节选): tensor([[ 213, 103, 768, ..., 1023], ...])

└─ 103 就是词表里 [MASK] 的索引——
原来位置的词被换掉了

掩码标签: tensor([[ -100, 678, -100, ..., -100], ...])
│ │
│ └─ 678 = 被遮那个词的正确答案
└─ -100 的意思:「这个位置不算损失」
→ 模型只在被遮的位置被扣分/得分

走查说明:这里最容易看漏的是 -100。原书的解释是:其他位置标记为 -100,以忽略不被遮掩的词,确保模型只对 [MASK] 位置进行预测6。工程上它是个「免检通行证」——交叉熵损失见到 -100 就跳过。没有这个设计,模型会被逼着在 3 万多个词里猜每个位置,损失被无意义的项淹没。

另一个数字:输出是 30522 维——那是 BERT 词表的大小,模型对每个位置都要在整张词表上表态7

3.3 从预训练到微调:接一个分类头

预训练只教会了「语言的一般规律」;具体任务(这条影评是好评还是差评?)要靠微调。原书 3.3 的做法:拿预训练好的 BERT,最后一层输出接一个线性(直来直去)分类层,让它输出分类结果;训练步骤是数据加载、标签编码、模型定义、损失计算、优化器设置(优化器已在 09 章开头解释)、训练评估8

数据上有个值得学的细节:原书把数据按 4:1 拆成训练集和验证集——验证集不参与训练,专用来回答「现在到底学得怎么样」9

主走查(第二走查):三个 epoch 的微调,数字怎么动。 原书的二分类(只分两类的)演示输出:

Epoch 1: 训练损失 0.561 → 验证准确率 0.750
Epoch 2: 训练损失 0.483 → 验证准确率 0.800
Epoch 3: 训练损失 0.435 → 验证准确率 0.850
读法:损失一路降,验证准确率一路升 → 学到的是规律,不是背题
(这些是原书的演示数值,数据规模很小,准确率别外推)

为什么小数据也能到 0.85?因为 BERT 不是从零学:预训练阶段已经花了海量文本学会「词怎么搭、句怎么通」,微调只需要在已成的理解力上,学一层「从理解到判断」的映射(对应关系)。

3.4 补一个应用实例:自动补全标题

原书 3.2.3 给了个能直接套用的例子:新闻编辑要补全标题,把缺词处写上 [MASK],用预训练模型预测该位置的词,取概率最高的填回去10。演示句子里模型把「科技公司的 [MASK]」补成了「products」11。这个例子的价值在于它展示了 MLM 的另一种用法:不是训练,是直接拿预训练模型当填空器用

4. 作者的判断与证据

  • 有演示数据的: 掩码输入里的 103、标签里的 -100 与 678(3.1.2 输出)、30522 维输出(3.2.1)、三个 epoch 准确率 0.750→0.850(3.3)。
  • 是作者判断/比喻的: 「专家合著百科全书」的编码器堆叠比喻(3.1.1);「MLM 使模型能够有效地学习词的上下文语义」是定性判断,书里没有与「不遮词」的对照实验。
  • 要分开的声音: 3.5 思考题里出现 AdamW「为何适合 BERT」的提问,但正文没有展开 AdamW 原理——那要到原书第 9 章才讲;本拆解放到 09 章。

5. 边界与局限

  • 原书引言提到 BERT 预训练还有「下一句预测(NSP)」任务12,但第 3 章正文只实现并讲解了 MLM,NSP 只有一句定义、没有实现。这是书内前后的一个缺口。

  • 补充(不在书里,来自通用知识):原版 BERT 的遮词比例是 15%,其中八成换 [MASK]、一成换随机词、一成不动——原书讲了「三个花样」却没给比例;比例本身影响很大,想复现要查原论文。

  • MLM 只教「词级」理解;句级与篇章级能力(检索——按意思找资料)在原书里没有覆盖。

  • 问答的推理(一步步想出答案)同样不在。

  • 演示数据是自造的小样本(几十条),0.85 这个数字是教学环境的产物,不构成「BERT 微调效果」的普遍证据。

6. 可带走的

  1. 生成看左,理解看右:单向掩码造就 GPT,双向注意力造就 BERT——分岔点只有一个开关。

  2. 自监督=把原文改造成题目,答案白送;海量无标注文本因此可用。

  3. 遮词有三种花样([MASK]/随机词/原样),目的是让模型不敢偷懒。

  4. -100 是损失函数(量「错多少」的尺子)的「免检通行证」:只对被遮位置算损失,这是读任何 MLM 代码第一眼要找的东西。

  5. 输出的维度=词表的大小(30522);「在整张词表上表态」是理解 logits(每个候选词的原始打分)的关键。

  6. 微调=冻结的理解力+一层新的判断;数据按比例留出验证集,防「背题」。

  7. 预训练模型可以直接当填空器用(找 [MASK]、取 argmax),不一定非要训练。

7. 原文地图

主题原书章原文位置
章导语第3章text/18-ch03.txt:24(搜「掩码语言模型」)
双向语境、MLM 定义3.1text/19-ch03-01-3-1.txt:24(搜「双向语境信息」) · text/19-ch03-01-3-1.txt:33(搜「随机遮掩部分词语」)
编码器堆叠3.1text/19-ch03-01-3-1.txt:24(搜「编码器堆叠」)
双向注意力、遮掩三花样3.1text/19-ch03-01-3-1.txt:142(搜「还关注其后的词」) · text/19-ch03-01-3-1.txt:175(搜「或随机词」)
-100 标签、103=[MASK]3.1text/19-ch03-01-3-1.txt:193(搜「掩码后的输入」) · text/19-ch03-01-3-1.txt:236(搜「以忽略不被遮掩的词」)
30522 维输出3.2text/20-ch03-02-3-2.txt:99(搜「30522」)
标题填空应用与输出3.2text/20-ch03-02-3-2.txt:142(搜「预测标题中的缺失词」) · text/20-ch03-02-3-2.txt:251(搜「products」)
微调分类与 4:1 拆分3.3text/21-ch03-03-3-3.txt:24(搜「线性分类层」) · text/21-ch03-03-3-3.txt:48(搜「4:1的比例」)
三轮训练数字3.3text/21-ch03-03-3-3.txt:66(搜「0.667」)

Footnotes

  1. 出处:「第3章 BERT模型核心实现与预训练」第 24 段(text/18-ch03.txt:24,搜「掩码语言模型」)。

  2. 出处:「3.1 BERT模型的核心实现」第 142 段(text/19-ch03-01-3-1.txt:142,搜「还关注其后的词」)。

  3. 出处:「3.1 BERT模型的核心实现」第 24 段(text/19-ch03-01-3-1.txt:24,搜「编码器堆叠」)。

  4. 出处:「3.1 BERT模型的核心实现」第 33 与 145 段(text/19-ch03-01-3-1.txt:33,搜「随机遮掩部分词语」;text/19-ch03-01-3-1.txt:145,搜「自监督预训练」)。

  5. 出处:「3.1 BERT模型的核心实现」第 175 段(text/19-ch03-01-3-1.txt:175,搜「或随机词」)。原书:「随机替换为[MASK]标记或随机词,生成适用于BERT自监督训练的数据标签」。

  6. 出处:「3.1 BERT模型的核心实现」第 236 段(text/19-ch03-01-3-1.txt:236,搜「以忽略不被遮掩的词」)。

  7. 出处:「3.2 预训练任务:掩码语言模型(MLM)」第 99 段(text/20-ch03-02-3-2.txt:99,搜「30522」)。

  8. 出处:「3.3 BERT模型的微调与分类任务应用」第 24 与 27 段(text/21-ch03-03-3-3.txt:24,搜「线性分类层」;text/21-ch03-03-3-3.txt:27,搜「训练步骤」)。

  9. 出处:「3.3 BERT模型的微调与分类任务应用」第 48 段(text/21-ch03-03-3-3.txt:48,搜「4:1的比例」)。

  10. 出处:「3.2 预训练任务:掩码语言模型(MLM)」第 142 段(text/20-ch03-02-3-2.txt:142,搜「预测标题中的缺失词」)。

  11. 出处:「3.2 预训练任务:掩码语言模型(MLM)」第 251 段(text/20-ch03-02-3-2.txt:251,搜「products」)。

  12. 出处:「引言」第 73 段(text/03-fm.txt:73,搜「下一句预测」)。原书一句带过 MLM 与 NSP,第 3 章只展开了 MLM。