4、多头注意力机制回顾:Scaled Dot-Product Attention,多头并行计算原理

好,咱们今天来聊聊多头注意力机制。

说实话,这个模块是Transformer的基石。你想想看,如果没有它,后面所有的位置编码、层归一化都成了空中楼阁。我个人习惯把多头注意力拆成两个部分来理解:单头怎么算,以及多头怎么拼

4.1 Scaled Dot-Product Attention:单头里的那点事

先看最核心的运算——缩放点积注意力。

说白了,就是三个矩阵:Query(Q)、Key(K)、Value(V)。

我刚开始接触时,总觉得这三个名字很玄乎。其实你可以这么记:

  • Query:你想查什么?
  • Key:每个位置有什么标签?
  • Value:每个位置真正的内容是什么?

计算过程就三步:

  1. Q和K做点积,得到注意力分数。
  2. 除以 \(\sqrt{d_k}\) 进行缩放。
  3. Softmax归一化,再乘上V。

公式长这样:

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V

为什么要除以 \(\sqrt{d_k}\) ?

嗯,这里要注意。我在项目中遇到过,如果不做缩放,当 \(d_k\) 很大时,点积的结果会非常大。Softmax的梯度会变得极其小,模型根本学不动。这就是所谓的“梯度消失”。

除以 \(\sqrt{d_k}\) 后,方差被拉回到1附近。训练稳定多了。

核心要点:缩放因子 \(\sqrt{d_k}\) 不是拍脑袋定的,它来源于对向量独立同分布假设下的方差分析。我建议你把这个推导手推一遍,印象会深很多。

4.2 多头并行计算:为什么一个头不够?

单头注意力有个问题——它只能关注一种关系。

你想想看,一句话里可能有语法关系、语义关系、指代关系。一个头只能捕捉一种模式。那怎么办?

多搞几个头,并行算!

多头注意力的思路很简单:

  1. 把Q、K、V分别投影到 \(h\) 个不同的子空间。
  2. 每个子空间独立做一次缩放点积注意力。
  3. 把 \(h\) 个结果拼起来,再投影回原始维度。

公式如下:

MultiHead(Q, K, V) = Concat(head_1, ..., head_h) W_O
其中 head_i = Attention(Q W_Q_i, K W_K_i, V W_V_i)

这里 \(W_Q_i, W_K_i, W_V_i\) 是每个头的投影矩阵。\(W_O\) 是输出投影矩阵。

我曾经踩过一个坑:一开始我把所有头的输出直接相加,而不是拼接。结果模型效果差得离谱。后来才意识到,拼接保留了每个头的独立信息,相加则会把信息混在一起。这个细节,大家一定要注意。

我的经验:在实际工程中,多头并行计算可以用一个矩阵乘法搞定。把多个头的Q、K、V拼成一个大矩阵,一次算完所有头的注意力。这样效率高很多。

4.3 多头注意力的可视化理解

光说公式可能有点干。我画了一张图,帮你理解多头是怎么并行工作的。

输入序列 Q K V 线性投影 头1 Q 头1 K 头1 V 头2 Q 头2 K 头2 V 头h Q 头h K 头h V → 并行计算注意力 头1 输出 头2 输出 头h 输出 Concat W_O 最终输出

你看,每个头独立处理自己的Q、K、V,互不干扰。最后把结果拼起来,再经过一个线性变换,就得到了多头注意力的输出。

4.4 参数与计算量分析

咱们来算笔账。假设:

  • 输入维度 \(d_{model} = 512\)
  • 头数 \(h = 8\)
  • 每个头的维度 \(d_k = d_v = 64\)

那么每个头的投影矩阵大小是 \(512 \times 64\)。8个头就是8个这样的矩阵。输出投影矩阵 \(W_O\) 的大小是 \(512 \times 512\)。

组件 参数量 说明
每个头的 Q/K/V 投影 3 × 512 × 64 = 98,304 每个头独立
所有头的 Q/K/V 投影 8 × 98,304 = 786,432 8个头合计
输出投影 W_O 512 × 512 = 262,144 拼接后投影
总计 1,048,576 约1M参数

注意:虽然每个头的维度变小了,但总参数量和单头注意力(\(d_k = 512\))是一样的。多头并没有增加参数量,只是把参数分散到了不同的子空间。这是它的精妙之处。

4.5 为什么多头有效?

我个人的理解是:多头注意力相当于让模型同时从多个角度观察输入。

举个例子,在翻译任务中:

  • 一个头可能关注语法结构(主谓宾)
  • 另一个头可能关注指代关系(他、她、它)
  • 还有一个头可能关注长距离依赖(从句和主句的关系)

每个头各司其职,最后把信息融合起来。这比单头注意力灵活得多。

我曾经在训练一个文本分类模型时,把多头数从8减到4,结果准确率掉了2个点。后来又试了16个头,提升不大但训练变慢了。所以8个头是个不错的折中。

实用建议:头数一般取8或16。太少表达能力不够,太多计算开销大且容易过拟合。我一般从8开始试,效果不好再调。

好了,多头注意力的核心内容就这些。记住:单头是基础,多头是升华。理解了这两点,后面RoPE的集成方案就顺理成章了。


专注资料整理