注意力模型 笔记

3 阅读9分钟

一、为什么需要注意力机制?

传统 Seq2Seq 模型的瓶颈

在注意力机制出现前,经典的 Encoder-Decoder(如用于机器翻译的 RNN/LSTM)存在一个关键问题:

  • 编码器将整个输入序列(例如一句英语)压缩成一个固定长度的向量(最后一个隐藏状态 (h_T) 或上下文向量 (c))。
  • 解码器基于这个固定向量生成输出(例如中文翻译)。

问题

  1. 信息瓶颈:无论输入序列多长(比如一个长段落),都必须压缩成一个固定向量,必然会丢失信息。
  2. 长序列性能差:解码器在生成每个词时,都依赖相同的固定向量,无法动态获取与当前生成词最相关的输入部分。例如,翻译“我爱 AI”中的“AI”时,应该重点关注输入中的“AI”,而不是“我爱”。

注意力机制正是为了解决这个瓶颈而诞生:它允许解码器在每一步主动查阅整个输入序列,并动态计算每个输入位置的重要性权重,然后生成一个加权和的上下文向量


二、注意力机制的核心思想

一句话概括:给定一个查询(Query),对一组键-值对(Key-Value pairs) 进行加权求和,权重由 Query 与每个 Key 的相似度决定。

  • Query:代表当前时刻“想要查找什么信息”。(例如解码器当前的隐藏状态)
  • Key:代表输入序列中每个位置的“标签”,用于与 Query 匹配。(例如编码器各时刻的隐藏状态)
  • Value:代表输入序列中每个位置的“实际信息”,通常与 Key 来自同一个位置。(例如编码器各时刻的隐藏状态本身,或者经过变换后的值)

计算过程(以 Soft Attention 为例,最常用的一种):

  1. 计算注意力分数(Score):对于每个 Key,计算 Query 与 Key 的相似度 (e_{ij} = \text{score}(q_i, k_j))。
    常用 score 函数:

    • 点积:(q \cdot k)
    • 缩放点积:(\frac{q \cdot k}{\sqrt{d_k}})(Transformer 使用)
    • 加性(Bahdanau 注意力):(v^T \tanh(W_1 q + W_2 k))
  2. 归一化为权重:对所有分数应用 Softmax,得到概率分布 (\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_k \exp(e_{ik})})。

  3. 加权求和 Value:输出上下文向量 (c_i = \sum_j \alpha_{ij} v_j)。

这个上下文向量会被传递给下一层(如解码器),与当前输入结合生成下一个输出。


三、注意力机制的经典变体

1. 加性注意力(Additive Attention / Bahdanau Attention)

  • 提出:Bahdanau 等人在 2014 年将注意力引入神经机器翻译(首次使用)。
  • 计算公式
    [ e_{ij} = v_a^T \tanh(W_a \cdot [h_{i-1}; \bar{h}j]) ] 其中 (h{i-1}) 是解码器上一隐藏状态(Query),(\bar{h}_j) 是编码器第 j 个隐藏状态(Key/Value)。
  • 特点:可以处理不同维度的 Query 和 Key,计算量稍大,但早期性能好。

2. 点积注意力(Dot-Product Attention)

  • 公式:(e_{ij} = q_i \cdot k_j)
  • 特点:计算简单高效,但要求 q 和 k 维度相同。当维度较大时,点积值可能过大,导致 Softmax 梯度极小的区域。

3. 缩放点积注意力(Scaled Dot-Product Attention)

  • 公式:(e_{ij} = \frac{q_i \cdot k_j}{\sqrt{d_k}})
  • 作用:除以 (\sqrt{d_k}) 可以控制方差,避免点积值过大,保持梯度稳定。Transformer 使用此形式

4. 自注意力(Self-Attention / Intra-Attention)

  • 定义:Query、Key、Value 来自同一个序列(例如句子中的词与词之间)。
  • 效果:每个位置可以关注序列中所有位置(包括自身),从而捕获内部依赖关系。例如,“他”关注“小明”。
  • 用途:Transformer 的编码器和解码器都大量使用自注意力;也用于图网络、图像处理(Non-local 网络)。

5. 交叉注意力(Cross-Attention)

  • 定义:Query 来自一个序列(如解码器),Key/Value 来自另一个序列(如编码器输出)。
  • 用途:在 Transformer 解码器中连接编码器和解码器;也用于多模态任务(如图片提问,文本作为 Query,图像特征作为 Key/Value)。

6. 硬注意力(Hard Attention)与软注意力(Soft Attention)

  • 软注意力:对所有的 Value 进行加权求和(可微,可端到端训练)。
  • 硬注意力:只选择其中一个 Value(如采样最高分的位置),不可微,通常需要 REINFORCE 等方法训练。现在基本都用软注意力。

7. 全局注意力(Global) vs 局部注意力(Local)

  • 全局:关注输入序列的所有位置(计算量大)。
  • 局部:只关注一个窗口内的位置(例如预测下一个词时只看前后 L 个词),用于降低复杂度。

四、注意力机制的完整例子:Seq2Seq 机器翻译

