编程与 AI13 分钟阅读更新于 2026-08-03

为什么要在 Softmax 前除以 √d_k

围绕 Scaled Dot-Product Attention 的描述,解释点积数值随维度变化的原因,以及缩放为什么必须发生在 Softmax 之前。

相关工具

点积为什么会随着维度变大

缩放点积注意力的第一步是用 Query 和 Key 做点积。点积可以看成两个向量对应维度相乘后求和:维度越大,参与累加的项越多,结果的波动范围通常也会变大。即使每个分量本身数值不大,累加后也可能得到绝对值较大的分数。

Transformer 相关概念 因此在 QK 的转置乘积之后、Softmax 之前加入缩放项,除以根号 d_k。这里的 d_k 是 Query 和 Key 的特征维度。缩放的目标不是改变注意力关系本身,而是把分数控制在更适合归一化的范围内。

Transformer Query Key 点积分数随 d_k 维度增加而变化的示意图
点积分数与维度增长

Query 和 Key 的点积包含多个维度的累加,d_k 增大时分数波动范围可能扩大。

Softmax 对分数差距很敏感

Softmax 会把一组分数转换成概率分布。分数之间差距较小时,多个位置可能获得相对平衡的权重;差距很大时,最高分位置会占据绝大部分概率,其他位置的概率迅速接近零。

如果点积分数因为维度变大而整体波动增强,Softmax 就更容易进入过于尖锐的状态。此时注意力看起来像只选择一个位置,其他位置几乎没有梯度和贡献。缩放项让分数差距回到更温和的范围,帮助权重保持可学习的分布。

为什么除以 √d_k 而不是直接除以 d_k

在常见的独立、零均值分量假设下,点积的方差会随着 d_k 大致增长。标准差则大致按 √d_k 增长,因此除以 √d_k 可以把分数的波动尺度拉回相对稳定的范围。

这不是为了让每个分数都变成固定数值,而是为了抵消维度增加带来的典型尺度变化。具体模型还会受到参数分布、归一化和训练过程影响,但 √d_k 是缩放点积注意力中与维度增长相匹配的自然选择。

缩放发生在 Softmax 之前

标准公式可以写成 Softmax(QK^T/√d_k)V。先算点积,再缩放,再 Softmax,最后把得到的权重作用于 Value。缩放必须进入 Softmax 的输入,才能改变概率分布的尖锐程度。

如果先做 Softmax,再对概率矩阵除以 √d_k,得到的行和就不再是 1,也不再是正常的注意力权重。除法会改变概率总量,却没有重新控制原始分数的相对差距;这和在归一化前调整 logits 是两件不同的事。

Transformer 缩放点积注意力中缩放发生在 Softmax 前的顺序示意图
缩放位置决定 Softmax 行为

正确顺序是点积、除以 √d_k、Softmax,再对 Value 加权;缩放放在 Softmax 后会破坏权重分布。

缩放不会改变谁更相关的基本顺序

在正数缩放的情况下,分数的大小顺序通常不会改变。原本较高的分数仍然较高,较低的分数仍然较低,变化的是它们之间的差距被压缩了。于是 Softmax 可以看到一组更平稳的 logits,而不是被极端差值推向近似 one-hot 的分布。

因此,缩放不是人为替模型指定关注位置,也不是把相关性重新排序。它更像是给分数调整合适的数值尺度,让模型能够在保持关系方向的同时,保留多个位置的可学习贡献。

多头注意力为什么每个头都要用自己的 d_k

多头注意力把模型宽度拆到多个子空间,每个头的 Query 和 Key 通常具有自己的 d_k。每个头在自己的子空间中计算点积,因此缩放项也根据该头的 Key 维度确定。

如果头的宽度相同,各头使用相同的缩放因子;如果某些变体使用不同的 Q/K 宽度,就需要按照实际点积维度处理。关键不是死记某个固定数字,而是确认缩放对应的是参与 QK 点积的最后一维。

Transformer 多头注意力各头根据自身 d_k 进行缩放的示意图
每个头在自己的 d_k 上缩放

多头注意力先形成各头的 Q 和 K 子空间,再按各头点积维度进行缩放和 Softmax。

缩放项和 LayerNorm 解决的问题不同

缩放点积发生在注意力分数进入 Softmax 之前,针对的是 QK 分数的尺度。LayerNorm 通常作用在子层输入输出的隐藏表示上,针对的是位置向量特征的整体数值尺度。两者都和稳定性有关,但处理对象和所在阶段不同。

把二者混在一起会造成误解:LayerNorm 不能替代注意力分数中的 √d_k,√d_k 也不是对整个隐藏状态做归一化。一个调整 logits,一个调整隐藏表示,各自服务于不同的计算环节。

如果没有缩放,可能出现什么现象

在模型维度较大时,没有缩放可能让 Softmax 权重过度集中,注意力输出长期依赖少数位置。训练中相关位置之间的权重差异会变得很极端,非最高分位置的梯度信号变弱,模型学习多种关系会更加困难。

这并不意味着没有缩放就一定无法运行。小维度、特殊初始化或其他归一化方式可能让系统暂时工作,但经典 Transformer 选择显式缩放,是为了让注意力计算在不同 d_k 下更容易保持稳定。

用一条计算链记住它

第一步,Q 和 K 做点积,得到未归一化的相关性分数;第二步,除以 √d_k,控制分数的典型波动尺度;第三步,加入需要的掩码;第四步,Softmax 得到注意力权重;第五步,用权重对 V 做加权求和。

缩放项的位置、分母和作用对象都可以从这条链路中检查。它不是装饰性的常数,而是把向量维度、点积分数和概率归一化连接起来的一步。

常见问题

为什么缩放项是 √d_k?

点积的方差通常会随参与累加的维度增长,标准差大致按 √d_k 增长,用它缩放可以把分数波动拉回更合适的范围。

可以在 Softmax 后再除以 √d_k 吗?

不可以直接替代。Softmax 后的结果已经是概率分布,再除会破坏行和为 1 的性质,也不能解决 logits 过大的问题。

缩放会改变注意力最相关的位置吗?

正数缩放通常保留分数的相对顺序,主要改变差距大小和 Softmax 后的集中程度。