面试题

我们知道attention其实有很多种形式,而transformer论文中的attention是Scaled Dot-Porduct Attention 来计算keys和queries之间的关系。

如下图所示:

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_agi

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_agi_02

公式一

在公式一中,作者对 Q 和 K 进行点积以获得注意力权重,然后这些权重用于加权平均 V 。但在实际实现中,这个点积会被缩放,即除以keys的维度的平方根,常常表示为 。这里 是key向量的维度。

细心的同学都会发现,Attention 计算公式 中会 除以 根号d,那问题来了!!!

Attention为什么要除以根号d 呢?

注:这个题目属于 NLP 面试中一个高频题,基本上问到 Attention 或者 Transformers 的时候都会问。(小编在找实习的时候,就被问了不止十次,现在抽空整理一下答案。)

标准答案

这个问题在《Attention is All Your Need》论文中,作者就对该问题进行解答。

While for small values of the two mechanisms perform similarly, additive attention outperforms dot product attention without scaling for larger values of [3]. We suspect that for large values of, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients . To counteract this effect, we scale the dot products by

如果你没看懂上面英文答案,那下面我就对其进行解释:

从论文中可以看出,随着 的值变大,点积的大小会增大,从而推动softmax函数往仅有很小的梯度的方向靠拢(分布集中在绝对值大的区域),导致softmax 函数容易导致梯度消失问题。

例如,假设Q和K的均值为0,方差为1。它们的矩阵乘积将有均值为0,方差为 ( 是Q或者K的维度大小)。因此, 的平方根被用于缩放(而非其他数值),因为,Q和K的矩阵乘积的均值本应该为0,方差本应该为1,这样会获得一个更平缓的softmax。

如果你在面试过程中也遇到该问题,可以回答:

随着 的值变大,点积的大小会增大,如果没有及时对点积的大小进行缩放,那么万一点积的数量级很大,softmax的梯度就会趋向于0,也就会出现梯度消失问题。

问题引申新问题

当你按上述答案回答后,基本能够回答上点,但是面试官为了考察你对该问题的深度,会进行问以下两个问题:

  1. 为什么 变大会使得 softmax 梯度变小,从而导致梯度消失呢?
  2. 除了 , 是否可以用其他值代替?
  3. self-attention一定要这样表达吗?
  4. 有其他方法不用除根号dk吗?

问题一:为什么 变大会使得 softmax 梯度变小,从而导致梯度消失呢?

标准答案:输入softmax的值过大,会导致偏导数趋近于0,从而导致梯度消失

下面我们将对该问题进行证明:

对于一个输入向量 , softmax函数将其映射归一化到一个分布 。

此时,softmax函数会先采用一个自然底数 e 将输入中的元素间差距先“拉大”,然后归一化为一个分布。假设某个输入 x 中最大的的元素下标是 k ,如果输入的数量级变大(每个元素都很大),那么 会非常接近1。

举个栗子,假定输入 ,对于不同量级的 a 产生的, 的值将发生什么变化:

a=1时,;

a=10时,;

a=100 时,(计算机精度限制)。

通过以下代码:

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

绘制图像如下:

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_人工智能_03

从图像中,我们发现数量级对于 softmax 函数的分布影响还是很大的。在数量级增大到某个值时,softmax 函数全部概率分布将趋于最大值对应阿标签

接下来,我们一起来分析一个 softmax 函数的梯度,这里我们将 softmax 函数 设定为 ,softmax 函数对应的分布向量 的梯度为:

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_算法_04

通过将该矩阵展开:

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_人工智能_05

根据前面的讨论,当输入 x 的元素均较大时,softmax会把大部分概率分布分配给最大的元素假设我们的输入数量级很大,最大的元素是 1,那么就将产生一个接近one-hot的向量 ,,此时上面的矩阵变为如下形式:

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_语言模型_06

可以看出,在输入的数量级很大时,梯度消失为0,造成参数更新困难,

问题二:除了 , 是否可以用其他值代替?

标准答案:为什么选择 ,时因为可以使得 Q 和 K 点积 趋向于 期望为0,方差为1的标准正态分布,说白了就是归一化。

公式分析:

首先假设q和k都是服从期望为0,方差为1的独立的随机变量。

假设 ,则:

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_语言模型_07

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_ai_08

此时

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_agi_09

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_算法_10

故有 Q 和 K 点积的均值 ,方差 。方差越大也就说明,点积的数量级越大(以越大的概率取大值)。那么一个自然的做法就是把方差稳定到1,做法是将 Q 和 K 点积除以,这样有:

AI大模型算法工程师经典面试题—:为什么在softmax之前要对attention进行scaled(为什么除以 d_k的平方根)?”_算法_11

将方差控制为1,也就有效地控制了前面提到的梯度消失的问题。

问题三:self-attention一定要这样表达吗?

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

问题四:有其他方法不用除根号dk吗?

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