跳到主要内容

把两句话拼成一句来判 — 23 个位置的编号串与 0/1 标记

这一章讲三件事: 「两句话意思一不一样」这个任务,怎么被翻译成「拼成一句话再分类」; 一个 Transformer 编码器的组块里到底装了什么; 以及从零训出来的 0.66485 该怎么读。

它在全书链条里的位置: 第 15 章把自注意力的三个零件备齐了。 这一章丢掉 LSTM,只用这些零件堆出一个完整的架构—— 这是全书的第一个纯注意力模型,也是第 17、20 章的底版。

需要的基础: 第 15 章全部;第 13 章的层规范化;第 14 章的暂退法。

1. 先看现象:这三句话,哪两句是一个意思

A. 什么花一年四季都开?
B. 什么花生一年四季都开?
C. 哪些花可以全年开放?

按字面重合度判断,A 最像 B——只差一个字。 按意思判断,A 像 C——问的是同一件事1

这个任务叫文本语义匹配:让模型从「意思上」判断两句话是否一致—— A 与 B 应输出 0、A 与 C 应输出 12。 信息检索、问答系统都会用到它1

这一节书里做了一个决定性的切换:抛开前两节「LSTM + 自注意力」的混搭, 改用纯自注意力的 Transformer 来完成这个任务。 由于匹配本质上是一个二分类问题,仅使用 Transformer 的编码器部分即可3

「编码器」就是这种结构里负责「把输入读懂」的那一半—— 它把一句话变成一组融合了上下文的向量;另一半「一个字一个字往外写」的,第 20 章才登场。

全章主走查:一句话怎么变成 23 个位置
═══════════════════════════════════════════════════════════════════
输入 「什么花一年四季都开」 + 「什么花一年四季都是开的」(标签 1)
───────────────────────────────────────────────────────────────────
§2 ① 拼接:[CLS] + 句1 + [SEP] + 句2 + [SEP] → 23 个位置
§3 ② 换编号:23 个 id + 23 个 0/1 标记
§4 ③ 三张牌相加:字、位、句
§6 ④ 过组块:多头自注意力 → 加与规范 → 逐位前馈 → 加与规范
§7 ⑤ 取第 0 个位置过分类头 → 相似 / 不相似
═══════════════════════════════════════════════════════════════════

2. 拼接模板:两句变一句

书里用的数据是 LCQMC——一个来自百度知道领域的中文问题匹配语料(成批收拢的真实问答文本), 训练集 238 766 条、验证集 8 802 条、测试集 12 500 条4。 每条样本三列:两句中文文本、一个标签(1 = 相似、0 = 不相似)5

顺带钉一个词:标注——人工给样本贴上正确答案(标签)的那道工序;第 04 章讲的「有监督」,靠的就是它。 切分按字符级:每个汉字算一个最小单位6。 (这个「切分后的最小单位」,行话叫词元——这里一个词元就是一个汉字。)

关键的一步是把两句话按一个模板拼成一句7:

[CLS] 什么花一年四季都开 [SEP] 什么花一年四季都是开的 [SEP]
────────────────────────────────────────────────────────────────
[CLS] 开头的一个特殊位置,叫「句子特征位」——
约定编码之后,它的向量代表整段语义
[SEP] 分隔符,标出两句话的边界
────────────────────────────────────────────────────────────────
这两个特殊位置也是词元,词表里有专门的编号

这一拼,「两句相似度判断」就转化成了「一句话的二分类」8—— 第 05 章那套分类流水线原样适用,只是输入变了。

3. 主走查:23 个位置的编号串与 0/1 标记

拼完之后,每个词元换编号,顺带配一个「属于第几句」的标记。 书里把这一串原样打印了出来9:

主走查第 ② 步
────────────────────────────────────────────────────────────────
编号串(23 个)
[101, 784, 720, 5709, 671, 2399, 1724, 2108, 6963, 2458, 102,
784, 720, 5709, 671, 2399, 1724, 2108, 6963, 3221, 2458, 4638, 102]

