跳到主要内容

先挑再算 — 八个词的权重里 great 和 awesome 最高

这一章讲三件事: 「一视同仁地取平均」的毛病怎么治;打分怎么打、补齐的位置怎么办; 以及把「谁来挑」从外部交给序列自己之后,长出来的两个变体。

它在全书链条里的位置: 第 11 章把文本任务的全部工程细节走完了, 但收尾那个「掩码平均汇聚」留下了一个毛病。这一章治这个毛病; 治好后得到的零件,第 16 章会用它搭出完整的 Transformer 编码器。

需要的基础: 第 11 章的影评实验;第 05 章的 Softmax(把一组分数归一化成总和为 1 的权重)。

1. 先看现象:「great」和「the」分得一样多

回看第 11 章那条流水线:双向读一遍,得到每个时刻的隐状态, 然后对所有时刻取平均,压成一个句向量去分类。

这个取平均一视同仁:每个词分到的份额完全一样。 而情感分类里,词和词显然不一样重要——this great science fiction film is really awesome 这句里,定调子的是 greatawesome,不是 thisis1

书里的补救:在双向 LSTM 的输出之后,再叠一层「先挑再算」2:

一次注意力计算,就两步
────────────────────────────────────────────────
第一步 沿序列各位置算一份注意力分布
——每个位置一个数,加起来等于 1
第二步 用这份分布对各位置的表示做加权平均
——权重高的位置,掺进来的就多
────────────────────────────────────────────────
这套机制就叫注意力;那份分布也叫注意力权重

第一步的关键问题是「分布从哪儿来」3。 要从 N 个输入向量里挑出与当前任务最相关的部分,需要一个任务相关的「探针」—— 这个探针叫查询向量;再借助一个打分函数,度量每个输入向量与它的相关程度3

书里举的直觉例子:对 The movie is nice 做情感分析, 假想有一个代表「情感」的查询词,nice 应该拿到更高的权重4。 书里同时点明:这个查询词只是示意, 实际实现里查询向量是一组随机初始化的可学习参数,在训练过程中自己学出来5

全章主走查:this great science fiction film is really awesome
═══════════════════════════════════════════════════════════════════
§2 ① 打分:两种写法,各给八个词算一个分数
§3 ② 补齐的位置:先置成一个极小的负数
§4 ③ 八个权重:great 0.2561、awesome 0.1771、this 0.0935
§5 ④ 三组成绩:0.86064 / 0.86488 / 0.86936
§6 ⑤ 每个位置自己当查询 + 三组投影 + 除以维度的平方根
§7 ⑥ 切成 8 份各看各的:多头
§8 ⑦ 再并排:0.86520
═══════════════════════════════════════════════════════════════════

2. 打分怎么打:两种写法

打分函数输入「一个词的向量 + 查询向量」,输出一个数。书里的实现给两种写法。

写法一,先过一层非线性再打分(书里叫加性模型)6:

分数 = v · tanh(X·W + q·U)
────────────────────────────────────────────────
W、U、v 都是可学习参数
词的向量和查询向量各做一次线性映射,相加,
过一道非线性,再压成一个数

写法二,直接做内积(书里叫点积模型)7:

分数 = X · q
────────────────────────────────────────────────
词的向量与查询向量直接做内积
内积在第 08 章见过:对应维度相乘再相加,
两个向量越「同向」,这个数越大

两种写法各有各的账8: 点积模型只引入查询向量这一组参数,计算量随维度线性涨; 加性模型多三组参数,计算量随维度的平方涨。 点积还能直接套用矩阵乘法的底层加速,工程上更高效8

书里还留了一道思考题,值得记下:写法一里「q·U」这项, 既然 q 本身就是可学习参数,完全可以和 U 合并成一个可学习向量—— 请读者对比两种实现的参数量、训练稳定性和表达力差异9这说明书里的写法照搬的是主书公式,不是参数最省的写法。

3. 补齐的位置怎么办:先置成一个极小的负数

