维度大小与点积结果的方差
对于Attention矩阵中的每个值, 都是由某个位置的q向量和对应位置的k向量点积得到. 假设q向量和k向量的各分量都是相互独立的随机变量, 且均值是0, 方差是1, 那么点积q⋅k的均值为0, 方差为dk, 其中dk是向量的长度.
推导过程为: 对于∀i=1,⋯,dk, qi和ki是独立的随机变量, 记这两个随便变量为: X=qi, Y=ki. 则有E(X)=E(Y)=0, D(X)=D(Y)=1.
则:
E(XY)=E(X)E(Y)=0 D(XY)=E(X2⋅Y2)−[E(XY)]2=E(X2)E(Y2)−[E(X)E(Y)]2=E(X2−02)E(Y2−02)−[E(X)E(Y)]2=E(X2−[E(X)]2)E(Y2−[E(Y)]2)−[E(X)E(Y)]2=D(X)D(Y)−[E(X)E(Y)]2=1×1−(0×0)2=1 那么遍历∀i=1,⋯,dk, qi和ki的乘积都符合均值为0, 方差为1, 而且不同i之间是相互独立的, 把qi⋅ki这个随机变量记为Zi. 则有:
E(∑iZi)=∑iE(Zi)
D(∑iZi)=∑iD(Zi)
因此q⋅k点积的分布符合: E(q⋅k)=0, D(q⋅k)=dk. 即维度越高, 点积结果分布的方差越大.
Attention矩阵的基础是对所有的q和k向量两两点积计算. 而方差越大, 点积得到的结果值较大的概率也会越大, 即矩阵中每个位置取值越大, 则Attention矩阵中行向量的模长也会越大.
向量模长与Softmax梯度
对于一个输入向量x∈Rd, softmax函数将其归一化到一个分布y^∈Rd下. softmax计算过程中, 使用自然底数e将输入原始的差距先拉大, 然后再归一化为一个分布.
假设输入x向量中最大的元素对应的下标为k, 经过softmax转换后对应的y^k对应的概率也是最大的. 但如果输入向量的模长增加, 即输入向量中各个元素等比例扩大, 在每个输入元素都很大的情况下, 这时的y^k会非常接近1.
这时由于softmax的特性决定的, 对于向量x=[a,a,2a]⊤, softmax得到的y^3值随自变量a的变化如下图所示, 横坐标是a的值, 纵坐标是y^3的值:
可以看到, 输入向量的模长对softmax得到的分布影响非常大. 在模长较长时, softmax归一化的结果, 几乎将所有概率都分配给输入最大值的位置, 其余位置的结果基本为0.
解决方法
因此在Transformer结构中, 在向量两两点积获得点积结果矩阵后, 需要先将点积结果除以dk, 然后再对行向量进行softmax, 以避免梯度消失. 因为对点积结果除以dk, 会使得结果的分布方差回归到1:
D(dkq⋅k)=(dk)2dk=1 消除了模长过大的问题, 进而消除了梯度消失的情况.
参考资料