
1. 点积的方差会放大要理解 √dk先得看 Q·Kᵀ 这个点积本身。假设 Q、K 每个分量独立同分布、均值 0、方差 1那两个 d_k 维向量点积Σ q_i·k_i的方差就是 d_k每个乘积方差 1加 d_k 个。也就是说维度越高点积的绝对值波动越大——d_k64 时分数可能飘到 ±8d_k512 时可能到 ±22。这个放大的方差正是后面一切问题的源头。见图 figure_04_12. Softmax 的饱和区问题Softmax 是个「赢家通吃」函数输入很大时输出接近 one-hot某一维≈1其余≈0输入很小时输出接近均匀。两者都不好——接近 one-hot梯度几乎为 0模型学不动梯度消失接近均匀每个词都被同等对待注意力没起到「聚焦」作用信息被平均掉。所以 Softmax 最舒服的状态是「输入别太大也别太小」落在梯度活跃的线性区附近。3. 除以 √dk 的作用√dk 这一除本质是把点积的方差从 d_k拉回 1方差回到 1分数就被控制在合理范围Softmax 不会一头扎进饱和区。这一步和「归一化」是一个家族的思路——让进入关键非线性函数的输入保持合适 scale。没有它大模型维度一高就训练发散有了它注意力分数稳定梯度能正常回传。见图 figure_04_24. 极端维度下的影响举个直观例子d_k64 时 √dk8原始分数 ±8 除以 8 变成 ±1Softmax 还能给出有区分度的平滑分布如果不除d_k512 时分数能到 ±22Softmax 直接饱和成 one-hot模型只会死盯一个 token其余信息全丢。所以 √dk 不是「锦上添花」是高维注意力能训练的前提。调 Q/K 的 head 维度dk会直接影响稳定性这也是为什么 head 维度通常取 64 这种「除以 √dk 后 scale 适中」的值。见图 figure_04_45. 和 LayerNorm 的关系注意 √dk 缩放发生在进入 Softmax 之前是注意力分数层面的LayerNorm 发生在子层输出之后是激活值分布层面的。两者各管一段不能互相替代。一个常见误解是「反正后面有 LayerNorm 兜底」其实 LayerNorm 管不了 Softmax 的饱和——分数已经 one-hot 了LayerNorm 再怎么归一也救不回丢失的梯度。所以缩放和归一化是两个独立保险。见图 figure_04_36. Java 工程意义你不会手写训练但看模型超参时能秒懂为什么 attention 的 head 维度不能随便定、为什么有些配置「换个小维度就训崩」。在工程侧做注意力可视化或自定义注意力算子比如写个稀疏注意力时务必保留÷√dk这一步否则数值会飘。小结√dk 是「让 Softmax 别饱和」的那根定海神针。/** 演示缩放对 softmax 梯度的影响 */publicclassScaleDemo{publicstaticvoidmain(String[]args){double[]scores{8,9,7,6};double[]scaled{1.0,1.125,0.875,0.75};// 除以 8// 未缩放 softmax 接近 [0.07, 0.92, 0.01, 0.004]几乎 one-hot// 缩放后分布更平滑梯度信息更丰富}}场景未缩放 Q·K^T缩放 Q·K^T/√dk影响d_k 小方差小可接受更稳定训练更平滑d_k 大方差大极值多方差归一防 Softmax 饱和梯度Softmax 饱和区梯度消失Softmax 在线性区优化更容易