0/1 标记(23 个)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
────────────────────────────────────────────────────────────────
101 = [CLS],102 = [SEP]
11 个 0:[CLS] + 句1 的 8 个字 + [SEP]
12 个 1:句2 的 10 个字 + [SEP]

读这一串编号能发现一件事:两句的前 8 个字完全相同,编号串也完全相同(784 … 6963); 差别从第 19 个位置才出现——「都开」对「都是开的」。 模型要判的,就是这点差别算不算数。

词表里没有的字,一律换成一个兜底的编号10——第 11 章的未登录词规则,这里一样适用。

成批处理时还是那两道工序:按上限截断、短的补占位符(编号 0)11。 一批 32 条,书里的打印显示这一批最长 52 个位置, 三张张量并排:编号 [32, 52]、0/1 标记 [32, 52]、标签 [32]12

4. 每个位置带三张牌:是哪个字、在第几位、属于哪句

自注意力有一个先天的盲区:它对位置无感——同一组词元打乱顺序,结果相同13。 而「猫追狗」和「狗追猫」的差别恰恰在顺序上。 所以每个词元不能只带「我是谁」,还得带「我在第几位」; 这个任务里还得带「我属于第几句」。

书里给每个位置配三张牌,按位置相加14:

位置 i 的最终表示 = 输入编码 + 位置编码 + 分段编码
────────────────────────────────────────────────────────────────
输入编码 这个字是谁 ——一张查表,每个编号对应一个向量
位置编码 它在第几位 ——第 5 节专门讲
分段编码 它属于第几句 ——一张只有 2 行的查表:0 一行、1 一行

三张牌都是向量,维度相同,直接相加。 输入编码那张查表,按原始 Transformer 的约定, 用「均值 0、标准差 1/√维度」的正态分布初始化,前向时再乘回 √维度, 让词向量的长度与位置编码(给每个位置发的编号向量)大致匹配,便于相加15

相加之后还有两道收尾:一次层规范化、一次暂退16层规范化就是第 13 章第 9 节那个沿特征维拉回的零件,这里用它稳住输入端的刻度; 暂退就是第 14 章第 4 节那个随机关闭——它插在整个输入层的末尾, 训练时随机把一部分位置的特征置零,让模型别死记输入的表面细节。

5. 位置怎么编:一组频率不同的正余弦曲线

位置编码是这一章唯一的新零件,值得单独一节。

书里的方案:不靠训练,直接用一组固定的曲线算出来17:

位置 t 的第 2i 维 = sin(t / 10000^(2i/D))
位置 t 的第 2i+1 维 = cos(t / 10000^(2i/D))
────────────────────────────────────────────────────────────────
偶数维用正弦、奇数维用余弦,频率随维度指数衰减
每一维都是一条频率不同的曲线,取值落在 [−1, 1]

「正弦/余弦」就是中学里那个在 −1 到 1 之间来回摆的波形函数—— 这里每个位置、每个维度各取波形上的一点。

为什么这么编? 书里画了一张图:把前 100 个位置的若干维度逐位置画成曲线—— 低维(高频)的曲线摆得快,捕捉细粒度位置; 高维(低频)的曲线摆得慢,捕捉粗粒度位置18两个位置差多少,看这组曲线的取值就能分出来——这给了注意力「相对距离」的线索。

这张表是确定性(同样的输入永远算出同样的数)变换,不参与训练19

6. 一个组块里有什么:四个动作,两条直通道

23 个向量准备好之后,过 Transformer 组块。一个组块四个动作20:

输入 X

├───────────────┐
▼ │
① 多头自注意力 │ ← 第 15 章那套:每个位置去看所有位置
▼ │
② 加与规范 ◄─────┘ ← 子层输出与输入相加,再做层规范化

├───────────────┐
▼ │
③ 逐位前馈 │ ← 两层全连接,独立作用在每个位置上
▼ │
④ 加与规范 ◄─────┘

