对自己学习及工作实践过程中的softmax的相关知识做个系统的总结
目录
- softmax公式及求导
- softmax由来
- softmax实现
- softmax梯度传播稳定性
1.softmax 公式及求导
softmax常在多分类场景下的作为激活函数使用,可以认为是二分类激活函数sigmoid函数在多分类情况下的扩展。softmax计算公式:
求导公式:
常与交叉熵损失函数一同使用,交叉熵计算公式:
其中,表示真实样本标签,目标类为1,其余为0,表示预测概率。则,结合交叉熵的求导公式:
具体推导过程见[2].
2.softmax由来
"softmax",一词可以拆解成soft和max两个单词,max即求一组向量中的最大值,而softmax是对max的一种温和的近似(或是对argmax的近似[4]),使求解max的过程连续且可微,这样结合损失函数可以求导后直接进行梯度的反向传播计算,同时考虑求导的便利性,使用指数函数进行计算,也可以让计算结果更集中于max值。
3.softmax实现
实际使用时,对一个很大正数求指数运算很可能会导致浮点数值上溢出,因此考虑计算稳定性,常常减去最大值,再进行softmax运算。
例如:
def softmax(nums):
nums = np.array(nums)
max_ = -max(nums)
a = np.exp(nums+max_)
return a/sum(a)
但是考虑到对一个绝对值很大的负数求指数运算会导致浮点数下溢出,因此常常对softmax结果求log,即log_softmax,同时这样也可加快计算速度[6]。
3.softmax梯度传播的稳定性
大名鼎鼎的transformer模型,在self-attention模块中使用了softmax,但在计算attention权重时,对结果按维度进行了缩放[7]。为什么要这样多此一举呢?做3组对比实验观察下,假设样本真是标签分布是[0,0,1]
> a = [2,3,4]
> softmax(a)
> [0.09003057, 0.24472847, 0.66524096]
则回传梯度为 [0.09003057, 0.24472847, 0.66524096 - 1]
> b = [20,30,40]
> softmax(b)
> [2.06106005e-09, 4.53978686e-05, 9.99954600e-01]
则回传梯度为 [2.06106005e-09, 4.53978686e-05, 9.99954600e-01 - 1]
> c = [200,300,400]
> softmax(c)
> [1.38389653e-87, 3.72007598e-44, 1.00000000e+00]
则回传梯度为 [1.38389653e-87, 3.72007598e-44, 1.00000000e+00 - 1]
对比可以发现输入的数值比较大时,softmax的梯度都接近于0 [8] 。当softmax应于与神经网络最后一层时,梯度接近于0是符合预期的,但当softmax应于神经网络中且输入数据维度比较大时就会导致softmax梯度接近于0,影响网络的收敛。
参考:
[1]:https://blog.csdn.net/bitcarmanlee/article/details/82320853
[2]:https://zhuanlan.zhihu.com/p/25723112
[3]:https://www.zhihu.com/question/40403377
[4]:https://machinelearningmastery.com/softmax-activation-function-with-python/
[5]:http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/
[6]:https://www.zhihu.com/question/358069078
[7]:https://jalammar.github.io/illustrated-transformer/
[8]:https://www.zhihu.com/question/339723385
网友评论