0%
🎓 Academic

一句「我们怀疑」:注意力为什么要除以 √dₖ

在 Transformer 论文的一句话旁边,摆三张实验纸。先估点积会长多快,再看 softmax 怎样变得固执,最后回到那句「We suspect」。

Ashish Vaswani, Noam Shazeer, Niki Parmar, et al.

NeurIPS 2017 · 2017

读论文时,最容易滑过去的,往往不是一页推导,而是一句听起来很合理的话。

《Attention Is All You Need》第 3.2.1 节就有这样一句:

We suspect that for large values of dₖ, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients.

大意是:我们怀疑,当维度很大时,点积的数值也会变大,把 softmax 推进梯度极小的区域。于是作者在点积后面除以 dk\sqrt{d_k}。

先别急着把这句话抄成「为了防止梯度消失」。圈住开头的 We suspect:这里有一条因果链,足够合理,也足够短,短到我们可以把每一环拆开试试。

这篇不重讲整套 Transformer。只需要知道:一个 query 与若干 key 做点积,得到一排分数;softmax 再把分数变成总和为 1 的注意力份额。结构梳理可以另看原论文笔记。

第一张纸:一百个人推车,还是一个人醉步?

点积,就是把对应位置乘起来,再加在一起:

q⋅k=q1k1+q2k2+⋯+qdkd.q\cdot k=q_1k_1+q_2k_2+\cdots+q_dk_d.

如果每一项都是正的,多加一百项,当然像多找一百个人朝同一边推车。

但论文脚注里的设定不是这样。各分量独立,均值 0、方差 1;乘出来的项有正有负,有人往左,也有人往右。这里用独立标准正态数造向量,满足这些条件。正文用 d 简写 dₖ。理论不要求正态分布;这里选正态,只是为了有一份明确、可重复的实验配方。

现在从 4 维换到 512 维,维度翻了 128 倍。点积的「典型大小」会翻几倍?我们用标准差量它:不是平均值,而是这些点积在零附近散得多开。

先留一个估计,再抽两批向量。预测可跳过;两张直方图使用相同的坐标尺度。

默认这批样本,标准差从 2.01 变成 22.36,约 11.13 倍。再抽一批会稍有变化,却仍在 128≈11.31\sqrt{128}\approx11.31 附近,而不是 128。

更像醉汉走路:每一步都走了,正反方向却抵掉不少。独立、等概率向左右走 100 步,最终位移的标准差是 10 步,不是 100 步。「10 步」说的是位移标准差,不是每一次都离家 10 步,也不是绝对距离的期望。

把这个直觉压成三行

在脚注的独立性假设下,每个乘积的均值是 0、方差是 1。独立项相加时,相加的是方差,不是标准差:

E[qiki]=0,Var⁡(qiki)=1,\mathbb E[q_i k_i]=0,\qquad \operatorname{Var}(q_i k_i)=1, Var⁡(q⋅k)=d,SD⁡(q⋅k)=d.\operatorname{Var}(q\cdot k)=d,\qquad \operatorname{SD}(q\cdot k)=\sqrt d.

所以除以 d\sqrt d,不是一个神秘的经验常数。它刚好把这个假设下随维度增长的标准差拉回 1。

为什么乘积的方差是 1?

因为 qᵢ 与 kᵢ 独立,且均值为零、二阶矩为 1:

E[(qiki)2]=E[qi2]E[ki2]=1.\mathbb E[(q_i k_i)^2]=\mathbb E[q_i^2]\mathbb E[k_i^2]=1.

减去均值的平方,还是 1。不同 i 的乘积也相互独立,所以求和时没有协方差项。如果分量相关,这一步就不能直接照抄。

第二张纸:票数没换边,音量开大了

点积变大为什么会影响 softmax?先换个更小的实验:别换向量,也别换赢家,只把一排分数一起乘上一个数。

这很像同一群人投票,排序没变,但票数差距被放大了。softmax 用指数看待差距:分数相差 1,份额比是 ee;相差 10,份额比就是 e10e^{10}。

pi=esi∑jesj.p_i=\frac{e^{s_i}}{\sum_j e^{s_j}}.

