在 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 的值保持在合理的范围,避免模型进入梯度饱和区。

标签: 深度学习

添加新评论