解释的好:Self-attention中dot-product操作为什么要被缩放 - 知乎
标准正太分布(0均值,1方差的高斯分布)
解释1:
解释2:
这样做是因为对于较大的深度值,点积的大小会增大,从而推动softmax函数往仅有很小的梯度的方向靠拢(分布集中在绝对值大的区域),导致了一种很硬的(hard)softmax。
例如,假设Q和K的均值为0,方差为1。它们的矩阵乘积将有均值为0,方差为 d_k (d_k 是Q或者K的维度大小)。因此,d_k 的平方根被用于缩放(而非其他数值),因为,Q和K的矩阵乘积的均值本应该为0,方差本应该为1,这样会获得一个更平缓的softmax。
解析3:
另外一个需要注意的点为什么要除以根号dk,因为Q和K的内积结果,随着其维度变大,方差会变大,进而可能会出现很大的值,除以根号dk保证输出结果的不会出现过大值,这个在原论文中是有说明注解的。
具体的期望方差推导公式看后面。
:
from math import exp
from matplotlib import pyplot as plt
import numpy as np
f = lambda x: exp(x * 2) / (exp(x) + exp(x) + exp(x * 2))
x = np.linspace(0, 100, 100)
y_3 = [f(x_i) for x_i in x]
plt.plot(x, y_3)
plt.show()
得到的图如下所示:
则:
注意上式中的Z_i, 是多维的,q_i, k_i 只是其中一个维度。
1、self-attention一定要这样表达吗?
不需要,能刻画相关性,相似性等建模方式都可以。最好速度快,模型好学,表达能力够。
2、有其他方法不用除根号dk吗?
有,同上,只要能做到每层参数的梯度保持在训练敏感的范围内,不要太大,不要太小。那么这个网络就比较好训练。方式有,比较好的初始化方法,类似于google的T5模型,就在初始化把这个事情干了。
参考文章: