这几乎是bert中的一个必考点,网上有很多大神讲的已经非常细致了,那我从另一个角度分享下自己的理解。小王出品:必接地气。
首先我们看下原论文的解释:We suspect that for large values of dk, 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 1/√dk .
原文说,因为加上softmax以后,会将推向小梯度范畴,导致于无法快速更新参数。
相信很多人会深入问一句,为什么?
首先从公式上看:
这里的自注意力机制是一套利用矩阵相乘的soft attention方式(传统的情况是相加的较多),即上述中的QK,而矩阵相乘和相加最大的区别就是会影响结果的数值分布情况。为什么会影响?这里的Q、K都是经过LayerNormal的结果,所有数值分布都是[0, 1]之间,但是相乘后就会出现:q11K11 + q12K21 + q13K31 + ......,一共有dk个,这就很显然了,如果每组qk都是[0, 1]的范畴,那么全部加一起就是[0, dk]的范畴了,那么整个的数据分布就会拉大。
数据分布拉大会怎么样呢?对于softmax来说,整个数据分布拉大,就可能出现一个值非常接近于dk,而其他值都接近于0的情况,多分类的loss是:
到这一步不难想象吧,无论softmax对于前方的权重如何进行梯度下降的计算,梯度的更新是很难的,想了解详细原理的可以看下这边文章,有具体距离softmax的反向求导过程: https://blog.csdn.net/xxuffei/article/details/90022008?spm=1001.2014.3001.5506
重点来了:
以上是从公式上描述了这个问题,那我再说说自己的另一种感性的理解。在bert中,其实softmax的用法是比较特别的,因为往往softmax是函数是用于多分类任务的收尾阶段,用于收尾阶段的softmax最希望的就是能够让其中一个维度的值无限接近于1而其他都接近于0,这就是softmax或者说神经网络追求的最优解的状态,到了这种时候,自然是不希望梯度再随便改动了,多分类的loss也是根据这个原理量身定制的。
但是bert里softmax是用于生成一个attention权重的,他属于中间过程,那这一步的目标就不是希望得到一个最优解的状态(也就是一项为1,其他为0)。可是Q*K带来的数据上的分布变化完全是一种人为的引入结果,换句话说本来这里不会出现一项为1其他为0的状态,因为使用了这种计算方法后,到了这种结果。因此,需要将所有的数据都缩放下,使得尽可能不要在这一段出现所谓的理想状态,要知道,经过同比例缩放,[1, 10]和[1, 100]对于softmax处理后可是完全不一样的结果哦。