Attention Mechanism in Seq2Seq Models.

序列到序列(Seq2Seq)模型把整个源序列压缩到编码器最后一个隐状态\(c=h_T\),再由解码器逐位生成目标序列。当源序列变长,一个固定维度向量无法承载全部语义:不同目标位置需要的源信息并不相同,让所有位置共享同一个上下文向量必然造成信息稀释。Bahdanau等人在\(2014\)年的神经机器翻译中提出注意力机制(Attention Mechanism),让解码器在生成第\(u\)步时按需重新查询编码器的所有隐状态,实质上把定长的“上下文向量”换成一个内容可寻址的动态记忆。

注意力机制主要回答三个问题:

本文目录:

  1. 从固定上下文向量到动态查询
  2. 加性注意力与乘性注意力
    • (1) Bahdanau加性注意力
    • (2) Luong乘性注意力
  3. 注意力得分函数汇总
  4. 全局注意力与局部注意力
  5. 软性注意力与硬性注意力
  6. 覆盖度与结构化注意力
    • (1) 覆盖度机制
    • (2) 单调注意力
    • (3) 层次化注意力
  7. 讨论:注意力的能力边界

符号约定:源序列\(x_{1:T}\)对应编码器隐状态\(h_{1:T}\),目标序列\(y_{1:U}\)对应解码器隐状态\(s_{1:U}\);第\(u\)步解码时的查询向量记作\(q_u\)(一般取\(s_{u-1}\)或\(s_u\)),注意力权重记作\(\alpha_{u,t}\),上下文向量记作\(c_u\)。

1. 从固定上下文向量到动态查询

不使用注意力的Seq2Seq中,编码器压缩、解码器生成,两者只通过\(c=h_T\)相连:

引入注意力后,解码器每一步都会重新构造一个上下文向量\(c_u\):

\[\begin{aligned} e_{u,t}&=\operatorname{score}(q_u,h_t),\\ \alpha_{u,t}&=\frac{\exp(e_{u,t})}{\sum_{t'=1}^{T}\exp(e_{u,t'})},\\ c_u&=\sum_{t=1}^{T}\alpha_{u,t}h_t. \end{aligned}\]

$c_u$随\(u\)变化,因此解码器在不同目标位置可以“看”源序列的不同位置。\(\alpha_{u,t}\)可视化后往往呈现出对角形对齐,与传统机器翻译中的词对齐相吻合,这也是注意力最初被提出时的解释性证据。

注意力机制的实现有几个共通细节:

2. 加性注意力与乘性注意力

(1) Bahdanau加性注意力

⚪ Bahdanau Attention:注意力机制的首篇论文

Bahdanau等人在双向RNN编码器与GRU解码器之上引入了第一版注意力。它以解码器上一时刻的隐状态\(s_{u-1}\)作为查询,对每个编码器隐状态\(h_t\)计算加性得分:

\[e_{u,t}=v^\top\tanh(W_qs_{u-1}+W_kh_t),\]

其中\(v\in\mathbb{R}^{d}\)、\(W_q,W_k\in\mathbb{R}^{d\times d_h}\)是可学习参数。所有位置的\(e_{u,t}\)经softmax得到\(\alpha_{u,t}\),再加权求和得到\(c_u\)。解码器把\(c_u\)与自身隐状态一起用于预测:

\[\begin{aligned} s_u&=f_{\mathrm{dec}}(y_{u-1},s_{u-1},c_u),\\ p(y_u\mid y_{<u},x)&=\operatorname{softmax}(g(s_u,y_{u-1},c_u)). \end{aligned}\]

加性注意力的关键优势是\(s_{u-1}\)与\(h_t\)可以有不同维度:\(W_q\)与\(W_k\)分别把它们映射到相同的\(d\)维空间。这一版本没有依赖“查询与键同维”的假设,因此更灵活。

(2) Luong乘性注意力

⚪ Luong Attention:结构更简的乘性打分

Luong等人系统比较了多种得分函数与两种解码流程,把注意力实现简化到几乎不需要额外参数。他们的主要贡献有三点:

论文的经验结论是:general得分(\(s_u^\top W h_t\))在多数任务上稳定优于纯点积;对长序列,局部注意力可以在几乎不损失质量的前提下大幅降低推理开销。

3. 注意力得分函数汇总

不同注意力机制的差别主要在得分函数\(\operatorname{score}(q,k)\)。常见的几种形式如下。

名称 表达式 说明
加性 Additive \(v^\top\tanh(W_qq+W_kk)\) 引入非线性,允许\(q\)与\(k\)异维
点积 Dot-Product \(q^\top k\) 无额外参数,需要\(q,k\)同维
缩放点积 Scaled Dot-Product \(q^\top k/\sqrt{d_k}\) 缩放防止内积过大导致softmax饱和
双线性 General \(q^\top W k\) 引入不对称的可学习权重
基于位置 Location-based \(W q\) 得分只依赖查询,不看键
基于上下文 Context-based \(\cos(q,k)\) 余弦相似度,用于NTM等结构化记忆

