在Self-Attention机制中,为什么需要对 Q K T QK^T QKT 的结果进行缩放,除以 d k \sqrt{d_k} dk。以下是详细解释:
缩放的原因
除以 d k \sqrt{d_k} dk 的原因有两个:
- 防止输入过大:如果不缩放, Q K T QK^T QKT的值可能会非常大,这会导致Softmax的值非常小,接近于0,从而造成梯度消失问题。
- 归一化:缩放使得 Q ⋅ K Q\cdot K Q⋅K 的结果满足均值为0,方差为1的分布,类似于归一化的效果。
数学推导
假设 Q Q Q和 K K K中的元素是从均值为0,方差为1的独立同分布随机变量。设 X = q i X = q_i X=qi和 Y = k i Y = k_i Y=ki,则:
- E ( X ) = E ( Y ) = 0 E(X) = E(Y) = 0 E(X)=E(Y)=0
- D ( X Y ) = E ( X 2 ) E ( Y 2 ) − [ E ( X ) E ( Y ) ] 2 = 1 ⋅ 1 − 0 = 1 D(XY) = E(X^2)E(Y^2) - [E(X)E(Y)]^2 = 1 \cdot 1 - 0 = 1 D(XY)=E(X2)E(Y2)−[E(X)E(Y)]2=1⋅1−0=1
因此, D ( ∑ i = 1 d k q i k i ) = d k D\left(\sum_{i=1}^{d_k} q_i k_i\right) = d_k D(∑i=1dkqiki)=dk。
对
Q
K
T
QK^T
QKT 的缩放:
D
(
Q
K
T
d
k
)
=
1
d
k
D
(
∑
i
=
1
d
k
q
i
k
i
)
=
1
d
k
⋅
d
k
=
1
D\left(\frac{QK^T}{\sqrt{d_k}}\right) = \frac{1}{d_k} D\left(\sum_{i=1}^{d_k} q_i k_i\right) = \frac{1}{d_k} \cdot d_k = 1
D(dkQKT)=dk1D(∑i=1dkqiki)=dk1⋅dk=1
好的,让我们通过一个具体的例子来说明 (d_k) 的作用以及为什么要除以 (\sqrt{d_k})。
假设我们有一个查询向量 q \mathbf{q} q 和一个键向量 k \mathbf{k} k,它们的维度 d k = 4 d_k = 4 dk=4。这些向量的元素是均值为0、方差为1的独立同分布随机变量。我们具体来看下这两个向量的点积结果以及缩放后的结果。
假设:
q
=
[
1.2
,
−
0.5
,
0.3
,
0.8
]
\mathbf{q} = [1.2, -0.5, 0.3, 0.8]
q=[1.2,−0.5,0.3,0.8]
k
=
[
0.6
,
−
0.1
,
−
1.5
,
0.7
]
\mathbf{k} = [0.6, -0.1, -1.5, 0.7]
k=[0.6,−0.1,−1.5,0.7]
计算点积:
q
⋅
k
=
1.2
×
0.6
+
(
−
0.5
)
×
(
−
0.1
)
+
0.3
×
(
−
1.5
)
+
0.8
×
0.7
\mathbf{q} \cdot \mathbf{k} = 1.2 \times 0.6 + (-0.5) \times (-0.1) + 0.3 \times (-1.5) + 0.8 \times 0.7
q⋅k=1.2×0.6+(−0.5)×(−0.1)+0.3×(−1.5)+0.8×0.7
=
0.72
+
0.05
−
0.45
+
0.56
= 0.72 + 0.05 - 0.45 + 0.56
=0.72+0.05−0.45+0.56
=
0.88
= 0.88
=0.88
不进行缩放时,这个点积结果直接用于Softmax计算。但是,当 (d_k) 很大时,这个值可能会非常大,导致Softmax输出非常尖锐。为了避免这种情况,我们将点积结果除以 (\sqrt{d_k}) 来进行缩放。
在本例中, d k = 4 d_k = 4 dk=4,因此 d k = 2 \sqrt{d_k} = 2 dk=2。
缩放后的点积结果:
q
⋅
k
d
k
=
0.88
2
=
0.44
\frac{\mathbf{q} \cdot \mathbf{k}}{\sqrt{d_k}} = \frac{0.88}{2} = 0.44
dkq⋅k=20.88=0.44
现在我们来比较一下经过Softmax之前的值和经过缩放后的值在Softmax函数中的效果:
假设有另外两个查询向量和键向量的点积结果分别为2.0和0.5,计算Softmax之前和之后的值。
不缩放时的点积结果:
未缩放的点积值
=
[
0.88
,
2.0
,
0.5
]
\text{未缩放的点积值} = [0.88, 2.0, 0.5]
未缩放的点积值=[0.88,2.0,0.5]
Softmax计算:
Softmax
(
0.88
,
2.0
,
0.5
)
=
[
e
0.88
e
0.88
+
e
2.0
+
e
0.5
,
e
2.0
e
0.88
+
e
2.0
+
e
0.5
,
e
0.5
e
0.88
+
e
2.0
+
e
0.5
]
\text{Softmax}(0.88, 2.0, 0.5) = \left[ \frac{e^{0.88}}{e^{0.88} + e^{2.0} + e^{0.5}}, \frac{e^{2.0}}{e^{0.88} + e^{2.0} + e^{0.5}}, \frac{e^{0.5}}{e^{0.88} + e^{2.0} + e^{0.5}} \right]
Softmax(0.88,2.0,0.5)=[e0.88+e2.0+e0.5e0.88,e0.88+e2.0+e0.5e2.0,e0.88+e2.0+e0.5e0.5]
≈
[
0.184
,
0.643
,
0.173
]
\approx [0.184, 0.643, 0.173]
≈[0.184,0.643,0.173]
缩放后的点积结果:
缩放的点积值
=
[
0.44
,
1.0
,
0.25
]
\text{缩放的点积值} = [0.44, 1.0, 0.25]
缩放的点积值=[0.44,1.0,0.25]
Softmax计算:
Softmax
(
0.44
,
1.0
,
0.25
)
=
[
e
0.44
e
0.44
+
e
1.0
+
e
0.25
,
e
1.0
e
0.44
+
e
1.0
+
e
0.25
,
e
0.25
e
0.44
+
e
1.0
+
e
0.25
]
\text{Softmax}(0.44, 1.0, 0.25) = \left[ \frac{e^{0.44}}{e^{0.44} + e^{1.0} + e^{0.25}}, \frac{e^{1.0}}{e^{0.44} + e^{1.0} + e^{0.25}}, \frac{e^{0.25}}{e^{0.44} + e^{1.0} + e^{0.25}} \right]
Softmax(0.44,1.0,0.25)=[e0.44+e1.0+e0.25e0.44,e0.44+e1.0+e0.25e1.0,e0.44+e1.0+e0.25e0.25]
≈
[
0.272
,
0.459
,
0.269
]
\approx [0.272, 0.459, 0.269]
≈[0.272,0.459,0.269]
可以看到,经过缩放后,Softmax的输出分布更加平滑,不再像未缩放前那样有较大的差异,这有助于梯度的稳定性和模型的训练效果。
通过这个例子,我们可以清楚地看到为什么在自注意力机制中对点积结果进行缩放是必要的,这样可以防止数值过大导致的问题,并且让Softmax的输出更为合理。
结论
通过上述推导,我们可以看到:
- 对 (QK^T) 进行缩放,使其满足均值为0,方差为1的分布。
- 这样处理后的值更加稳定,输入到Softmax函数后可以避免梯度消失问题。
综合解释
- 为什么要缩放:缩放可以防止输入到Softmax的值过大,导致梯度消失,同时使得分布更稳定。
- 缩放因子 d k \sqrt{d_k} dk:因为键向量 K K K 的维度为 d k d_k dk,在计算点积时需要对结果进行缩放,使其方差为1,保持稳定性。
通过对这些细节的处理,Self-Attention机制能够在训练和推理过程中保持数值稳定性和计算效率。