以英语→中文翻译为例:

  • 编码器:处理英文句子 “I love AI”,输出每个词的隐藏状态 (h_1, h_2, h_3)。
  • 解码器:生成第一个中文词“我”。
    • 当前解码器隐藏状态 (s_0)(初始为编码器最后状态或全零)。
    • 计算注意力分数:(e_{0j} = \text{score}(s_0, h_j)) for j=1,2,3。
    • Softmax 得到权重 (\alpha_{01}, \alpha_{02}, \alpha_{03})。
    • 上下文向量 (c_0 = \sum_j \alpha_{0j} h_j)。
    • 将 (c_0) 与 (s_0) 拼接,输入到输出层预测“我”。
  • 生成“爱”时,使用解码器新的隐藏状态 (s_1),重新计算与编码器所有 (h_j) 的注意力权重。
    • 此时模型可能给 (h_2)(对应“love”)更高的权重。
  • 生成“AI”时,权重集中在 (h_3)。

可视化:注意力权重矩阵(解码步数 × 输入长度)可以显示模型在翻译每个词时“看”了输入中的哪些词。


五、为什么注意力机制如此强大?

优点解释
解决信息瓶颈不再需要把整个输入压缩成固定向量,解码器可以直接“查阅”原始输入序列。
长距离依赖无论两个词在序列中隔多远,注意力都可以直接计算它们的相关性(路径长度 = 1)。
可解释性注意力权重可以可视化,让人理解模型在做决策时关注了什么。
并行计算自注意力可以一次性计算所有位置对的注意力分数,比 RNN 串行快得多(Transformer 的基础)。
灵活性可以应用于各种结构(序列、图像、图、多模态),Query/Key/Value 可以来自不同模态。

六、注意力机制与 RNN/LSTM、Transformer 的关系

  • RNN + Attention:在 2014–2017 年,注意力作为 RNN Seq2Seq 的“增强插件”存在。它缓解了长序列问题,但仍无法并行训练,因为 RNN 本身是串行的。
  • Transformer(纯注意力):彻底抛弃 RNN,只使用自注意力和交叉注意力,加上前馈网络,实现了完全并行训练,并成为主流。

核心演进
RNN(串行,短记忆)→ RNN + Attention(可查阅全部输入,但仍串行)→ Self-Attention(并行,长距离直接建模)


七、注意力机制的变种与应用

  • 多头注意力(Multi-Head Attention):将 Q、K、V 线性投影到多个低维空间,分别计算注意力,然后拼接。让模型从多个角度捕获不同关系(语法、指代、语义等)。Transformer 中使用。
  • 自注意力用于图像:将图像切成 patch,计算 patch 之间的自注意力(ViT)。
  • 图注意力网络(GAT):在图节点之间计算注意力,聚合邻居信息。
  • Transformer 中的掩码注意力(Masked Self-Attention):在解码器中,通过掩码让当前位置不能看到未来位置,保证自回归生成。

八、一个直观类比:图书馆找书

  • 查询(Query):你手里拿着一张纸条,上面写着“机器学习基础”(你想要的信息)。
  • 键(Key):图书馆每本书的书脊上贴着标签(“Python入门”、“深度学习”、“机器学习”等)。
  • 值(Value):每本书的实际内容。

注意力过程

  1. 你把 Query 与每本书的 Key 比较(计算相似度)。
    • “机器学习” → 与“机器学习基础”标签很相似(高分)。
    • “Python入门” → 中等相似(中等分)。
    • “世界历史” → 不相似(低分)。
  2. 根据相似度,你决定从哪些书里提取信息:主要看高分的书,但也稍微看看中等分的书。
  3. 最终你提取的内容 = 高分书的内容 × 大权重 + 中等分书 × 小权重 + 低分书 × 接近 0 权重。
    (这就是加权求和)

九、注意力机制的数学总结

给定 (n) 个 Key-Value 对(矩阵形式 (K \in \mathbb{R}^{n \times d_k}),(V \in \mathbb{R}^{n \times d_v})),一个 Query (q \in \mathbb{R}^{d_k})(或一批查询 (Q \in \mathbb{R}^{m \times d_k})),

缩放点积注意力
[ \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V ]

  • 输出维度:(m \times d_v)。
  • Softmax 按行作用(对每个 Query 分别归一化)。

自注意力:令 (Q = K = V = X)(输入序列)。
交叉注意力:(Q) 来自序列 A,(K, V) 来自序列 B。


十、常见面试题与思考

  1. 为什么缩放点积注意力要除以 (\sqrt{d_k})?
    当 (d_k) 较大时,点积的方差变大,导致 Softmax 梯度极小,除以 (\sqrt{d_k}) 可以保持方差为 1。

  2. 加性注意力和点积注意力的区别?
    加性注意力使用可学习参数计算分数,点积使用点积。加性更灵活(可以处理不同维度),但点积更高效且效果相当(缩放后)。

  3. 自注意力计算复杂度?
    序列长度 (n),维度 (d),复杂度 (O(n^2 \cdot d))。对于长序列(如 10k+),平方级复杂度成为瓶颈,因此有稀疏注意力、线性注意力等改进。

  4. 注意力机制和全连接层的区别?
    全连接层的权重是固定的(学习得到),不依赖于输入内容。注意力机制的权重是动态根据 Query 和 Key 计算的,与输入有关。


总结

注意力模型的核心就是通过动态权重聚合信息。它解决了 RNN 的信息瓶颈,实现了长距离直接交互,并且天然支持并行计算,因此成为 Transformer 乃至现代大语言模型的基础构件。理解 Query-Key-Value 三元组以及缩放点积注意力,就掌握了注意力机制的精髓。