面试官提问:为什么在点积注意力计算中将结果除以embedding size的平方根?
面试者回答:
在Transformer中,对词向量(embedding)进行处理时,通常会将词向量与权重矩阵相乘,并且在点积注意力(dot-product attention)计算中会将结果除以词向量维度的平方根( d k \sqrt{d_k} dk)。这样设计的主要原因是为了避免数值过大,进而稳定模型的梯度和训练过程。
1. 点积注意力中的数值缩放问题
在点积注意力中,Query和Key的点积是用来衡量它们之间的相似度的。点积的计算公式为:
Attention
(
Q
,
K
,
V
)
=
softmax
(
Q
K
⊤
d
k
)
V
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
Attention(Q,K,V)=softmax(dkQK⊤)V
其中,
Q
Q
Q 是Query,
K
K
K 是Key,
d
k
d_k
dk 是词向量的维度(embedding size)。
当 d k d_k dk 较大时,Query和Key的点积结果会非常大。因为点积的值随着维度增加而增大,点积的数值通常是向量长度的数量级,这意味着如果不进行缩放,点积结果会变得非常大。一旦这个值过大,经过Softmax操作时,结果会趋近于极端(非常接近于0或1),从而导致梯度消失问题,进而使模型难以训练。
2. 平方根缩放的作用
为了减轻这种问题,将点积的结果除以 d k \sqrt{d_k} dk,即对点积进行缩放,使得数值保持在一个合理的范围内。这样做的主要好处是:
- 避免数值爆炸:当维度较高时,点积的值可能非常大,如果不进行缩放,Softmax的输出会变得非常极端,导致模型训练不稳定。通过除以 d k \sqrt{d_k} dk,可以将点积结果缩放到较小的范围,避免极端值出现。
- 提高梯度稳定性:数值过大会导致梯度的变化很小,甚至梯度消失,影响模型的学习效果。缩放后,梯度变化更加平滑,训练过程变得更为稳定。
3. 为何是 d k \sqrt{d_k} dk?
选择 d k \sqrt{d_k} dk 是因为,假设 Q Q Q 和 K K K 的元素是独立同分布的零均值和单位方差的随机变量,点积 Q K ⊤ QK^\top QK⊤ 的期望值是 d k d_k dk,因此点积的标准差大约为 d k \sqrt{d_k} dk。通过除以 d k \sqrt{d_k} dk 可以将标准差归一化到一个较小的范围,使得数值更稳定。
如果直接使用 d k d_k dk 进行缩放,数值会被缩得过小,导致信息的流动不畅。因此, d k \sqrt{d_k} dk 是一个较为合理的平衡,既避免了数值过大导致的梯度消失问题,又不会将数值缩得过小。
4. 对比未进行缩放的情况
在没有进行缩放的情况下,点积结果过大,经过Softmax后,大部分注意力权重会集中在少数几个元素上,无法平衡不同元素之间的相关性。最终的注意力机制会失去其应有的功能,使得模型过于依赖某些特定位置的信息,而忽略了序列中的其他重要信息。
总结:
在Transformer中,将Query和Key的点积结果除以词向量维度的平方根( d k \sqrt{d_k} dk),是为了:
- 避免数值过大,保持点积的数值在合理范围内。
- 确保Softmax输出更加平衡,使模型能够更有效地捕捉序列中的全局信息。
- 提高梯度的稳定性,使模型的训练更加稳定,减少梯度消失的风险。