输出

② 和 ④ 那个「相加」,就是第 09 章那条直连边在这里的形态—— 书里叫加与规范(Add&Norm):把子层输出与残差相加,再做一次层规范化21第 13 章第 9 节那件工具,在一个组块里出现两次。 书里的评价是:两个机制配合,让 Transformer 能够堆叠到几十甚至上百层而不爆梯度21

③ 逐位前馈是两层带折线激活的全连接,独立作用在序列里的每个位置上—— 书里给了一个很准的读法:可以视为「核大小为 1」的卷积, 做的是非线性特征重映射,而非跨位置混合22中间层维度通常取输入的 4 倍:先升维放大表达力,再降维(把宽度压回原样)回原始尺寸23

注意一个和第 07 章呼应的细节:整个组块没有任何一道「两端压平」的曲线—— 自注意力是线性加归一化,逐位前馈用的是折线激活, 信息沿两条直通道可以越过任何一层。 第 07 章那个「传着传着就没了」的病,在这套结构里从设计上就不存在。

书里在这里插了一道思考题,预告了第 17 章的第一处改造: 层规范化相对于直连边的位置有两种主流写法——先加再规范(Post-LN), 还是先规范再加(Pre-LN);很多研究表明 Pre-LN 更容易训练,但 Post-LN 上限更佳24这一章用的是 Post-LN;第 17 章会讲为什么今天的大模型几乎全换成了 Pre-LN。

7. 主走查末步:取第 0 个位置,过分类头

模型一共五段:词嵌入、分段编码、位置编码、组块堆叠、二分类头25

主走查第 ④⑤ 步
────────────────────────────────────────────────
23 个向量 → 1 个组块(4 个头)→ 23 个新向量
取第 0 个位置([CLS] 那个位置)的向量
→ 一层全连接 + tanh → 分类层 → 2 个得分
────────────────────────────────────────────────
为什么取第 0 个:第 2 节约定了,它的向量代表整段语义

训练设定:每步挪 5×10⁻⁵、训 3 轮、按模截断 1.0; 优化器用 AdamW——第 14 章第 6 节那个解耦版本, 并且对偏置和规范化参数关闭权重衰减26

结果:测试 0.6648527

这个数怎么读?书里自己给了两条解释28: 一是这一版只堆了 1 个组块、参数量小;二是 LCQMC 的问句长度有限, 从零训练时容易欠拟合——「欠拟合」就是第 04 章那个「连训练集都没学会」的状态。 书里明说:本节着重展示流程,更高精度通常需要预训练的大模型来初始化28

随机猜是 0.5,所以 0.66485 确实学到了东西; 但它和「能用的语义匹配」之间,差的正是第 13 章第 2 节说的「拿别人训好的当起点」。

8. 另一条走查:换一对句子,走一遍预测

书里还完整演示了一次预测:「电脑怎么录像?」对「如何在计算机上录视频」29:

预测走查
────────────────────────────────────────────────────────────────
拼接 [CLS] 电脑怎么录像? [SEP] 如何在计算机上录视频 [SEP]
→ 20 个位置(1 + 7 + 1 + 10 + 1)
标记 9 个 0 + 11 个 1
输出 标签 1 —— 模型判定两句相似,与人工直觉一致

要交代一句出处上的事:这一次书里只打印了预测标签 1, 没有打印这 20 个位置的具体编号串29—— 位置数与标记数是按第 3 节同一套规则数出来的。

9. 热图看到什么

书里把训好的模型 4 个头的注意力权重画成热图,读出三条30:

  • [CLS] 位置与「计」「视」「像」「何」等关键字关联紧密—— 因为它承担汇总语义的职责;
  • 第二句的「计」「视」与第一句的「录像」「电脑」关联紧密—— 书里称这正是模型学到的「跨句子语义对齐」的表现;
  • 同一句内呈现「视」和「频」这类紧密词组的局部关联。

