softmax在深度学习分类任务中常被用于最后一层输出每个类别的概率,其公式如下:
Zj表示第j个类别的输出值,一共有K类。在神经网络分类任务中,假如我们有3个类别,那么在神经网络的经过softmax之前会得到一个含有三个输出值的向量z(这里假设batchsize=1)。z中的三个值经过上面的softmax函数后会被映射成三个在(0,1)之间的概率值。
下面我们用代码来实现softmax函数:
import numpy as np
def softmax(z):
z = np.array(z)
z = z - max(z)
z = np.exp(z) #求e^zi值
softmax_z = z / np.sum(z)
return softmax_z
在第四行代码减去max(z)的目的是防止数据输入过大,会出现nan值的情况。我们可以在公式的分子和分母同时乘以一个常数C ,并把它变换到求和之中,就能得到一个等价公式:
C的值可自由选择,不会影响计算结果,通过这个技巧可以提高计算中的数值稳定性,防止出现nan。为了避免指数过大,我们通常将logC设为 -max(z),即减去网络输出各个类别分值向量z中的最大值。
参考资料: