Self-Attention 为什么需要 Scaling?
未标记
考查重点:点积方差与 softmax 饱和。Q/K 各维独立近似单位方差时点积方差随 d 增长,除√d 稳定尺度,避免 softmax 过饱和导致梯度变小
本题目录
参考答案
核心回答
Scaled Dot-Product Attention在softmax前将QKᵀ除以√d_k,主要为了控制点积logits的尺度。维度增加时,未缩放点积的方差会增大,softmax更容易接近one-hot,使其Jacobian中的许多项很小,影响优化。这里d_k是每个注意力头中Q/K的维度,不是token长度,也不一定等于模型隐藏维度。
Attention(Q,K,V) = softmax(QKᵀ / √d_k)V
为什么是平方根
在常见的简化假设下,q、k的分量相互独立、均值0、方差1,且各维乘积不相关:
q·k = Σ q_i k_i
E[q·k] = 0
Var(q·k) = d_k
Var((q·k)/√d_k) = 1
除以√d_k控制的是标准差;若除以d_k,方差会变成1/d_k,维度越大反而把logits压得越小。实际模型的分量不完全满足这些假设,因此这是解释设计动机的尺度分析,不是声称每一层实测方差恒为1。
对softmax有什么影响
softmax输出p的导数为:
∂p_i/∂z_j = p_i(δ_ij - p_j)
例如d_k=64,一行未缩放logits为[8,0],softmax约为[0.999665,0.000335];除以8后是[1,0],概率约[0.731059,0.268941]。前者较大概率项的对角导数约0.000335,后者约0.196612,说明分布过尖时softmax本身对logits变化可能不敏感。
但不能据此声称“没有Scaling,整个网络梯度一定消失”。最终梯度还经过损失、缩放及Q/K投影等链路;上例只比较softmax的局部导数。
常见追问
多头为什么用头维度? 每个头独立做点积,它的求和项数就是该头d_k。比如模型隐藏维度512、8个等宽头,通常每头64,缩放因子为8,而不是√512。
减最大值能替代Scaling吗? 不能。softmax(z−max(z))与softmax(z)数学相同,只是防止指数溢出;除以√d_k会改变logits差距及概率分布。Q/K归一化、可学习温度等变体也在调整尺度,但要依具体模型设计,不能随意替换检查点的计算方式。
对应教程
- 1-1-大模型认知与工程概览:把注意力logits尺度与反向传播中的局部梯度联系起来。
参考资料
- 国内:wdndev:Attention与Transformer:依据注意力缩放位置与头维度,说明正文中缩放因子应按每头 d_k 而非整个隐藏维度计算。
- 国内:WeThinkIn:模型架构与工作原理:依据 Q、K 投影与点积分数的关系,说明正文中 Scaling 调整的是 softmax 之前的 logits。
- 国内:Datawhale:第三章 大语言模型基础:参考 Self-Attention 公式中 softmax 的作用,解释正文中分数尺度如何改变注意力分布及局部导数。
- 国外:Vaswani等 / Google:Attention Is All You Need:依据方差假设和 sqrt(d_k) 推导,解释正文中控制标准差以避免 softmax 过尖的设计动机。
- 国外:PyTorch:Softmax:依据 softmax 公式,解释正文中除以 sqrt(d_k) 与减最大值分别改变分布和改善数值稳定性的区别。