Skip to content

第 4 章:dk 是什么,为什么要除以它的平方根 ​

返回目录

这一章把你连续追问的dk、方差定义、方差相加和缩放放在一起。先说明符号,再用原来的正负1例子;证明用到均值为0时,立即解释依据,不再让你跳到后面寻找。

4.1 dk先表示什么 ​

d_k 指的是 Key 向量(键向量)的维度,也等于 Query 向量的维度。

回顾 Transformer 中的注意力公式:

\operatorname{Attention}(Q,K,V)
=\operatorname{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

假设输入的每个 Token 是一个 512 维向量:

x_i\in\mathbb R^{512}

经过线性变换:

q_i=x_iW_Q,\qquad k_i=x_iW_K

我们可以把 Query 和 Key 都映射到 64 维:

q_i,k_i\in\mathbb R^{64}

此时:

\boxed{d_k=64}

它们的点积为:

q_i\cdot k_j=\sum_{r=1}^{64}q_{ir}k_{jr}

也就是 64 个乘积项相加。

因此需要除以:

\sqrt{d_k}=\sqrt{64}=8

注意区分三个不同的维度 ​

符号含义假设值
d_{\text{model}}Token 在模型中的表示维度512
d_k每个注意力头的 Query、Key 维度64
d_v每个注意力头的 Value 维度64

如果有 8 个注意力头,经典配置中通常是:

d_k=d_v=\frac{d_{\text{model}}}{8}=64

但这只是常见的设计选择,并不是数学上必须如此。

最重要的一点:d_k 不是 Token 的数量,而是用于计算一次 Query–Key 点积的向量维度。

例如一句话有 20 个 Token,每个注意力头的 Key 是 64 维,那么:

n=20,\qquad d_k=64

最终 QK^T 的大小是 20\times20,而缩放因子仍然是 \sqrt{64}=8。

4.2 先看缩放的理由,再把方差细节补全 ​

前面为了说明 Softmax,故意省略了这一步。

实际 Transformer 并不是直接计算:

s_j=q\cdot k_j

而是:

\boxed{s_j=\frac{q\cdot k_j}{\sqrt{d_k}}}

原因与高维向量的点积有关。

你知道二维点积是:

q\cdot k=q_1k_1+q_2k_2

如果是 64 维:

q\cdot k=\sum_{r=1}^{64}q_rk_r

现在是 64 项相加。

假设这些乘积项大致独立,每项均值为 0、方差为 1,那么 64 项之和的方差就是 64,标准差是:

\sqrt{64}=8

而如果只有 4 维,其标准差则是:

\sqrt4=2

所以在这样的统计假设下,维度越高,点积结果的典型波动幅度越大,规模大约正比于 \sqrt{d_k}。

如果不缩放,Softmax 很容易得到特别极端的结果,比如:

(0.999,\ 0.001,\ \text{接近 }0)

过于极端的 Softmax 可能导致梯度很小,不利于训练。

因此,把点积除以 \sqrt{d_k},就能使其数值尺度相对稳定。

这是一个基于典型统计假设的解释,并不是说所有高维向量的点积都必然很大。


4.3 先不考虑 Transformer,假设有 4 个随机数 ​

假设每个随机数 X_i 都有以下分布:

X_i=
\begin{cases}
+1 & \text{概率为 }1/2\\
-1 & \text{概率为 }1/2
\end{cases}

并且它们相互独立。

每一个随机数的期望为:

E(X_i)=0.5(1)+0.5(-1)=0

方差为:

\begin{aligned}
\operatorname{Var}(X_i)
&=E[(X_i-E(X_i))^2]\\
&=0.5(1)^2+0.5(-1)^2\\
&=1
\end{aligned}

因此,每个随机数都是:

\boxed{\text{均值}=0,\quad\text{方差}=1,\quad\text{标准差}=1}

现在把 4 个随机数相加:

S=X_1+X_2+X_3+X_4

你可能直觉上认为:四个随机数的标准差都是 1,加起来之后标准差应该是 4。

但我们实际上可以把所有可能结果列出来。

总和 S16 种组合中出现次数概率
−411/16
−244/16
066/16
244/16
411/16

你会发现,虽然理论上可以取到 4 或 -4,但最常见的结果反而是 0。

原因很简单:随机的正负数会相互抵消。

我们计算这 4 个数之和的方差。

因为 E(S)=0,所以:

\begin{aligned}
\operatorname{Var}(S)
&=E(S^2)\\
&=\frac{1}{16}(16+4\times4+6\times0+4\times4+16)\\
&=\boxed{4}
\end{aligned}

因此标准差为:

\boxed{\operatorname{SD}(S)=\sqrt4=2}

注意:虽然 4 个随机数相加可以得到最大值 4,但总和的标准差只有 2。

4.4 先补上你追问的方差定义 ​

因为我们前面假设 X 和 Y 的期望都等于 0,所以方差的定义可以简化。

我们从方差(Variance)的定义开始。

方差的定义 ​

对于任意随机变量 Z,方差定义为:

\boxed{\operatorname{Var}(Z)=E[(Z-E[Z])^2]}

这里:

  • E[Z]:随机变量 Z 的期望,也就是均值。
  • Z-E[Z]:随机变量与均值的偏差。
  • (Z-E[Z])^2:偏差的平方。
  • E[(Z-E[Z])^2]:平方偏差的平均值。

所以,方差就是随机变量相对于自身均值的平方偏差的期望。

为什么这里可以省略均值? ​

我们令:

Z=X+Y

代入方差定义:

\operatorname{Var}(X+Y)
=E[((X+Y)-E[X+Y])^2]

因为期望满足线性性质:

E[X+Y]=E[X]+E[Y]

而我们之前假设:

E[X]=E[Y]=0

因此:

E[X+Y]=0+0=0

代回方差公式:

\begin{aligned}
\operatorname{Var}(X+Y)
&=E[((X+Y)-0)^2]\\
&=\boxed{E[(X+Y)^2]}
\end{aligned}

这就是那个等式成立的原因。

注意:这里根本不需要假设 X 和 Y 独立。只要它们的和的期望为 0,就能这样简化。

如果均值不是 0 呢? ​

例如:

E[X]=2,\qquad E[Y]=3

那么:

E[X+Y]=5

此时必须写成:

\operatorname{Var}(X+Y)=E[(X+Y-5)^2]

而不能直接写成 E[(X+Y)^2]。

实际上,把方差定义展开,还可以得到一个常用的恒等式:

\boxed{\operatorname{Var}(Z)=E[Z^2]-(E[Z])^2}

它对任何具有有限方差的随机变量都成立。

因此,当 E[Z]=0 时:

\operatorname{Var}(Z)=E[Z^2]

总结:方差并不总是平方的期望,只有均值为 0 时,二者才相等。

另外,你可以注意到两种性质所需的条件不同:

  • E[X+Y]=E[X]+E[Y]:不需要独立。
  • \operatorname{Var}(X+Y)=\operatorname{Var}(X)+\operatorname{Var}(Y):需要 \operatorname{Cov}(X,Y)=0,独立是保证这一点的充分条件,但不是必要条件。

这一区别正是理解 Transformer 中点积方差推导的关键。

4.5 为什么方差是直接相加的? ​

我们现在从数学上证明这个性质。

假设有两个独立随机变量 X,Y,其期望都为 0。

那么:

\operatorname{Var}(X+Y)=E[(X+Y)^2]

展开平方:

=E[X^2+2XY+Y^2]

利用期望的线性性质:

=E[X^2]+2E[XY]+E[Y^2]

这里最关键的是:

如果 X,Y 相互独立,那么:

E[XY]=E[X]E[Y]=0

所以中间的交叉项消失了!

得到:

\boxed{\operatorname{Var}(X+Y)=\operatorname{Var}(X)+\operatorname{Var}(Y)}

因此,对于 n 个相互独立、方差都是 1 的随机变量:

\operatorname{Var}\left(\sum_{i=1}^n X_i\right)=n

而标准差是方差的平方根:

\boxed{
\operatorname{SD}\left(\sum_{i=1}^n X_i\right)=\sqrt n
}

这里就出现了我们需要的平方根。

4.6 回到 Transformer 的点积 ​

假设 Query 和 Key 都是 64 维:

q=(q_1,q_2,\ldots,q_{64})
k=(k_1,k_2,\ldots,k_{64})

点积为:

q\cdot k=\sum_{i=1}^{64}q_i k_i

我们将每一项记为:

X_i=q_i k_i

如果假设每个 q_i,k_i 都独立、均值为 0、方差为 1,那么:

E(X_i)=E(q_i)E(k_i)=0

而且:

\begin{aligned}
\operatorname{Var}(X_i)
&=E(q_i^2k_i^2)\\
&=E(q_i^2)E(k_i^2)\\
&=1
\end{aligned}

也就是说,每一个维度的乘积项,也具有均值 0、方差 1 的性质。

如果不同维度之间也相互独立,那么根据上一节的结论:

\operatorname{Var}(q\cdot k)=64

因此:

\boxed{\operatorname{SD}(q\cdot k)=8}

我们看维度不断增加时会发生什么。

由上述推导可见:维度越高,原始点积的标准差越大;但除以 \sqrt{d_k} 之后,标准差在这一假设下就保持为 1。

要特别区分:

  • 标准差为 8,不是说点积必然等于 8。
  • 而是说点积围绕均值 0 的波动尺度为 8。
  • 如果分布近似正态,那么约 68% 的点积结果会落在 -8 到 8 之间。

4.7 为什么要除以 √64,而不是除以 64? ​

这时就很好理解了。

64 维时:

\operatorname{SD}(q\cdot k)=8

如果直接除以 64:

\operatorname{SD}\left(\frac{q\cdot k}{64}\right)
=\frac8{64}=0.125

这样标准差反而会随着维度增加而不断减小。

但是如果除以 8:

\operatorname{SD}\left(\frac{q\cdot k}{8}\right)
=\frac88=1

就回到了单位标准差。

因此 Transformer 使用:

\boxed{\frac{q\cdot k}{\sqrt{d_k}}}

目的不是让点积的值落在某个固定范围内,而是在上述统计假设下,使不同维度的点积分数具有大致相同的波动尺度,避免 Softmax 因输入分数过大而容易饱和。

4.8 还有一个可以联系你已有知识的地方:随机游走 ​

你可以把每一个 +1 或 -1 看成数轴上随机向左或向右走一步。

假设走 64 步:

  • 如果始终往右走,位移可以达到 64。
  • 但如果方向完全随机,很多步会彼此抵消。
  • 最终位移的均方根是 \sqrt{64}=8。

这和点积中 64 个随机乘积项相加,具有相同的数学结构。

所以 \sqrt{d_k} 的来源,本质上就是独立随机项求和时,标准差按平方根规律增长。

最后还有一个细节:这个推导依赖于各维度独立、均值及方差满足特定条件的假设。真正训练好的 Transformer 中,Q、K 的各维度并不一定严格独立或服从这种分布,因此除以 \sqrt{d_k} 是合理的尺度调整方法,而不是能保证所有情况下方差都恰好为 1 的数学定理。

4.9 尺度为什么影响Softmax ​

把分数差放大,Softmax就更容易把比例集中到一个候选。例如(1,0)还会给第二项明显份额,而(100,0)几乎全部给第一项。

对比例a_j和分数s_k求导,有:

\frac{\partial a_j}{\partial s_k}=a_j(\delta_{jk}-a_k).

\delta_{jk}在j=k时为1,否则为0。若一项接近1、其余接近0,这些导数就接近0,经过注意力比例传回的梯度可能变小。除以根号dk,是帮助控制输入分数尺度,而不是保证所有训练问题都被解决。

这个导数怎样从Softmax求出,第15章保留了商法则的逐步推导。这里不要求先学会矩阵求导。

保留每一次追问,认真走完每一步证明。