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

Transformer 为什么要缩放点积注意力:sqrt(d_k) 如何稳定 Softmax

从 Scaled Dot-Product Attention 公式出发,解释点积为何会随维度变大、sqrt(d_k) 如何控制分数尺度,以及缩放为什么能让注意力训练更稳定。

相关工具

公式里那个缩放因子从哪里来

Transformer 的注意力计算通常写成 Attention(Q, K, V) = Softmax(QK^T / sqrt(d_k))V。资料 把它称为 Scaled Dot-Product Attention,也就是缩放点积注意力。公式看起来只比普通点积多了一步除法,但这一步直接关系到 Softmax 的输入范围和训练是否稳定。

Q 和 K 的点积负责衡量查询向量与键向量之间的匹配程度,V 则携带真正要汇聚的信息。先计算 QK^T 得到位置之间的分数,再除以键向量维度 d_k 的平方根,接着用 Softmax 把分数变成注意力权重,最后对 V 做加权求和。

缩放并不是为了改变哪个位置更相关,而是为了把分数控制在更合适的数值范围内。相对大小基本保留,绝对尺度被调整,Softmax 才不会因为维度变大而过早饱和。

Transformer 缩放点积注意力从 Q K V 到输出的计算流程图
Scaled Dot-Product Attention 完整流程

Q 与 K 先计算点积,再除以 sqrt(d_k),经过 Softmax 得到权重,最后与 V 加权求和。

点积为什么会随维度变大

把两个向量写成 q = (q_1, q_2, ..., q_d) 和 k = (k_1, k_2, ..., k_d),它们的点积就是 q_1k_1 + q_2k_2 + ... + q_dk_d。维度越大,参与相加的随机项越多,即使每一项的平均值接近 0,整体波动范围也会变大。

在常见的简化假设下,如果 q 和 k 的每个分量相互独立、均值为 0、方差为 1,那么每一项乘积的方差也处在相近尺度,d 个乘积相加后,点积的方差大致与 d 成正比,标准差大致与 sqrt(d) 成正比。

这意味着键向量维度从 64 增加到 512 时,未经缩放的 QK 分数可能出现更大的正负值。问题不在于某一个分数算错了,而在于整体分布的尺度随维度变化了。

不同键向量维度下点积分布方差和缩放效果对比图
点积方差随维度增长

点积是多个分量乘积的和,维度越大,分数的波动范围越宽;除以 sqrt(d_k) 可把尺度拉回稳定范围。

Softmax 过于尖锐会发生什么

Softmax 会把输入分数转换成总和为 1 的权重。当一个分数远高于其他分数时,Softmax 会把几乎全部权重分给它,其他位置的权重接近于 0。这样的分布看起来很确定,但也意味着大部分位置几乎没有机会参与输出。

在注意力层里,这会让模型过早地只盯住某一个位置。更重要的是,Softmax 在这种极端区域的梯度会变得很小,其他位置的权重难以调整,模型学习注意力关系的空间被压缩了。

如果分数尺度随着 d_k 改变,那么同一套初始化和学习率在不同维度下可能表现不同。模型尺寸一变,Softmax 的工作状态也跟着变,这会给训练带来不必要的不稳定。

缩放点积注意力前后 Softmax 权重和梯度有效性的对比图
缩放前后 Softmax 的差异

未缩放分数容易让注意力集中到单一位置,缩放后权重分布更平滑,更多位置保留有效梯度。

为什么是除以 sqrt(d_k)

如果点积的标准差大致与 sqrt(d_k) 成正比,那么除以 sqrt(d_k) 就能把分数的波动尺度拉回相近范围。缩放后的分数不再随着键向量维度线性变得更极端,Softmax 面对的输入范围也更容易保持稳定。

这里的目标不是让每个分数都变成某个固定值,而是让不同维度下的统计尺度大致可比。它是一种针对随机向量点积特性的归一化安排,和 LayerNorm、BatchNorm 等机制的放置位置和作用并不相同。

公式中使用的是 d_k,而不是整个模型的 d_model。因为点积实际发生在 Query 和 Key 的最后一维上,缩放因子应该对应参与点积的维度。多头注意力把模型维度切成多个头后,每个头都有自己的 d_k。

缩放改变了排序吗

在同一行分数中,除以一个正数不会改变分数的大小规律。原来分数最高的位置,缩放后仍然最高;原来分数最低的位置,缩放后仍然最低。改变的是分数之间的距离,而不是简单地把注意力关系倒过来。

这点很重要。缩放并不会替模型重新决定谁和谁相关,它只是让 Softmax 不要把已有的相对差异放大到过度极端。模型依然可以学习把权重集中在少数位置,只是这种集中要由数据和参数共同形成,而不是由维度尺度强行造成。