第 11 章的老问题又来了:同一批的句子长短不一,短的要补占位符。 这些补出来的位置不该参与打分——否则它们也会分到权重,污染分布10

办法和打分本身配合得很妙:把补齐位置的分数先改成一个极小的负数(比如 −10⁹), 再归一化10:

句子1(补了 7 个占位符)的分数:
0.1 0.2 0.4 0.6 −10⁹ −10⁹ −10⁹ −10⁹ −10⁹ −10⁹ −10⁹
↓ 归一化(第 05 章那道指数归一)
0.196 0.217 0.264 0.323 0 0 0 0 0 0 0

为什么有效? 归一化的第一步是取指数:e 的 −10⁹ 次方等于 0。 所以补齐位置的权重自然变成 0,等价于把它们从分布里掩蔽出去; 剩余位置的权重按原始分数自动重新归一化,几乎不受影响11

这套「先改分数、再归一化」的掩蔽手法,第 16、20 章还会用到两次。

4. 主走查:八个词的权重印出来

模型四段:嵌入层 → 双向 LSTM → 注意力层 → 线性分类12。 前两类直接复用第 11 章的实现,注意力层就是「打分、掩蔽、归一化、加权」四步13

训练与第 11 章对齐:每步挪 0.001、训 2 轮、按模截断 1.0、保留验证集最优快照14

训完之后,书里做了一件这一章最值钱的事: 把 this great science fiction film is really awesome 喂进去, 把每个词的权重原样打印了出来15:

词 this great science fiction film is really awesome
权重 0.0935 0.2561 0.0858 0.1134 0.0907 0.0906 0.0928 0.1771

读这一行数: great 拿走近四分之一,awesome 拿走近六分之一; 两个情感色彩最鲜明的词合计分走 0.43——而八个词平均分的话每个只有 0.125。 书里的结论是:这验证了注意力机制确实学到了与情感分类任务相关的关键位置16

这就是「先挑再算」的全部:不是换掉第 11 章那条流水线, 而是把最后那步「平均」换成「按权重掺」。

5. 三组成绩并排

同一份影评数据、同一个双向 LSTM,三种收尾方式17:

收尾方式测试准确率
不加打分(第 11 章的掩码平均)0.86064
加性打分0.86488
点积打分0.86936

书里把结论归纳成两点18:

  1. 注意力带来稳定增益——0.86064 → 0.86488 → 0.86936, 「先按重要性筛选信息再分类」确实有效;
  2. 点积稍优于加性——在本数据集和超参数下点积略高,且点积写法本身计算更高效。

这两个提升的绝对值不大(半到一个百分点),但它们来自同一个改动: 只换收尾那一步,前面一个字没动。

6. 让序列自己当查询:自注意力与那三组投影

前五节的查询向量都是「外面来的」——一个可学习的参数,对所有位置一视同仁地探。 这一节把查询的来源改到序列自身:让每个位置自动充当查询, 得到表达力更强的自注意力——每个位置互相看、自己给自己当查询的注意力形式19

「每个位置自己当查询」是什么意思? 还是 The movie is nice: 要算 movie 这个词的新表示,就用 movie 自己当查询, 对句中所有词打分、加权平均——得到的是「融合了全序列信息的 movie」20。 每个位置都这么做一遍,任意两个词之间都只有一步距离, 不再像第 10、11 章那样沿时间一步步传21

最朴素的自注意力直接用词的向量当查询,全程没有任何可学习参数,表达力受限22工程上的做法是加三组可学习的投影——同一个词, 按三种不同的「角色」各投一次23:

查询(Q) 负责发起匹配 ——「我在找什么」
键(K) 负责被匹配 ——「我身上有什么可被找到」
值(V) 负责被加权 ——「找到我之后,取走什么」
────────────────────────────────────────────────
分数 = Q·Kᵀ / √D ← 先打分,除以维度的平方根
输出 = 归一化(分数) · V

