什么是Softmax?
假设有两个数据,a 和 b,并且 a>b,那么取max时,很明显就是取a,没有第二种可能。
但是这样有个问题,会造成分值小的那个始终处于“饥饿”状态,也就是无法被获取。如果希望分值大的那个可以被经常获取,分值小的那个也能偶尔可以取到。这个就是 softmax 了,它可以按照一定的概率获取到 a 或者 b 。如果a的softmax值大于b的,那么a就经常取到,而b也会偶尔取到,概率跟它们本来的大小有关。这个处理过程不是 max,而是Soft max。
Softmax定义
假设有一个数组V, 表示 V 中的第 i 个元素。那么这个元素的softmax值就是:
也就是说, 就是元素
的指数与所有元素指数和的比值,且softmax值是非负的。
- 非负性
- 概率和为1(即100%)
- 正相关(原值越大,概率越大)

Numpy示例
import numpy as npdef softmax(datav):""" 计算数组 datav 的各元素softmax值,以数组方式返回 """p_array = [np.power(np.e, vi) for vi in datav]s_array = p_array / np.sum(p)return s_array# 计算数组 [0,1,2,3]各个元素的softmax值d = np.arange(4)s = softmax(d)d, s, np.sum(p)
(array([0, 1, 2, 3]), array([ 1. , 2.71828183, 7.3890561 , 20.08553692]), 1.0)
Softmax和交叉熵损失
交叉熵常用来衡量两个概率的区别,交叉熵的定义:
将交叉熵作为损失Loss,即预测值与期望值。公式为
即预测概率中真实结果的概率求对数的负值。假设结果分类为0、1、2共三个情况,两个样本的预测概率为 [[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]],真实结果为[0,2],则命中概率为 0.1 和 0.5
定义真实样本结果y, 以及预测结果0-2的概率 y_hat
y = torch.tensor([0,2]) y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
列出最终结果y的命中概率,分别是 0.1 和 0.5
y_hat[[0,1], y]
结果为: tensor([0.1000, 0.5000])
则其梯度是真实概率的预测概率的区别:
Softmax的优点
计算与标注样本的差距
在神经网络的计算当中,经常需要计算按照神经网络的正向传播计算分数,和按照正确标注计算的分数
之间的差距来计算Loss,才能应用反向传播。
Loss定义为交叉熵:
取log里面的值就是这组数据正确分类的Softmax值。它占的比重越大,这个样本的Loss也就越小。
计算上非常地方便
杜宇分类的Loss进行改进的时候,要通过梯度下降,每次优化一个step大小的梯度。定义选到 的概率为
然后求Loss对每个权重矩阵的偏导,应用链式法则:
最后结果的形式非常简单,只要将算出来的概率的向量对应的结果的那一维减去1即可。
举例:通过若干层计算,最后得到的某个训练样本的向量分数是[1, 5, 3],那么概率分别是[0.015, 0.866, 0.117]。如果这个样本正确的分类是第二个的话,那么计算出来的偏导就是 [0.015, 0.866 -1, 0.117] = [0.015, -0.134, 0.117]。然后再根据这个进行 back propagation 就可以了。
