为什么点积注意力需要做缩放
在 Transformer 的 Attention 机制中,$Q$ 和 $K$ 的点积公式是 $Q \cdot K^T = \sum_{i=1}^{d_k} q_i k_i$。
假设 $q$ 和 $k$ 的每个维度都是均值为 0、方差为 1 的独立随机变量,那么点积结果的方差就是 $d_k$(方差累加),标准差就是 $\sqrt{d_k}$。
当 $d_k$(词向量维度)很大时(比如 512、1024),点积出来的数值自然就会很大,可能达到几十甚至上百。
Softmax 的公式是:$Softmax(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}}$。
指数函数 $e^x$ 有一个特性:数值稍微大一点,结果就会爆炸式增长。
如果输入的 logits 是 [10, 20, 30],那么 $e^{30}$ 会远远大于 $e^{20}$ 和 $e^{10}$。Softmax 的输出会变成 [极小, 极小, 接近1],这叫做 “饱和(Saturation)” 现象。
一旦 Softmax 的输出接近 One-hot 向量(即某个位置是1,其他全是0),它的导数(梯度)就会趋近于 0。在反向传播时,梯度就消失了,模型参数无法更新。
假设某个 Attention 有 3 个词,计算出的原始点积得分(未归一化)如下:
情况 A:不缩放(数值很大)
- 输入给 Softmax 的得分:
[10, 20, 30] - 计算指数:
[e^10, e^20, e^30]≈[22026, 4.85亿, 1.06万亿] - Softmax 输出:
[0.000000002, 0.00000045, 0.99999954] - 结果:Softmax 几乎变成了
[0, 0, 1]。 - 梯度:此时如果模型预测错了,想调整参数,但由于输出概率要么是0要么是1,求导得到的梯度几乎是 0(即梯度消失),参数根本动不了,模型无法学习。
情况 B:缩放后(除以 $\sqrt{d_k}$)
假设 $d_k = 64$,那么 $\sqrt{d_k} = 8$。
- 输入给 Softmax 的得分:
[10/8, 20/8, 30/8]=[1.25, 2.5, 3.75] - 计算指数:
[e^1.25, e^2.5, e^3.75]≈[3.49, 12.18, 42.52] - Softmax 输出:
[0.06, 0.21, 0.73] - 结果:输出是一个平滑的概率分布。
- 梯度:此时的梯度处于健康区间,模型可以通过反向传播正常更新参数。
所以缩放(除以 $\sqrt{d_k}$ )的作用就是把点积的方差拉回 1,让输入 Softmax 的值保持在合理的范围,避免模型进入梯度饱和区。