「除以维度的平方根」这一步(书里叫缩放点积)必须讲清为什么。 若查询和键的每个分量近似「均值 0、方差 1」的独立随机变量, 那么它们的内积是 D 项之和——均值还是 0,方差却涨成 D。 维度越高,内积的散布越大,归一化越容易落进压平区、梯度被压扁; 除以 √D 之后方差被拉回到 1 附近,可有效保持梯度、加快收敛24

「每个位置自己当查询、自己当键、自己当值」这件事,行话叫自注意力(self-attention); 那三组投影分别叫查询、键、值,合称 QKV。

7. 切成 M 份各看各的:多头

单组投影只能从一个角度衡量词与词的关系。 借鉴卷积「多通道」的思路:并行使用多组独立的 QKV 投影, 每组叫一个头,再把它们的输出拼起来——这就是多头自注意力25

每个头独立完成一次汇聚,相当于从不同子空间观察输入; 拼接后再过一层线性投影做信息融合26

工程上为简洁,通常把特征维平均切 M 份(每头一份)、输出维与输入维相同—— 这样多头机制不改变张量形状27这时要补一句:上一节说的「除以维度的平方根」, 切成 M 份之后,那个维度指的是每个头的维度。

实现上有一个值得记住的技巧:不是循环 M 次, 而是先做一次完整的 QKV 投影,再把特征维「切片」成 M 份、 把头维合并进批维——M 个头变成更大的一批,一次矩阵乘法全部算完28

书里的验证例子:两个序列,长度分别是 1 和 2,每个词 4 维,切 2 个头29:

注意力权重(4 个数,对应 2 条序列 × 2 个头)
────────────────────────────────────────────────
序列1(真实长度 1) [1, 0] [1, 0]
序列2(真实长度 2) [0.519, 0.481] [0.500, 0.500]
────────────────────────────────────────────────
序列1 只有一个真位置:权重 100% 给自己,补齐位置是 0
序列2 两个真位置:两个头一个略偏前,一个几乎均分

这一小格矩阵同时验证了两件事:掩蔽确实把补齐位置压成了 0; 两个头确实在看不同的东西——否则四行应该一模一样。

8. 再并排一次:多头版 0.86520

把多头自注意力插进第 11 章那条流水线(嵌入 → 双向 LSTM → 多头自注意力 → 平均汇聚 → 线性), 8 个头,其余配置与前几节严格一致30

成绩:0.8652031。四组并排:

收尾方式测试准确率
不加打分0.86064
加性打分0.86488
点积打分0.86936
多头自注意力(8 头)0.86520

多头版介于加性和点积之间——不是最高。 书里自己给了解释:单层多头自注意力的优势在本数据集和参数设置下并没有完全释放; 它以思考题的形式进一步指出,多头自注意力比加性/点积多出大量可学习参数, 通常需要更大数据量、更长训练时间才能完全发挥优势32

这是一个诚实的实验:机制更强,不等于在小考场上立刻赢。

但这三个零件——自注意力、QKV、多头——到这里就齐了。 把它们从「叠在 LSTM 后面」改成「单独挑大梁」,配上位置信息与逐层堆叠, 就是第 16 章那个完整的 Transformer 编码器。那个纯注意力的完整搭法,第 16 章第 1 节讲。

9. 作者的判断与证据

书里给了证据的:

  • 八个词的权重——实际打印,great 与 awesome 最高15;
  • 三组成绩并排——0.86064 / 0.86488 / 0.86936,同一数据同一主干17;
  • 多头版 0.86520 介于加性与点积之间——实际打印31;
  • 掩蔽把补齐位置压成 0、两个头看的不同——验证例子的权重矩阵29

属于作者解读的:

  • 「注意力学到了与情感相关的关键位置」——依据是那行权重; 和第 11 章那张热图一样,这是「机制在按预期运转」的存在性证据16;
  • 「多头优势未完全释放」——书里的自我解释,未做加大数据量的验证32

判断(我们的,不是书里的):这一章最该带走的是第 4 节那行权重,而不是第 8 节的名次。 名次会随数据和调参翻转,而「权重打印出来、指向情感词」这件事展示的是 注意力机制的读法:它是一种可以打开来看的加权如果错,会错在: 如果读者只需要成绩,那这一章的结论确实只是「点积多涨零点几个点」。 判据是:读者能不能合上文档后,自己读出一个新模型的注意力权重在说什么。

10. 边界与局限

这一章没覆盖的:

没讲什么依据 / 为什么值得知道
双线性、缩放点积之外的其他打分函数书里留成了动手练习33
只用自注意力、去掉 LSTM书里留成了练习,并提示序列位置信息是关键34——第 16 章正是这么做的
框架内置的多头算子书里把「换内置版并对齐掩码语义」留成了练习,并提醒两边 True/False 语义恰好相反35
位置信息这一章的自注意力对位置无感——第 16 章第 5 节专门解决

出门会撞见的名字:

  • attention / 注意力权重(attention weights) —— 第 1 节那两步;
  • query / key / value(QKV) —— 第 6 节那三组投影;
  • scaled dot-product attention(缩放点积注意力) —— 第 6 节那个除以 √D 的版本;
  • multi-head attention(MHA/MHSA) —— 第 7 节那一版;框架里 nn.MultiheadAttention35;
  • self-attention(自注意力) —— 查询来自序列自身这一族。

11. 可带走的

  1. 平均汇聚一视同仁,情感词和虚词分得一样多——这是它唯一的毛病;
  2. 注意力就两步:先打分归一化成权重,再按权重加权平均;
  3. 查询向量不是人给的词,是训练出来的参数;
  4. 打分两种写法:加性先过非线性,点积直接内积;点积参数少、还能吃矩阵乘法加速;
  5. 补齐位置先置成极小负数,归一化后权重自然为 0——这套手法后面还要用两次;
  6. 权重可以打印出来读:great 0.2561、awesome 0.1771,两个词分走 0.43;
  7. 让每个位置自己当查询,就是自注意力——任意两个词之间只有一步;
  8. QKV 是同一个词的三种角色:找什么、有什么可找、取走什么;
  9. 打分要除以维度的平方根——不除,内积的散布随维度涨,归一化落进压平区;
  10. 多头是切 M 份各看各的;切成 M 份后,那个维度指每个头的维度;
  11. 机制更强不等于小考场上立刻赢——多头版 0.86520 不是最高,书里自己解释了为什么。

12. 原文地图

主题原书章原文位置
两步与一视同仁第8章 注意力机制text/09-ch08.txt:172(搜「先沿序列各位置算出一份注意力分布」) · text/09-ch08.txt:190(搜「一视同仁」)
查询向量第8章 注意力机制text/09-ch08.txt:176(搜「任务相关的“探针”」)
加性与点积打分第8章 注意力机制text/09-ch08.txt:263(搜「加性打分函数」) · text/09-ch08.txt:323(搜「渐近复杂度」)
补齐位置的掩蔽第8章 注意力机制text/09-ch08.txt:366(搜「极小负数」)
八个词的权重第8章 注意力机制text/09-ch08.txt:663(搜「0.2561122」)
三组成绩第8章 注意力机制text/09-ch08.txt:568(搜「0.86488」)
自注意力第8章 注意力机制text/09-ch08.txt:691(搜「每个位置自动充当查询」)
QKV 与缩放第8章 注意力机制text/09-ch08.txt:767(搜「查询负责发起匹配」) · text/09-ch08.txt:794(搜「缩放因子」)
多头第8章 注意力机制text/09-ch08.txt:894(搜「每组叫一个头」) · text/09-ch08.txt:953(搜「效率太低」)
验证例子第8章 注意力机制text/09-ch08.txt:1147(搜「0.51904374」)
0.86520第8章 注意力机制text/09-ch08.txt:1282(搜「0.86520」) · text/09-ch08.txt:1287(搜「介于二者之间」)

