第19章 注意力:让模型决定该看哪里

翻译一句话时,译文中的每个词需要的源信息并不相同。

假设源句是“那只黑猫安静地坐在窗边”。生成“黑”时,模型应重点查看颜色;生成“猫”时,应找到被描述的动物;生成“窗边”时,句首细节的重要性已经降低。如果编码器只交给解码器一个固定向量,所有名字、动作、修饰语和位置都必须挤进同一份摘要,解码器还要从中准确取回此刻所需的信息。

第 16 章末尾介绍的早期序列到序列模型正遇到了这个问题。编码器能把变长输入压成固定状态,但句子越长,细节和对应关系越容易在压缩中丢失。更合理的办法不是不断扩大最后一个状态,而是保留编码器在各个位置产生的表示,让解码器每生成一步都重新决定:现在应该看哪里?

这就是注意力机制的核心问题。它把一次性压缩改成按需读取,把“记住全部内容”和“取出当前信息”分成两个步骤。

图 1: 词袋把全部词语汇总成计数,保留出现情况却丢失顺序;静态词向量为每个词提供稠密坐标,但位置之间尚未交换信息;RNN 从左到右递推状态,保留顺序却形成长路径和压缩瓶颈;注意力保留多个候选位置,让每次 Query 按相关性重新组合动态上下文。

从一个固定摘要到一组可访问的表示

设编码器读完 \(n\) 个源 Token,得到一组状态:

\[ h_1,h_2,\ldots,h_n \]

\(h_i\) 不只是第 \(i\) 个词的静态词向量。它已经混入该位置附近或此前序列的信息。早期 seq2seq 常把最后状态 \(h_n\) 当作整句摘要,再用它初始化解码器。

注意力保留全部状态。解码器准备生成第 \(t\) 个目标 Token 时,拿当前解码状态去和每个 \(h_i\) 比较,得到一组分数。分数归一化成权重后,再对全部状态加权汇总,形成当前的上下文向量(context vector)\(c_t\)

固定摘要:源序列 -> 编码器 -> 最后状态 ----------------> 解码器每一步

动态读取:源序列 -> 编码器 -> h_1, h_2, ..., h_n
                                  ^
                                  | 每个生成步骤重新计算权重
                              解码器当前状态

生成下一词时,查询改变,权重和上下文向量也随之改变。模型不必提前猜出一个对所有目标位置都同样合适的压缩方案。

Bahdanau、Cho 与 Bengio 在神经机器翻译中使用这种联合学习的软对齐,让解码器在每一步从源状态中动态汇总信息。(Bahdanau 等 2015年) “软”意味着系统通常不是只选一个位置,而是给多个位置分配连续权重,整条路径仍可用反向传播训练。

注意力的四步数据流

无论具体公式怎样变化,一次注意力通常可以拆成四步。

  1. 提出查询:当前计算需要寻找什么?
  2. 逐项匹配:每个候选位置与查询有多契合?
  3. 归一化权重:把分数变成便于比较和汇总的权重。
  4. 加权读取:按照权重混合候选位置携带的内容。

把这四步写成一般形式。当前查询为 \(q\),第 \(i\) 个候选位置有键 \(k_i\) 和值 \(v_i\)。先计算兼容性分数:

\[ e_i=\operatorname{score}(q,k_i) \]

再用 softmax 转成权重:

\[ \alpha_i= \frac{\exp(e_i)}{\sum_{j=1}^{n}\exp(e_j)} \]

最后加权汇总 Value:

\[ c=\sum_{i=1}^{n}\alpha_i v_i \]

所有 \(\alpha_i\) 都不小于 0,并且总和为 1。某个权重较大,表示在这一次查询下,该位置的 Value 对输出贡献较多。下一次查询改变后,同一组候选会得到另一组权重。

核心机制:按当前需求读取

注意力先用 Query 与各个 Key 计算匹配分数,再把分数归一化为权重,最后按权重汇总 Value。Query 表示“现在需要什么”,Key 表示“我适合怎样被找到”,Value 表示“找到我以后实际读取什么”。权重由训练数据和当前输入动态产生,不是人工写死的查表规则。

图 2: 一次注意力读取中,Query 分别与候选位置的 Key 匹配,经 Softmax 得到权重,再按这些权重组合候选位置携带的 Value。结果通常是多个位置的信息混合,而不是只读取一个固定地址;Key 决定怎样被匹配,Value 决定实际传递什么。

一个翻译步骤怎样分配权重

下面用简化数字观察一次读取。假设模型准备生成“黑”,源序列只有三个位置:

源位置 “那只” “黑” “猫”
匹配分数 \(e_i\) 1.0 3.0 0.0
softmax 权重 \(\alpha_i\) 0.114 0.844 0.042

