为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)

为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第1张图片

解释的好:Self-attention中dot-product操作为什么要被缩放 - 知乎

标准正太分布(0均值,1方差的高斯分布)

解释1:

为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第2张图片

解释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保证输出结果的不会出现过大值,这个在原论文中是有说明注解的。

为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第3张图片

具体的期望方差推导公式看后面。



​:

为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第4张图片

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()

 得到的图如下所示:

为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第5张图片

 为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第6张图片

 为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第7张图片

 为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第8张图片

 则:为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第9张图片

注意上式中的Z_i, 是多维的,q_i, k_i 只是其中一个维度。

为什么在进行softmax之前需要对attention进行scaled(为什么除以 d_k的平方根)_第10张图片

1、self-attention一定要这样表达吗?

不需要,能刻画相关性,相似性等建模方式都可以。最好速度快,模型好学,表达能力够。

2、有其他方法不用除根号dk吗?

有,同上,只要能做到每层参数的梯度保持在训练敏感的范围内,不要太大,不要太小。那么这个网络就比较好训练。方式有,比较好的初始化方法,类似于google的T5模型,就在初始化把这个事情干了。

参考文章:

self-attention为什么要除以根号d_k_tyler的博客-CSDN博客

你可能感兴趣的:(AI之路,-,Face,神经网络,深度学习,自然语言处理)