Footnotes

  1. 出处:「第8章 注意力机制」第 190 段(text/09-ch08.txt:190,搜「一视同仁」)。原文:第 6.4 节的文本分类里,双向 LSTM 输出后直接对所有时刻做平均得到聚合表示;这种做法虽然能跑通,但显然「一视同仁」——情感分类任务中,并非所有词都同等重要。

  2. 出处:「第8章 注意力机制」第 192 段(text/09-ch08.txt:192,搜「再叠一层注意力机制」)。原文:本节在第 6.4 节双向 LSTM 的输出后再叠一层注意力机制,让模型自动从隐状态中挑出真正对分类有用的信息。

  3. 出处:「第8章 注意力机制」第 172 段(text/09-ch08.txt:172,搜「先沿序列各位置算出一份注意力分布」)与第 176 段(text/09-ch08.txt:176,搜「任务相关的“探针”」)。原文:一次注意力计算可以拆成两步——先沿序列各位置算出一份注意力分布,再用它对各位置的表示做加权平均,得到聚合表示;要从 N 个输入向量里挑出与当前任务最相关的部分,需要一个任务相关的「探针」——查询向量(Query Vector),再借助打分函数度量每个输入向量与查询向量的相关性。 2

  4. 出处:「第8章 注意力机制」第 194 段(text/09-ch08.txt:194,搜「nice 应该获得更高的权重」)。原文:以 The movie is nice 为例进行情感分析,直觉上 nice 应该获得更高的权重;假设引入一个与情感任务相关的查询词 sentiment,用它的向量作为查询向量。

  5. 出处:「第8章 注意力机制」第 199 段(text/09-ch08.txt:199,搜「只是一个用于说明」)。这是笔记框:图里的 sentiment 只是一个用于说明「查询向量与任务相关」的示意例子;实际实现中,查询向量 q 通常直接作为一组随机初始化的可学习参数,在训练过程中自适应学习。

  6. 出处:「第8章 注意力机制」第 263 段(text/09-ch08.txt:263,搜「加性打分函数」)。原文:加性打分函数为 s(X, q) = vᵀ tanh(XW + qᵀU),其中 W、U 和 v 都是可学习参数;查询向量使用均匀分布随机初始化(第 286 段,text/09-ch08.txt:286,搜「均匀分布随机初始化」)。

  7. 出处:「第8章 注意力机制」第 318 段(text/09-ch08.txt:318,搜「点积版打分函数」)。原文:对于输入张量和一个可学习查询向量,点积打分写作 s(X, q) = Xq。

  8. 出处:「第8章 注意力机制」第 323 段(text/09-ch08.txt:323,搜「渐近复杂度」)。原文:从渐近复杂度看点积模型更低(O(LD),加性模型为 O(LD²)),且点积模型可以直接套用矩阵乘法 Xq,能更好利用底层 GEMM 内核,因而工程实现上更高效。 2

  9. 出处:「第8章 注意力机制」第 315 段(text/09-ch08.txt:315,搜「合并为单一可学习」)。这是书里的思考题:上面的加性打分函数直接照搬主书公式,将 q 和 U 分开维护;但既然 q 本身就是可学习参数,qᵀU 完全可以合并为单一可学习向量;请对比两种实现的参数量、训练稳定性和表达力差异。

  10. 出处:「第8章 注意力机制」第 366 段(text/09-ch08.txt:366,搜「极小负数」)。原文:[PAD] 位置不应参与注意力计算,否则会污染分布;常用做法是把这些位置的打分先置为一个极小负数(比如 −1e9),Softmax 后它们的权重会自然衰减到 0。 2

  11. 出处:「第8章 注意力机制」第 379 段(text/09-ch08.txt:379,搜「重新归一化」)。原文:[PAD] 位置的 Softmax 输出几乎为 0,等价于把它们从分布里「掩蔽」出去;剩余位置的概率会按原始分数自动重新归一化,几乎不被填充位置影响。

  12. 出处:「第8章 注意力机制」第 234 段(text/09-ch08.txt:234,搜「按数据流向可拆为四块」)。四块:嵌入层、LSTM 层(双向)、注意力层、线性层。

  13. 出处:「第8章 注意力机制」第 413 段(text/09-ch08.txt:413,搜「四步串成完整的注意力层」)。原文:把「打分、掩码、Softmax、加权」四步串成完整的注意力层,通过开关在加性和点积模型之间切换。

  14. 出处:「第8章 注意力机制」第 508 段(text/09-ch08.txt:508,搜「保留验证集准确率最高的快照」)。设定:交叉熵损失、Adam 优化器(学习率 0.001),训练 2 个回合并保留验证集准确率最高的快照,梯度截断 1.0。

  15. 出处:「第8章 注意力机制」第 663 段(text/09-ch08.txt:663,搜「0.2561122」)。输入文本 this great science fiction film is really awesome;打印的注意力权重为 [[0.09353013, 0.2561122, 0.0858178, 0.1134422, 0.09066799, 0.09060092, 0.09276449, 0.17706427]]。 2

  16. 出处:「第8章 注意力机制」第 669 段(text/09-ch08.txt:669,搜「最高的权重」)。原文:可以清楚看到 great 和 awesome 两个情感色彩鲜明的词被赋予了最高的权重,这也验证了注意力机制学到了与情感分类任务相关的关键位置。 2

  17. 出处:「第8章 注意力机制」第 568 段(text/09-ch08.txt:568,搜「0.86488」)与第 620 段(text/09-ch08.txt:620,搜「0.86936」)。加性版测试输出 Accuracy: 0.86488,点积版 0.86936;双向 LSTM 不加注意力的 0.86064 见第 623 段的并排比较。 2

  18. 出处:「第8章 注意力机制」第 623 段(text/09-ch08.txt:623,搜「稳定增益」)。原文两点:一,注意力机制带来稳定增益——双向 LSTM 单独跑得到 0.86064,叠加加性注意力提升到 0.86488,叠加点积注意力进一步提升到 0.86936;二,点积稍优于加性——在本数据集和超参数下,点积注意力的测试集准确率略高,且点积写法本身计算更高效。

  19. 出处:「第8章 注意力机制」第 691 段(text/09-ch08.txt:691,搜「每个位置自动充当查询」)。原文:上一节的注意力机制依赖一个外部查询向量;本节把查询的来源从「外部」改到「序列自身」——让每个位置自动充当查询,得到表达力更强的自注意力机制。

  20. 出处:「第8章 注意力机制」第 714 段(text/09-ch08.txt:714,搜「要计算 movie 的上下文表示」)。原文:要计算 movie 的上下文表示,就用 movie 本身作为查询向量,对句中所有词算注意力分布,再加权平均得到融合了全序列信息的 movie 表示。

  21. 出处:「第8章 注意力机制」第 696 段(text/09-ch08.txt:696,搜「局部编码」)。原文:CNN 和 RNN 处理变长序列时本质上属于局部编码——CNN 的视野上限由卷积核大小决定,RNN 受梯度衰减和容量瓶颈所限;自注意力从设计上就直面长程依赖,把序列中每个元素都视为全连接图上的一个节点,节点间的连接权重由注意力机制根据当前内容动态计算得到。

  22. 出处:「第8章 注意力机制」第 764 段(text/09-ch08.txt:764,搜「没有引入任何可学习参数」)。原文:前面的简单自注意力直接以输入元素自身作为查询,全程没有引入任何可学习参数,表达力受限。

  23. 出处:「第8章 注意力机制」第 767 段(text/09-ch08.txt:767,搜「查询负责发起匹配」)。原文:工程上普遍采用查询-键-值(QKV)范式——把输入序列分别通过三个独立的线性映射,得到查询、键、值三组表示;查询负责发起匹配、键负责被匹配、值负责被加权。

  24. 出处:「第8章 注意力机制」第 794 段(text/09-ch08.txt:794,搜「缩放因子」)。原文:关于 √D 缩放因子的来源——若 Q、K 的分量近似为均值 0、方差 1 的独立随机变量,则它们的内积均值为 0、方差为 D;维度越高,方差越大,Softmax 容易落入饱和区导致梯度被压扁;除以 √D 后方差被拉回到 1 附近,可有效保持梯度,加快收敛。

  25. 出处:「第8章 注意力机制」第 894 段(text/09-ch08.txt:894,搜「每组叫一个头」)。原文:QKV 自注意力虽然引入了可学习的投影矩阵,但单组投影只能从一个角度衡量元素之间的关系;借鉴卷积「多通道」的思路,可以并行使用多组独立的 QKV 投影,每组叫一个头(head),再把它们的输出拼起来——这就是多头自注意力(MHSA)。

  26. 出处:「第8章 注意力机制」第 897 段(text/09-ch08.txt:897,搜「不同子空间」)。原文:每个头独立完成一次特征汇聚,相当于从不同子空间观察输入;拼接后再过一层线性投影做信息融合,得到最终输出。

  27. 出处:「第8章 注意力机制」第 950 段(text/09-ch08.txt:950,搜「平均切」)。原文:工程上为简洁起见,常令单头维度 = 总维度/头数、输出维与输入维相同,这样多头机制不会改变张量形状。

  28. 出处:「第8章 注意力机制」第 953 段(text/09-ch08.txt:953,搜「效率太低」)。原文:直接循环 M 次效率太低;常见做法是先做一次完整的 Q/K/V 投影,再把特征维「切片」成 M 头并把头维与批维合并,让 M 个头变成更大的批一起做矩阵乘法。

  29. 出处:「第8章 注意力机制」第 1117 段(text/09-ch08.txt:1117,搜「2 × 2 × 4」)与第 1147 段(text/09-ch08.txt:1147,搜「0.51904374」)。输入是形状 2 × 2 × 4 的张量(两个序列,长度分别为 1 和 2,每个词 4 维),切 2 个头;打印的注意力权重中,序列1 为 [1, 0],序列2 为 [0.519, 0.481] 与约 [0.500, 0.500];书里指出:权重输出中为 0 的位置就是被掩码屏蔽的 [PAD] 位置。 2

  30. 出处:「第8章 注意力机制」第 1232 段(text/09-ch08.txt:1232,搜「与第8.1.3.1节保持一致」)。设定:多头自注意力 inputs_size = 256、heads_num = 8,双向 LSTM 沿用第 6.4 节;损失、优化器与第 8.1.3.1 节保持一致以保证可比性。

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

  32. 出处:「第8章 注意力机制」第 1287 段(text/09-ch08.txt:1287,搜「介于二者之间」)与第 1291 段(text/09-ch08.txt:1291,搜「更大数据量」)。原文:与加性/点积注意力相比,多头自注意力的指标介于二者之间——单层多头自注意力的优势在本数据集和参数设置下并没有完全释放,点积注意力反而是最高的;思考题指出:多头自注意力比加性/点积注意力多出大量可学习参数,通常需要更大数据量、更长训练时间才能完全发挥优势。 2

  33. 出处:「第8章 注意力机制」第 151 段(text/09-ch08.txt:151,搜「双线性」)。这是动手练习 8.1:仿照加性/点积模型的实现,再写出主书中的双线性、缩放点积等其他打分函数并横向对比。

  34. 出处:「第8章 注意力机制」第 1352 段(text/09-ch08.txt:1352,搜「仅保留多头自注意力」)。这是动手练习 8.5:把模型中的双向 LSTM 去掉,仅保留多头自注意力 + 分类头重做实验,比较准确率变化并分析原因(提示:序列位置信息)。

  35. 出处:「第8章 注意力机制」第 1303 段(text/09-ch08.txt:1303,搜「nn.MultiheadAttention」)。这是动手练习 8.4:把自写的多头算子替换成 PyTorch 内置的 nn.MultiheadAttention;书里提醒两处差异——默认输入布局不同,以及掩码语义恰好相反(内置版的 key_padding_mask 里 True 表示该位置需要被屏蔽,与本书的 valid_lens 掩码相反)。 2