1. 引言:深度学习中的注意力机制归纳总结

注意力机制,说白了就是让模型学会“看哪里”。

我记得刚入门NLP那会儿,用的还是传统的RNN/LSTM做机器翻译。输入句子一长,模型就把开头的内容忘得差不多了——典型的长期依赖问题。后来读到Bahdanau那篇论文,发现原来可以让解码器每一步都“回头”看一眼源语言的不同位置,再动态决定当前该关注哪个词。效果一下子就上来了。

你想想看,这个思想其实很直观:你读一段文字的时候,眼睛也不会均匀扫过每个字,而是重点落在关键信息上。注意力机制就是把这个“聚焦”的能力装进了神经网络。

1.1 从最早的注意力说起

最早被广泛采用的注意力形式是 加性注意力(Additive Attention),由 Bahdanau 在 2014 年提出。它的核心用一个单隐层神经网络来计算“当前目标词”和“每个源词”的匹配分数,然后归一化成权重。

公式看起来像这样:

e_ij = v^T · tanh(W · h_j + U · s_{i-1} + b)
α_ij = softmax(e_ij)
c_i = Σ_j α_ij · h_j

嗯,这里要注意:加性注意力的计算量不小,尤其源句子很长的时候。我曾在一次序列标注项目中试着用它,结果训练速度比基线慢了一倍。后来改用了点积注意力,才把时间降下来。

1.2 为什么Transformer选择了缩放点积注意力?

2017年,Google的《Attention Is All You Need》横空出世。他们不仅抛弃了RNN,还换了一种更简洁的注意力形式——缩放点积注意力(Scaled Dot-Product Attention)。

核心就三个矩阵:查询Q、键K、值V。注意力权重算起来漂亮多了:

Attention(Q,K,V) = softmax( Q·K^T / √d_k ) · V

为什么除以√d_k?我刚开始看论文时也不理解,后来自己写代码试了一下才发现,如果不缩放,点积结果随着维度增大而发散,softmax会落入极端区域,梯度几乎消失。这个“除根号d”的小技巧,其实是稳定训练的关键。

关键要点:

  • Q来自当前层(或目标端),K和V来自输入层(或源端)
  • Q·K^T 得到的是每个位置对每个位置的“注意力分数”
  • softmax后得到权重,再与V加权求和,就是最终输出

1.3 多头注意力:从一维观察到多维视角

单头注意力只能学到一种注意模式。但现实中,“相关”可能有多重含义:比如“他”和“张三”是同一个实体,同时“他”和“动词”有语法关系。一个头很难兼顾。

所以Transformer用多头注意力:把Q、K、V分别映射到多个子空间,在每个子空间做独立的注意力计算,最后把所有头的输出拼接起来。我习惯把这种为“让模型从不同的角度观察同一段序列”。

公式也不复杂:

MultiHead(Q,K,V) = Concat(head_1, …, head_h) · W^O
where head_i = Attention(Q·W_i^Q, K·W_i^K, V·W_i^V)

在我参与的一个文本分类项目中,把注意力头数从8增加到12,F1直接提升了2个百分点。当然头太多也会带来过拟合,需要根据数据量调整。

1.4 注意力机制的类型对比

类型 核心计算 复杂度 典型应用
加性注意力 tanh( W·h + U·s + b ) O(n²·d) 早期Seq2Seq、图像Caption
点积注意力 Q·K^T O(n²·d) 简单匹配场景
缩放点积注意力 (Q·K^T) / √d O(n²·d) Transformer系列
多头注意力 并行多组缩放点积+拼接 O(h·n²·d) BERT、GPT等预训练模型

表格里有个明显趋势:虽然复杂度都是O(n²),但实现的简洁性和训练稳定性上,缩放点积+多头显然是当前主流。

1.5 注意力机制带来的核心能力

  • 长距离依赖建模:任意两个位置之间路径长度为1,不像RNN需要一步步传递。我测试过一个2000词的文本分类任务,用LSTM需要400步才能把信息从第一个词传到最后一个,Transformer只需要1步注意力。
  • 并行计算:所有位置的注意力权重可以一次性计算矩阵乘法,而RNN必须逐时间步串行。这使得训练速度提升了几个数量级。
  • 可解释性:注意力权重直接告诉我们模型“看”了哪些输入。我曾经调试一个翻译模型时,通过可视化注意力矩阵发现模型经常错误地关注了标点符号,后来对数据做了清洗就修复了。

我曾经踩过的坑:

不要迷信注意力权重的可解释性。有些情况下,模型会学到“退化解”——所有位置的权重几乎相等,或者某些头完全不工作。我建议训练完后先检查注意力矩阵的熵,如果熵接近均匀分布,说明注意力机制可能没有学到有用的依赖关系。

1.6 本章核心结构一览

下面的SVG图直观展示了注意力机制从输入到输出的完整流程,同时也反映了本章将要展开的知识体系:

深度学习注意力机制核心流程 输入序列 X Q K V Q·K^T / √d → softmax (注意力权重 α) 加权求和 α·V (上下文向量) 输出序列 / 表示 多头注意力扩展 将Q、K、V线性投影到 h 个子空间 每个头独立执行缩放点积注意力 拼接所有头输出,再线性变换 公式:Concat(head₁,...,headₕ)·Wᴼ 优点:捕捉多粒度的依赖关系 注意力机制变体一览 • 自注意力(Self-Attention) • 交叉注意力(Cross-Attention) • 因果注意力(Causal Attention) • 稀疏/分块注意力(减少O(n²)) • 相对位置编码注意力

新手建议:

如果你刚开始接触注意力机制,我建议先手工推导一遍缩放点积注意力的维度变换。拿一个简单的例子:输入长度=3,d=4,写出Q、K、V矩阵,算出Q·K^T,除以√4=2,再softmax,最后乘以V。走一遍这个过程,比你读十遍论文都管用。

在这一章里,我们梳理了注意力机制的来龙去脉。从本质上看,它就是一个“软寻址”的过程:Q是查询,K是键,注意力权重就是查询与每个键的相似度,然后用这个相似度对值V做加权平均。

后面的章节会逐步深入到具体的注意力权重矩阵可视化、不同层的注意力模式、以及如何用这些信息调试模型。但这一章的理解是地基——尤其Q、K、V的语义和维度关系,请务必记牢。