得分函数的选择影响计算成本、数值稳定性与可解释性。乘性系列可以直接写成矩阵乘法,特别适合GPU批量加速;加性系列需要额外的\(\tanh\),但对异维查询/键更友好。

⭐ 讨论:为什么要缩放点积

当\(d_k\)较大时,两条零均值单位方差的向量点积的方差是\(d_k\),使得softmax输入变得过于集中,梯度趋近于零。除以\(\sqrt{d_k}\)把方差归一为\(1\),让softmax保持在敏感区间。在RNN式注意力里\(d_k\)通常不大,缩放的重要性没那么突出;但在多头点积注意力中它决定了训练是否可行。

4. 全局注意力与局部注意力

全局(global)注意力在整个源序列\(h_{1:T}\)上计算\(\alpha_{u,t}\),这是最早提出的形式,也称为软性注意力(Soft Attention)。它平滑可微,但每步都要处理\(T\)个键,序列很长时代价高。

局部(local)注意力只在一个宽度\(2D+1\)的窗口内做softmax,\(D\)是超参数。窗口中心\(p_u\)的选择有两种:

局部注意力在长序列上明显更快,且在机器翻译和摘要上并不总是逊色于全局注意力;缺点是引入了对齐先验,非单调的语对之间会失去精度。

5. 软性注意力与硬性注意力

硬性注意力(Hard Attention)在每一步只选择一个源位置:

\[c_u=h_{\hat{t}},\qquad \hat{t}=\arg\max_{t}\alpha_{u,t}.\]

或者更一般地:把\(\alpha_{u,t}\)作为一个类别分布,采样一个位置\(\hat{t}\sim\mathrm{Cat}(\alpha_{u,\cdot})\)。硬性注意力的直觉是“真实注意力就应该是尖锐的”,但\(\arg\max\)与采样都不可微,需要用REINFORCE或Straight-Through估计梯度。Xu等人在Show, Attend and Tell中用硬性注意力做图像描述并给出了变分下界的解释。

软性注意力用连续权重把所有键混合,训练稳定且完全可微,是绝大多数Seq2Seq任务的默认选择。硬性注意力的优势是推理时开销小(只取一个位置),并且注意力权重具有更强的可解释性。二者之间还存在稀疏注意力这类折中方案,比如sparsemax用可微的欧氏投影替代softmax,得到严格稀疏但仍可求梯度的权重。

6. 覆盖度与结构化注意力

(1) 覆盖度机制

⚪ Coverage Mechanism:约束注意力不要反复关注同一位置

不加约束的注意力可能反复访问同一源位置,造成翻译或摘要中的过翻译(over-translation)与漏翻译(under-translation)。Tu等人为每个源位置引入一个覆盖向量\(c_t^{\mathrm{cov}}\),累积其历史注意力:

\[c_t^{\mathrm{cov},u}=c_t^{\mathrm{cov},u-1}+\alpha_{u,t}.\]

把\(c_t^{\mathrm{cov},u}\)作为额外输入送入得分函数,模型倾向避免关注已被覆盖的位置:

\[e_{u,t}=v^\top\tanh(W_qs_u+W_kh_t+W_cc_t^{\mathrm{cov},u}).\]

与Pointer-Generator同源的抽象式摘要工作还在损失里加入覆盖惩罚\(\sum_{u,t}\min(\alpha_{u,t},c_t^{\mathrm{cov},u})\)。两种形式都在减少重复输出上有效。

(2) 单调注意力

⚪ Monotonic Attention:适配流式解码

在语音识别、同声传译等流式(streaming)任务中,源序列是逐步到达的,解码器不能回看已处理过的位置。Raffel等人提出单调注意力:把注意力权重视为一个只能向右推进的“读取指针”,用一族Bernoulli变量决定何时停下、何时继续读入。为了训练可行,实际实现采用期望形式MoChA在每个位置上做局部软注意力。这一族方法把注意力的适用范围从离线Seq2Seq**推广到在线场景。

(3) 层次化注意力

⚪ Hierarchical Attention Network:文档级建模的两层注意力

HAN面向长文档任务,先在词级用双向RNN+注意力聚合每个句子的表示,再在句子级用另一次注意力聚合成文档表示。它体现了注意力的“层次化”视角:把不同粒度的表示逐级摘要,每一级都由注意力决定重要性。这一思想在Seq2Seq框架里也常见,例如把文档的段落级、句级、词级注意力合成为多阶段结构。

7. 讨论:注意力的能力边界

回到最初的动机:注意力机制解决了固定长度上下文向量的信息瓶颈。它给Seq2Seq带来了三项能力:

也存在一些局限:

注意力最初是Seq2Seq的一个附加模块,但一旦把它推广到“查询自己内部”,就得到了自注意力机制——Seq2Seq内部循环网络也可以被完全替换掉。这一路径最终在Transformer处交汇。