和第 11、15 章的热图同一类证据:它能证明「注意力确实在对齐两句里的对应词」, 证明不了「0.66485 里的每一分都是这么来的」。

10. 边界与局限

这一章没覆盖的:

没讲什么依据 / 为什么值得知道
堆更多组块书里留成了练习:从 1 加到 2、4、6,观察准确率、显存和时长31
拿别人训好的当起点书里点了一句「更高精度通常需要预训练 BERT(拿海量文本、不经人工标注——让文本自己出题自己答——预训练出的经典编码器)等大模型」28,没有展开——BERT 就是这种「预训练编码器」的代表
位置编码的其他方案书里留了两道思考题32;第 17 章第 5 节会讲今天主流的那一种
组块里的写法细节内置多头算子的掩码语义与手写版相反33
这一版和今天的大模型差在哪书里专门用了一节讲六处改造——第 17 章第 2–9 节逐一讲

出门会撞见的名字:

  • Transformer 编码器(encoder) —— 这一章这一半;
  • [CLS] / [SEP] —— 第 2 节那两个特殊词元(词表里预留的固定记号),BERT 风格;
  • 位置编码(positional encoding) —— 第 5 节那张正余弦表;
  • 分段编码(segment embedding) —— 第 4 节那第三张牌;
  • Add&Norm(加与规范) —— 第 6 节②④;
  • FFN / 逐位前馈(position-wise FFN) —— 第 6 节③;
  • Post-LN / Pre-LN —— 第 6 节思考题里的两种写法24

11. 可带走的

  1. 字面最像不等于意思最近——「什么花」对「什么花生」只差一字,意思完全不同;
  2. 两句相似度判断可以翻译成一句话的二分类——拼起来,加一个句子特征位;
  3. 每个词元带三张牌:是哪个字、在第几位、属于哪句,按位置相加;
  4. 自注意力对位置无感,所以位置必须显式编码进去;
  5. 正余弦位置编码不靠训练:低维摆得快管细粒度,高维摆得慢管粗粒度,取值 [−1, 1];
  6. 一个组块四个动作:多头自注意力 → 加与规范 → 逐位前馈 → 加与规范;
  7. 加与规范 = 直连边 + 层规范化,一个组块里出现两次;
  8. 逐位前馈是「核大小为 1」的卷积——只 remap 特征,不跨位置;
  9. 整个组块没有两端压平的曲线,第 07 章的病从设计上就不存在;
  10. 0.66485 的两个原因书里自己写了:只堆 1 个组块、从零训练欠拟合;
  11. 取第 0 个位置的向量代表整段语义——这是拼接模板定下的约定。

12. 原文地图

主题原书章原文位置
三句例子第8章 注意力机制text/09-ch08.txt:1363(搜「哪些花可以全年开放」)
纯自注意力的切换第8章 注意力机制text/09-ch08.txt:1367(搜「抛开前两节」)
拼接模板第8章 注意力机制text/09-ch08.txt:1391(搜「[CLS]」)
LCQMC 规模第8章 注意力机制text/09-ch08.txt:1412(搜「238 766」)
23 个位置的编号串第8章 注意力机制text/09-ch08.txt:1441(搜「784, 720, 5709」)
三张牌第8章 注意力机制text/09-ch08.txt:1400(搜「同时携带三种编码」)
词嵌入的初始化约定第8章 注意力机制text/09-ch08.txt:1569(搜「按原始 Transformer 的约定」)
位置无感第8章 注意力机制text/09-ch08.txt:1564(搜「对位置无感」)
正余弦位置编码第8章 注意力机制text/09-ch08.txt:1628(搜「正余弦位置编码」) · text/09-ch08.txt:1673(搜「频率不同」)
组块四动作第8章 注意力机制text/09-ch08.txt:1747(搜「每个组块的结构」)
加与规范第8章 注意力机制text/09-ch08.txt:1767(搜「做两件事」)
Pre/Post-LN 思考题第8章 注意力机制text/09-ch08.txt:1792(搜「Pre-LN」)
逐位前馈第8章 注意力机制text/09-ch08.txt:1803(搜「核大小为 1」)
训练设定与 0.66485第8章 注意力机制text/09-ch08.txt:1947(搜「AdamW」) · text/09-ch08.txt:2020(搜「0.66485」)
欠拟合的解释第8章 注意力机制text/09-ch08.txt:2007(搜「容易欠拟合」)
预测与热图第8章 注意力机制text/09-ch08.txt:2031(搜「电脑怎么录像」) · text/09-ch08.txt:2122(搜「关联紧密」)