上下文向量不是“黑”这个词的编号,而是三个 Value 向量的加权和,其中“黑”所在位置贡献最大。这个向量再与解码器状态共同决定目标词概率。

当模型随后生成“猫”,查询已经变化。新的权重可能把“猫”位置提高,把“黑”位置保留为辅助信息。注意力由此形成一种输入相关、步骤相关的软对齐

这并不保证权重总与人的词语对齐一致。翻译可能需要组合多个源词,一个目标词也可能没有单独对应项。模型优化的是最终预测损失,不是模仿人工画出的连线。

Query、Key、Value 为什么要分开

初学者最容易把 Q、K、V 想成数据库里的三个固定字段。这个比喻有帮助,但必须知道它的边界。

在神经网络中,Query、Key 和 Value 通常都是从已有表示经过不同的可训练变换得到的。它们分开,是因为“怎样判断相关”和“相关位置要传递什么”不是同一个任务。

想象一本书的索引:目录中的关键词帮助匹配,这是 Key 的作用;读者此刻的问题是 Query;真正打开页面后读到的正文是 Value。目录词不需要保存整页内容,正文也不必长得像检索关键词。

同一个源位置可以有一个适合比较的 Key,以及一个承载详细信息的 Value。训练会共同调整生成 Query、Key、Value 的参数,使最后的任务损失下降。没有人提前规定某一维必须表示“主语”或“颜色”。

技术深潜:加性注意力怎样联合训练

在 Bahdanau 风格的编码器-解码器中,源位置表示为 \(h_i\in\mathbb{R}^{d_h}\),生成第 \(t\) 个目标词以前的解码状态为 \(s_{t-1}\in\mathbb{R}^{d_s}\)。一种加性打分写作:

\[ e_{t,i}=v_a^T\tanh( W_s s_{t-1}+W_h h_i+b_a ) \]

\(W_s\)\(W_h\) 先把两类状态投影到同一匹配空间,逐元素相加并经过非线性变换,再由 \(v_a\) 压成一个标量。对源位置维度做 softmax:

\[ \alpha_{t,i}= \frac{\exp(e_{t,i})} {\sum_{j=1}^{n}\exp(e_{t,j})} \]

当前上下文向量为:

\[ c_t=\sum_{i=1}^{n}\alpha_{t,i}h_i \]

解码器用上一目标词、原有状态和 \(c_t\) 更新状态,并预测 \(y_t\)。目标词的交叉熵损失会沿两条路径反传:一条改变被汇总的源表示,另一条改变打分网络,使以后产生不同权重。

因此,对齐不是一个独立模块先标好答案,再交给翻译器。翻译目标、编码表示和注意力打分在同一个损失下联合学习。

Luong、Pham 与 Manning 随后系统比较了多种全局和局部注意力,以及点积、双线性等打分方式。(Luong 等 2015年) 公式不同,仍共享“比较候选,再按当前需求汇总”的数据流。

softmax 做了什么,又没有做什么

softmax 把任意实数分数变成一组相对权重。给所有分数同时加上同一个常数,权重不会变化;拉大分数差距,分布会更尖锐;缩小差距,分布会更平缓。

这是一种竞争机制。一个位置权重提高时,其他位置的相对份额通常会下降。它有利于模型形成选择,却不等于强制只选择一个位置。

权重过于平缓时,许多无关信息可能混入上下文;过于尖锐时,模型可能过早锁定错误位置。实际行为由打分尺度、训练目标、数据和网络其余部分共同决定。

softmax 也不会判断内容是否真实。它只根据当前模型学到的匹配空间分配权重。一个错误但模式很强的线索,完全可能得到最高权重。

从翻译走向图像和更多信息源

注意力不要求候选一定是词。图像描述模型可以把卷积特征图的不同区域当作候选位置,生成每个词时对图像区域分配权重。Xu 等人的“Show, Attend and Tell”展示了软注意力与采样式硬注意力在图像描述中的应用。(Xu 等 2015年)

只要数据能表示成一组可读取的 Value,就可以让 Query 动态选择信息:

  • 在语音识别中,输出字符可以关注不同声学帧;
  • 在图像描述中,当前词可以关注不同空间区域;
  • 在问答中,问题表示可以关注文档中的相关片段;
  • 在记忆系统中,当前状态可以从多个记忆槽读取内容。

硬注意力每次离散选择一个或少数位置,可能节省读取量,但离散选择通常不能直接用普通反向传播穿过。软注意力对所有候选做连续加权,便于端到端训练,却需要计算并保存更多候选分数。

交叉注意力与自注意力

最初的翻译例子中,Query 来自解码器,Key 和 Value 来自编码器。两边属于不同序列,这叫作交叉注意力(cross-attention)。