因此,看到缩放后注意力分布变得更平滑,不应该理解成模型失去了聚焦能力。它只是给了模型一个从较平滑分布开始学习的机会,后续仍可以通过训练逐渐形成明确的注意力模式。

它和注意力掩码如何配合

在实际计算中,缩放和掩码通常出现在同一条注意力路径里。先得到 QK^T,再除以 sqrt(d_k),然后把 Padding Mask 或 Sequence Mask 对应的位置加上很大的负数,最后交给 Softmax。这样,被遮挡的位置概率接近 0,其余位置再进行正常归一化。

掩码解决的是“哪些位置不允许关注”,缩放解决的是“允许关注的位置分数是否处在合适尺度”。如果没有掩码,缩放不能阻止解码器看到未来;如果没有缩放,掩码也不能缓解有效位置之间分数过大的问题。

两种机制叠加时,顺序和数值处理要保持一致。尤其要注意负无穷或足够大的负值如何加入分数矩阵,以及 Softmax 的归一化维度是否正确。

多头注意力中的缩放

多头注意力先把模型表示分别映射成多个 Query、Key、Value 子空间,每个头的键向量维度通常小于 d_model。每个头内部都会独立计算 QK^T / sqrt(d_k),得到自己的注意力权重和输出。

如果错误地使用 d_model 进行缩放,分母可能比当前头实际的键维度更大,导致分数被压得过小,注意力分布变得过于平;如果完全不缩放,多个头都可能遇到点积分数变大的问题。

多头机制负责让不同子空间关注不同关系,缩放负责让每个子空间里的注意力计算保持数值稳定。前者是表示能力设计,后者是计算尺度设计,两者解决的问题不一样。

和其他归一化方法有什么区别

LayerNorm 通常作用于某个位置的特征向量,调整该位置内部不同维度的数值分布;缩放点积作用于 Query-Key 的相似度分数,控制的是注意力矩阵进入 Softmax 前的尺度。它们可能同时存在,但归一化对象不同。

温度也可以改变 Softmax 分布的尖锐程度,从形式上看与除以某个数有相似之处。但 Transformer 的 sqrt(d_k) 是由点积维度带来的固定尺度修正,温度通常是为推理阶段调整生成分布,两者不能随意互换。

理解作用对象比记住名称更可靠:如果问题出在点积随维度变大,就先看缩放因子;如果问题出在残差相加后的特征尺度,就看 LayerNorm;如果问题出在生成随机性,再考虑温度和采样。

如何判断缩放是否真的生效

可以先检查公式和张量形状。确认 QK^T 的最后两个维度能够相乘,分母使用的是当前注意力头的 d_k,并且缩放发生在 Softmax 之前。只看最终输出是否有数值,不能证明缩放位置正确。

再看一行注意力分数和权重。缩放前后的排序通常相同,但缩放后的分数范围应该更收敛,Softmax 权重不应在初始化阶段普遍呈现一个位置接近 1、其余位置接近 0 的状态。

最后观察训练曲线和梯度。如果注意力权重长期极端、梯度很小或模型对初始化异常敏感,就需要检查缩放、掩码、学习率和初始化是否共同造成了问题。不要只因为损失能下降,就忽略中间分布已经饱和。

把缩放点积放回 Transformer 主线

Transformer 通过 Q、K、V 把输入表示变成可计算的注意力关系。QK^T 产生每个查询位置对所有键位置的匹配分数,除以 sqrt(d_k) 保持尺度稳定,Softmax 把分数变成权重,权重再对 V 做加权求和。

文中把这条路径概括为 Scaled Dot-Product Attention。它不是一个孤立的小技巧,而是注意力机制能够在较大维度下稳定工作的基础环节。后面的多头、掩码、残差和 LayerNorm 都是在这条计算路径上继续组织信息。

记住一句话就够了:点积负责比较,sqrt(d_k) 负责控尺度,Softmax 负责分配权重,V 负责携带内容。把四个动作分开,注意力公式就不再只是一个需要背下来的整体。

常见问题

为什么不是除以 d_k,而是除以 sqrt(d_k)?

在常见独立同分布的简化假设下,点积的方差大致与 d_k 成正比,标准差大致与 sqrt(d_k) 成正比,因此除以 sqrt(d_k) 可以把分数尺度拉回相近范围。

缩放会不会让注意力变得不够集中?

缩放只是在 Softmax 前控制分数尺度,不会改变同一行分数的排序。模型仍然可以通过训练形成集中的注意力,只是不会因为维度变大而被迫过早饱和。

缩放和 LayerNorm 是同一种归一化吗?

不是。缩放点积作用于 Query-Key 分数,LayerNorm 作用于特征向量。它们处理的对象和位置不同,可以在同一个 Transformer 中同时使用。