除以 √d_k 是为了防止点积数值随维度增大而过大,避免 softmax 进入饱和区。假设 q 和 k 的各分量是均值为 0、方差为 1 的独立随机变量,则点积 q·k = Σq_i·k_i 的方差为 d_k,标准差为 √d_k。维度大时(如 d_k=64 或 128),点积的绝对值可达十几甚至更大,softmax 对这么大的输入会输出接近 one-hot 的分布。
后果是梯度消失:softmax 饱和区导数趋近于零,反向传播时注意力权重几乎不再更新,模型难以学习该关注谁。除以 √d_k 后点积的方差回到 1,softmax 工作在梯度充足的敏感区间。
易错点:认为缩放是为了数值溢出——主要是梯度问题而非溢出;缩放除数是 √d_k(每个头的维度)而不是总隐藏维度 √d_model。追问方向:为何不直接对 QKᵀ 做归一化?这与权重初始化控制方差的思想有何相通之处?