Footnotes

  1. 出处:「第8章 注意力机制」第 1363 段(text/09-ch08.txt:1363,搜「哪些花可以全年开放」)。原文:下面三句话中,A 和 C 在语义上更接近,但若仅按字面重合度判断,A 看起来反而最像 B;文本语义匹配属于 NLP 的核心基础任务,信息检索、问答系统、文本蕴含等都会用到它。 2

  2. 出处:「第8章 注意力机制」第 1365 段(text/09-ch08.txt:1365,搜「意思上”判断两句话是否一致」)。原文:语义匹配的目标恰好就是让模型从「意思上」判断两句话是否一致——A 与 B 应输出 0、A 与 C 应输出 1。

  3. 出处:「第8章 注意力机制」第 1367 段(text/09-ch08.txt:1367,搜「抛开前两节」)。原文:本节抛开前两节「LSTM + 自注意力」的混搭,改用纯自注意力的 Transformer 来完成这一任务;由于匹配本质上是一个二分类问题,仅使用 Transformer 的编码器部分即可。

  4. 出处:「第8章 注意力机制」第 1412 段(text/09-ch08.txt:1412,搜「238 766」)。原文:实验使用 LCQMC(Large-scale Chinese Question Matching Corpus)——一个来自百度知道领域的中文问题匹配数据集;规模为训练集 238 766 条、验证集 8 802 条、测试集 12 500 条。

  5. 出处:「第8章 注意力机制」第 1419 段(text/09-ch08.txt:1419,搜「第三列是标签」)。原文:每条样本由三列组成——前两列是两句中文文本,第三列是标签(1 = 相似、0 = 不相似)。

  6. 出处:「第8章 注意力机制」第 1424 段(text/09-ch08.txt:1424,搜「字符级切分」)。原文:本实验采用字符级切分(每个汉字视为一个词),对应词表与上一节 IMDB 实验完全不同。

  7. 出处:「第8章 注意力机制」第 1391 段(text/09-ch08.txt:1391,搜「[CLS]」)。原文:先把两个句子按 [CLS] + 句子 A + [SEP] + 句子 B + [SEP] 的模板拼接成一句话;[CLS] 是 BERT 风格的「句子特征位」,编码后它的向量代表整段语义;[SEP] 是分隔符。

  8. 出处:「第8章 注意力机制」第 1398 段(text/09-ch08.txt:1398,搜「一句话的二分类」)。原文:这样一来,「两句相似度判断」就转化成了「一句话的二分类」。

  9. 出处:「第8章 注意力机制」第 1441 段(text/09-ch08.txt:1441,搜「784, 720, 5709」)。书里打印的示例:[101, 784, 720, 5709, 671, 2399, 1724, 2108, 6963, 2458, 102, 784, 720, 5709, 671, 2399, 1724, 2108, 6963, 3221, 2458, 4638, 102],分段标记 [0×11, 1×12]。

  10. 出处:「第8章 注意力机制」第 1435 段(text/09-ch08.txt:1435,搜「未登录字」)。原文:将文本按词表转换为 ID 序列,未登录字用 [UNK] 代替。

  11. 出处:「第8章 注意力机制」第 1492 段(text/09-ch08.txt:1492,搜「按最大长度截断」)。原文:为了能成批处理变长样本,需要在整理函数里完成两件事——一是按最大长度截断;二是对短样本在尾部补 [PAD] (ID 设为 0)。

  12. 出处:「第8章 注意力机制」第 1545 段(text/09-ch08.txt:1545,搜「[32, 52]」)。原文:第一个张量 [32, 52] 是 input_ids,32 为批大小、52 为本批次的最大长度(不足者末尾补 0);第二个张量 [32, 52] 是 segment_ids;最后 [32] 是标签向量。

  13. 出处:「第8章 注意力机制」第 1564 段(text/09-ch08.txt:1564,搜「对位置无感」)。原文:自注意力本身对位置无感(同一组词元打乱顺序结果相同),Transformer 显式注入位置编码补回顺序信息。

  14. 出处:「第8章 注意力机制」第 1400 段(text/09-ch08.txt:1400,搜「同时携带三种编码」)。原文:每个字符同时携带三种编码——输入编码(词嵌入)刻画字符自身的语义;位置编码补回顺序信息;分段编码用 0/1 标记字符属于第一还是第二句话;三种编码按位置相加得到最终的字符表示。

  15. 出处:「第8章 注意力机制」第 1569 段(text/09-ch08.txt:1569,搜「按原始 Transformer 的约定」)。原文:按原始 Transformer 的约定,词嵌入用均值 0、标准差 1/√emb_size 的正态分布初始化,并在前向时乘上 √emb_size,让词向量的范数与位置编码大致匹配,便于后续相加。

  16. 出处:「第8章 注意力机制」第 1701 段(text/09-ch08.txt:1701,搜「再经一次层规范化和 Dropout」)。原文:把三种编码按位置相加,再经一次层规范化和 Dropout 得到最终输入向量——层规范化稳定数值分布、Dropout 提供轻度正则化。

  17. 出处:「第8章 注意力机制」第 1628 段(text/09-ch08.txt:1628,搜「正余弦位置编码」)。原文:最经典的方案是正余弦位置编码——维度 D 的位置编码每一维由正/余弦函数交替组成,频率从低到高分布在多个尺度上;偶数维用 sin、奇数维用 cos,频率随 i 的增大呈指数衰减。

  18. 出处:「第8章 注意力机制」第 1673 段(text/09-ch08.txt:1673,搜「频率不同」)。原文:每一维都是一条频率不同的正弦曲线,整体取值落在 [−1, 1];频率梯度的设计让低维(高频)捕捉细粒度位置、高维(低频)捕捉粗粒度位置,给注意力提供丰富的相对位置线索。

  19. 出处:「第8章 注意力机制」第 1657 段(text/09-ch08.txt:1657,搜「冻结梯度」)。原文:位置编码是确定性变换,不参与训练——封装为算子并冻结梯度。

  20. 出处:「第8章 注意力机制」第 1747 段(text/09-ch08.txt:1747,搜「每个组块的结构」)。原文:Transformer 编码器是若干组块的堆叠,每个组块的结构是——多头自注意力、加与规范化、逐位前馈、加与规范化;两条残差路径让信息可以越过任何一层直接前向/后向传递,是深层 Transformer 能训得稳的关键。

  21. 出处:「第8章 注意力机制」第 1767 段(text/09-ch08.txt:1767,搜「做两件事」)。原文:加与规范(Add&Norm)层做两件事——把子层输出与残差相加(提供跨层直通的梯度通道),再做一次层规范化稳定数值分布;两个机制配合,让 Transformer 能够堆叠到几十甚至上百层而不爆梯度;实现上还在残差路径里加一次 Dropout。 2

  22. 出处:「第8章 注意力机制」第 1803 段(text/09-ch08.txt:1803,搜「核大小为 1」)。原文:逐位前馈网络(FFN)是两层带 ReLU 激活的全连接,独立作用在序列里的每个位置上——可以视为「核大小为 1」的卷积,做的是非线性特征重映射,而非跨位置混合。

  23. 出处:「第8章 注意力机制」第 1811 段(text/09-ch08.txt:1811,搜「4𝐷」)。原文:中间维度通常取 4D,先升维放大表达力,再降维回原始尺寸。

  24. 出处:「第8章 注意力机制」第 1792 段(text/09-ch08.txt:1792,搜「Pre-LN」)。这是书里的思考题:Transformer 中层规范化相对于残差路径的位置有两种主流写法——Pre-LN 为 H = X + f(LN(X)),Post-LN 为 H = LN(f(X) + X);很多研究表明,Pre-LN 更容易训练,但 Post-LN 上限更佳。 2

  25. 出处:「第8章 注意力机制」第 1874 段(text/09-ch08.txt:1874,搜「5 个部分」)。原文:整体结构包含 5 个部分——词嵌入、分段编码、位置编码、Transformer 堆叠和最后的二分类头。

  26. 出处:「第8章 注意力机制」第 1947 段(text/09-ch08.txt:1947,搜「AdamW」)。原文:损失取交叉熵、优化器用 AdamW(学习率 5×10⁻⁵、对 bias 与 LayerNorm 权重关闭权重衰减),训练 3 个回合并保留验证集准确率最高的快照,梯度截断 1.0;模型为 1 个组块、4 个头,词表 21 128。

  27. 出处:「第8章 注意力机制」第 2020 段(text/09-ch08.txt:2020,搜「0.66485」)。测试输出 Accuracy: 0.66485。

  28. 出处:「第8章 注意力机制」第 2007 段(text/09-ch08.txt:2007,搜「容易欠拟合」)。原文:损失曲线整体平稳下降,但训练曲线后期较缓——一方面本节的 Transformer 仅堆 1 个 block、参数量小;另一方面 LCQMC 问句长度有限,从零训练时容易欠拟合;本节着重展示流程,更高精度通常需要预训练 BERT 等大模型来初始化。 2 3

  29. 出处:「第8章 注意力机制」第 2031 段(text/09-ch08.txt:2031,搜「电脑怎么录像」)与第 2056 段(text/09-ch08.txt:2056,搜「预测的label标签」)。预测例子:text_a = 「电脑怎么录像?」、text_b = 「如何在计算机上录视频」,输出标签 1;书里这一次只打印了预测标签,没有打印这 20 个位置的编号串。 2

  30. 出处:「第8章 注意力机制」第 2122 段(text/09-ch08.txt:2122,搜「关联紧密」)。原文三条:[CLS] 与「计」「视」「像」「何」等关键字关联紧密,因为 [CLS] 承担汇总语义的职责;第二句的「计」「视」又与第一句的「录像」「电脑」等关联紧密——这正是模型学到的「跨句子语义对齐」的表现;同一句内则呈现「视」和「频」这类紧密词组的局部关联。

  31. 出处:「第8章 注意力机制」第 2023 段(text/09-ch08.txt:2023,搜「从 1 增加到 2、4、6」)。这是动手练习 8.7:把组块数从 1 增加到 2、4、6,观察更深的编码器是否能进一步提升准确率,同时记录显存和训练时长的变化。

  32. 出处:「第8章 注意力机制」第 1693 段(text/09-ch08.txt:1693,搜「两组不同位置的正余弦位置编码做内积」)与第 1699 段(text/09-ch08.txt:1699,搜「更好的位置编码方式」)。两道思考题:取两组不同位置的正余弦位置编码做内积,验证能否仅从内积推断出位置间的相对距离;总结基于三角函数的位置编码的优缺点,并思考更好的位置编码方式。

  33. 出处:「第8章 注意力机制」第 1764 段(text/09-ch08.txt:1764,搜「直接调用 PyTorch 内置」)。原文:这里直接调用 PyTorch 内置的 nn.MultiheadAttention——它与第 8.2.1.3 节自实现的版本等价,但掩码改用布尔 key_padding_mask 传入(True 表示该位置需要被屏蔽,语义与手写版相反)。