把下面的尺度往右拖。先看谁拿走了注意力,再看另一栏:赢家自己的分数略微变化时,它的份额还愿意动多少?

固定一行分数的形状,只放大差距。份额与自身灵敏度并排显示,可以把每个位置的数字摊开看。

到 16 倍时,默认赢家 H 拿走约 99.62% 的份额,它自己的灵敏度却只剩 0.00379。再放大,柱子更满,灵敏度更小。

这里有个容易漏掉的小弯:刚开始放大时,灵敏度不一定下降。对于自己的那一项,

∂pi∂si=pi(1−pi),\frac{\partial p_i}{\partial s_i}=p_i(1-p_i),

它在 pi=0.5p_i=0.5 时最大。份额从很小往一半走,反而会更灵敏;接近一边倒以后,才越来越推不动。其他项的导数是 −pipj-p_ip_j,同样在独占极限下趋近于零。

所以「赢家通吃」不只是输家没份额。赢家已经快到天花板,自己也没有多少可以继续增加的空间。

第三张纸:把尺子换掉,不是把声音越压越小

既然分数太大不好,那干脆除以 d,不是压得更稳吗?

先别替它下结论。下面把三把尺子放在一起:不缩放、除以 d\sqrt d、除以 d。看维度增加时,那条表示标准差的线往哪里走。

同一批样本,换三把尺子;虚线是理论,实线是测量。拖动维度,检查对应读数。

不缩放,线往上爬。除以 d\sqrt d,大致横着走。除以 d,则一路往下缩。

在这套假设里,除以 d 后的标准差是 1/d1/\sqrt d。维度越大,分数越挤在一起;对于固定数量的位置,softmax 就越接近平均分配。八个位置都快拿到八分之一,和一个位置独占,是两个相反的极端。

我们要的不是「越小越好」,而是先别让维度这个旋钮,偷偷替另一个旋钮调了音量。模型当然可以学出很尖或很平的注意力,但那不该仅仅因为把向量从 64 维加到了 512 维。

带着三张纸,重新读那句话

现在回到开头,把一句话拆成三处停顿。

「for large values of dₖ」——第一张纸告诉我们,在指定假设下,变大的是点积的波动尺度,按平方根增长;不是所有点积都变正、也不是均值向上走。

「pushing the softmax function」——第二张纸把维度暂时拿开,只放大同形分数,隔离出「分数差距 → 份额集中 → 局部灵敏度降低」这一环。

「extremely small gradients」——这是 softmax 接近饱和时的性质。但从这个性质到「某个真实模型因此训练更差」,还隔着训练实验。三张纸没有替作者把那场实验做完。

开头那句是机制解释;NeurIPS 版脚注 4 则在假设下给出了可直接推导的方差结论。不要把二者都读成猜测,也不要把二者都读成已经证明的训练定理。

真实 q、k 一定独立、方差为 1 吗?

不一定。它们来自可学习的投影,可能共享输入,也可能在训练中形成相关性;分量的尺度也会变化。脚注给的是一个解释尺度的简化起点,而不是对所有注意力层的永久描述。

所以这里能得出的结论是:在这套独立、零均值、单位方差的设定下,除以平方根抵消维度带来的尺度增长。不能据此断言所有参数化方式下,只有这个缩放才会训练好。

下次遇到「我们怀疑」,先别划重点

可以先在页边画三个小格:它声称什么会变化?我能单独改变什么?什么结果会让我改主意?

这次,第一个实验测尺度,第二个只放大一行,第三个换尺子。每张纸都很小,小到不用训练 Transformer,也不用先相信结论;同时也小到知道自己没有验证整篇论文。

想改实验配方,模型在 model.js,检验在 checks.test.js。它们不依赖第三方库。直方图是本地生成的教学样本,不是论文的训练结果;默认种子固定,换一批按钮让你看抽样波动。

读懂一篇论文,不一定是把作者说的话再说一遍。有时,是在一句「我们怀疑」旁边,留下自己的三张实验纸。

Attention Is All You Need原论文:第 3.2.1 节的缩放点积注意力。arxiv.org NeurIPS 2017 论文 PDF本文核对原句与脚注编号所用的版本:第 4 页,脚注 4。papers.neurips.cc