softmax
为什么要用softmax?
避免过大的注意力分数导致优化不稳定:
在计算自注意力时,点积或者其它某些score function(例如加法或其他类型的相似性计算)可能会产生非常大的数值。例如,如果计算得到的 attention scores 是 [10000, 200, 1],那么 10000 这个数值就几乎主导了整个计算,这意味着相应的 value 对应的权重会非常大,而其他部分的贡献会变得微不足道。接下来,当这些值被用来计算加权和时,最终的结果会极端依赖于极大的分数,其他分数对输出的影响会被压缩得非常小。
更重要的是,如果在训练过程中这些大分数参与反向传播计算,它们的梯度可能会变得非常大,导致梯度爆炸,优化过程变得不稳定。反过来,如果某些分数特别小(如1或0),在梯度反向传播时可能导致梯度消失,从而无法有效更新参数。通过使用 Softmax,我们可以将这些分数归一化到一个概率分布,确保它们的数值范围适中,从而避免了过大或过小的数值导致梯度爆炸或消失的问题。
保证注意力分数非负:
Softmax的另一个重要功能是将所有的注意力分数转换为非负数。没有Softmax时,计算出的分数可能会包含负数,进而引发一些潜在问题。例如,如果某些特征的注意力分数为负,进行加权求和时可能会导致整体加权结果的方向出现不必要的偏差。自注意力的设计初衷是将每个位置的注意力加权求和,而负的注意力分数可能会导致某些位置的表示“被抑制”,这种设计与“加权求和”的直观理解不一致。
使用Softmax可以确保所有的注意力分数都是正数,并且它们加起来总和为1,这保证了每个元素对最终输出的贡献是可控的。Softmax还可以将较小的注意力分数压缩接近零,而较大的注意力分数则会被放大,确保最终加权求和时,较重要的特征能够得到更多的关注,而较不重要的特征则不会产生过大的影响。
可以不用softmax吗?
transformer中,query得到的q向量,key得到的k向量,相似度计算结果为一个$$n\times n $$的矩阵,softmax要遍历这个矩阵的每一行,对每一行分别进行softmax,而每一行的softmax计算又要对n个元素进行迭代,整体时间复杂度为$$O(n^2) $$,因此有一些方法和变种研究提出了如何减少计算复杂度或者用不同的方法替代 Softmax。
理论上是可以去掉 Softmax 的,但会带来以下问题:
不归一化:去掉 Softmax 后,Attention scores 就不再是一个标准化的概率分布,可能会导致某些位置对输出的影响过大或过小,最终导致注意力不稳定。Softmax 的作用是平衡不同位置的贡献,使得每个位置对输出的影响在一个合理范围内。
梯度问题:Softmax 除了进行归一化外,还通过对数映射进行梯度调整。如果没有 Softmax,直接使用大的注意力分数可能会引起 梯度爆炸 或梯度消失,影响模型训练。
解释性:Softmax 将计算的分数转化为概率,这使得模型的解释性较好。如果去掉了 Softmax,虽然在理论上可以加快计算,但可能牺牲了模型的解释性。