为什么要除以 √dk?)
缩放点积注意力为什么要除以 √d_k核心结论除以 √d_k 是为了控制点积结果的方差防止数值过大导致 softmax 梯度消失使训练稳定。数学推导假设条件假设 Query 和 Key 的各维度是独立的、均值为 0、方差为 1 的随机变量Q_i, K_i ~ i.i.d., E[Q_i] E[K_i] 0, Var(Q_i) Var(K_i) 1点积的方差点积: S Q · K Σ_{i1}^{d_k} Q_i · K_i 期望: E[S] Σ E[Q_i · K_i] Σ E[Q_i]·E[K_i] 0 方差: Var(S) Σ Var(Q_i · K_i) Σ E[Q_i²]·E[K_i²] (Q_i, K_i 独立) Σ 1 · 1 d_k关键结论点积的标准差为 √d_k随维度 d_k 线性增长。d_k 64 → std(S) ≈ 8 d_k 512 → std(S) ≈ 22.6 d_k 1024 → std(S) ≈ 32除以 √d_k 后S_scaled (Q · K) / √d_k Var(S_scaled) Var(S) / d_k d_k / d_k 1缩放后点积的方差恒为 1与维度 d_k 无关。不缩放会怎样softmax 饱和问题当点积值很大时softmax 输出趋近 one-hot未缩放 (d_k512, std≈22.6): logits [22.6, 0, 0, 0, ...] softmax ≈ [1.0, 0, 0, 0, ...] ← 几乎只关注一个位置 缩放后 (std1): logits [1.0, 0, 0, 0, ...] softmax ≈ [0.58, 0.10, 0.10, ...] ← 分布适度平滑梯度消失softmax 对 logit 的梯度为∂softmax(z_i)/∂z_j softmax(z_i) · (δ_ij - softmax(z_j)) 当 z 极大 → softmax 趋近 one-hot → 梯度趋近 0未缩放: logits 极大 → softmax 饱和 → 梯度 ≈ 0 → 训练停滞 缩放后: logits 适中 → softmax 平滑 → 梯度健康 → 正常训练直观理解点积 d_k 个独立项的求和 d_k 越大 → 求和项越多 → 结果波动越大 → 值域越宽 类比: 掷 1 个骰子 → 结果范围 [1, 6] 掷 100 个骰子 → 结果范围 [100, 600]波动大得多 除以 √d_k → 将波动标准化回单位尺度 类比: 掷 100 个骰子后除以 10 → 结果范围 [10, 60]与单骰子尺度可比为什么是 √d_k 而不是 d_k方差与 d_k 成正比: Var(S) d_k 标准差与 √d_k 成正比: std(S) √d_k 要使标准差归一化为 1: S / std(S) S / √d_k → std 1 ✓ 如果除以 d_k: S / d_k → std 1/√d_k → 过度缩放值太小softmax 过于均匀 ✗缩放因子缩放后 std效果不缩放√d_k值过大softmax 饱和梯度消失÷ √d_k1适中梯度健康÷ d_k1/√d_k值过小softmax 过于平坦区分度不足与加性注意力的对比加性注意力 (Bahdanau): score(Q, K) v^T · tanh(W_Q·Q W_K·K) → tanh 将值限制在 [-1, 1]天然有界无需缩放 点积注意力 (Luong / Transformer): score(Q, K) Q · K^T → 无界随 d_k 增长 → 需要缩放 缩放点积注意力 点积注意力 √d_k 缩放 → 兼具点积的计算效率 和 数值稳定性一句话总结点积的方差随维度 d_k 线性增长导致高维下 softmax 饱和、梯度消失除以 √d_k 将方差归一化为 1使注意力分布保持适度平滑、梯度健康从而保证训练稳定性。