如果 Query、Key、Value 都由同一条序列的表示投影得到,就是自注意力(self-attention)。每个位置都可以根据自身需求读取同一序列中的其他允许位置。

类型 Query 来自 Key、Value 来自 典型作用
交叉注意力 目标序列或另一模态 源序列或外部信息 翻译、图文融合、条件生成
自注意力 当前序列 当前序列 建立序列内部的上下文表示

自注意力不再要求一个 RNN 先把历史依次传到当前位置。两个相距很远的位置可以在一层中直接交换信息,这缩短了信息路径,也让所有位置的 Query 可以用矩阵并行计算。

但自注意力本身看见的是一组向量,不天然知道它们的先后。若没有位置表示或相对位置机制,交换两个 Token 会造成结构上的歧义。第 20 章会把位置、注意力和其他网络部件组装到一起。

技术深潜:缩放点积与掩码

点积是另一种常见匹配函数。设查询和键的维度为 \(d_k\),单个分数可以写成:

\[ e_i=\frac{q^Tk_i}{\sqrt{d_k}} \]

若向量各维数值尺度相近,维度越大,点积的波动通常越大。过大的正负分数会使 softmax 很快饱和,梯度变小。除以 \(\sqrt{d_k}\) 用来控制分数尺度。Transformer 采用的缩放点积注意力写作:(Vaswani 等 2017年)

\[ S=\frac{QK^T}{\sqrt{d_k}}+M \]

\[ A=\operatorname{softmax}(S) \]

\[ \operatorname{Attention}(Q,K,V)=AV \]

\(Q\in\mathbb{R}^{m\times d_k}\)\(K\in\mathbb{R}^{n\times d_k}\) 时,\(QK^T\) 的形状为 \(m\times n\)。每一行对应一个查询,每一列对应一个候选位置。softmax 按行进行,然后与 \(V\in\mathbb{R}^{n\times d_v}\) 相乘,得到 \(m\times d_v\) 的输出。

\(M\) 是掩码。对不允许读取的位置加入 \(-\infty\),softmax 后对应权重为 0。常见掩码有两类:

  • 填充掩码排除批处理中为了对齐长度而添加的空位置;
  • 因果掩码排除当前位置之后的未来 Token,防止训练下一个 Token 时偷看答案。

掩码必须在 softmax 以前作用于分数。若先归一化,再把部分权重直接清零,剩余权重之和将不再是 1。实际实现还要避免一整行全部被屏蔽,否则可能产生未定义数值。

注意力为何适合矩阵计算

RNN 在时间上有严格依赖:不先得到 \(h_{t-1}\),就不能计算 \(h_t\)。自注意力中,一层的所有 Query、Key、Value 都可以从上一层表示同时投影出来,全部位置对的分数也能通过矩阵乘法一起计算。

这使注意力很适合 GPU 等擅长大规模矩阵运算的硬件。并行不等于计算免费。标准自注意力要形成长度 \(T\) 的位置两两分数矩阵,元素数量随 \(T^2\) 增长。序列很长时,计算和内存都会成为瓶颈。

更重要的是,并行描述的是训练一层时的位置计算。自回归生成仍需先得到前一个 Token,才能知道下一个位置的输入。第 20 章会进一步区分并行训练和顺序生成。

注意力权重不是完整解释

注意力权重很容易画成热力图,因此常被当作模型“正在想什么”的窗口。它确实能告诉我们:在某层、某个头、某次输入下,这一步从哪些 Value 混入了较多信息。

但它不是完整的因果解释。

第一,高权重只说明混合系数大,还要看对应 Value 实际携带什么。第二,深层网络会在许多层和多个头之间反复混合,残差连接还会绕过当前注意力支路。第三,后续前馈网络和输出层可能放大、改写或抵消这次读取的结果。

因此,热力图适合提出假设和发现模式,不能单独证明模型遵循了某条人类规则。若要判断某个位置是否真正影响输出,还需要遮挡、替换、中间激活干预等更直接的因果实验。

它解决了瓶颈,也带来新失败方式

注意力让模型按需访问候选信息,但没有保证它总能找到正确位置。

  • 查询表示错误时,匹配会从起点偏离;
  • 多个候选很相似时,权重可能分散或选错;
  • 长序列带来更多干扰项,也增加位置两两计算;
  • 掩码错误会让模型读取填充内容或泄漏未来答案;
  • 没有合适位置信息时,自注意力难以区分顺序;
  • 训练数据中的虚假相关和偏见会进入匹配空间;
  • 高权重不保证被读取的内容真实、充分或适合当前任务。

注意力也不是可无限增长的长期记忆。候选内容必须先进入模型可访问的上下文,计算预算也限制了能够比较的位置数量。它改善的是信息路由方式,不是把模型变成不会遗忘、不会犯错的数据库。

从辅助模块到主体结构

早期神经机器翻译仍以循环编码器和循环解码器为主体,注意力是连接两者的信息读取模块。Luong 等人的工作展示了多种注意力结构,视觉和语音任务也证明动态选择不只适用于文本。(Luong 等 2015年; Xu 等 2015年)

下一步的问题很自然:既然注意力可以让远距离位置直接交换信息,能否不再依赖循环网络逐步传递状态?

2017 年的 Transformer 给出了有影响力的答案。它用自注意力处理序列内部交互,用交叉注意力连接编码器与解码器,再加入位置表示、前馈网络、残差连接和归一化,使整个结构能够稳定堆叠。(Vaswani 等 2017年)

注意力不是 Transformer 的全部,但它改变了序列中信息移动的路线。第 20 章将从 Token 编号开始,逐步追踪一批数据怎样经过位置、多头注意力、前馈网络和输出层,最终变成下一个 Token 的概率。

学习路径:先复现一张注意力矩阵

实践开发继续后置。有能力的读者以后可以按以下顺序复现,而不必一开始训练完整翻译系统:

  1. 手工准备 3 个 Query、4 个 Key 和 4 个 Value,计算分数矩阵与每行 softmax;
  2. 加入填充掩码,验证被屏蔽列的权重为 0,剩余权重和为 1;
  3. 加入因果掩码,检查第 \(t\) 行是否只允许读取不晚于 \(t\) 的位置;
  4. 用一个极小复制任务训练单头注意力,观察损失与权重变化;
  5. 最后再进入 P08,跟踪多头自注意力中的批次、头、序列和特征维度。

这个路径首先验证数据流和不变量,不把“生成看起来像一句话”当作实现正确的唯一证据。

本章小结

  • 固定向量 seq2seq 要把整条输入一次性压缩,长序列和精确对应关系容易成为瓶颈。
  • 注意力保留多个候选表示,并在每次查询时重新计算权重,形成按需读取的上下文向量。
  • Query 表示当前需求,Key 用于匹配,Value 承载实际读取内容;三者通常由训练学习,不是人工语义标签。
  • 加性注意力和点积注意力使用不同打分函数,但都遵循匹配、归一化、加权汇总的数据流。
  • 交叉注意力从另一条序列读取信息,自注意力让同一序列内部的位置彼此读取。
  • 缩放控制高维点积的数值范围;填充掩码和因果掩码分别阻止无效位置与未来信息参与。
  • 注意力权重可以提供观察线索,却不是模型完整推理过程或因果解释。
  • Transformer 把注意力从循环网络的辅助读取模块提升为主体,但仍需要位置、前馈层、残差和归一化等部件。

思考问题

  1. 为什么生成译文中的不同词时,使用同一个固定上下文向量不够理想?
  2. 如果两个位置的 Key 很相似,但 Value 完全不同,注意力机制会发生什么?
  3. 填充掩码和因果掩码分别在阻止哪一种错误信息流?
  4. 为什么某个位置获得最高注意力权重,仍不足以证明它决定了最终输出?

延伸阅读

  • Bahdanau、Cho 与 Bengio 的论文是理解神经机器翻译软对齐和加性注意力的直接起点。(Bahdanau 等 2015年)
  • Luong、Pham 与 Manning 比较了多种全局、局部和打分方案,适合观察同一机制怎样形成不同实现。(Luong 等 2015年)
  • Xu 等人的图像描述工作展示了注意力怎样从词序列扩展到图像空间区域。(Xu 等 2015年)
  • Transformer 原始论文把缩放点积、多头、自注意力和完整编码器-解码器结构连接起来。(Vaswani 等 2017年)

参考文献

Bahdanau, Dzmitry, Kyunghyun Cho, 和 Yoshua Bengio. 2015年. 《Neural Machine Translation by Jointly Learning to Align and Translate》. 3rd International Conference on Learning Representations. https://arxiv.org/abs/1409.0473.
Luong, Minh-Thang, Hieu Pham, 和 Christopher D. Manning. 2015年. 《Effective Approaches to Attention-based Neural Machine Translation》. Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing, 1412~21. https://doi.org/10.18653/v1/D15-1166.
Vaswani, Ashish, Noam Shazeer, Niki Parmar, 等. 2017年. 《Attention Is All You Need》. Advances in Neural Information Processing Systems 30, 5998~6008. https://papers.nips.cc/paper/7181-attention-is-all-you-need.
Xu, Kelvin, Jimmy Ba, Ryan Kiros, 等. 2015年. 《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》. Proceedings of the 32nd International Conference on Machine Learning, Proceedings of Machine Learning Research, 卷 37: 2048~57. https://proceedings.mlr.press/v37/xuc15.html.