1.什么是softmax函数:
首先给出softmax函数的公式:
这个式子表示假设输出层共有n个神经元,计算第k个神经元的输出。softmax函数的分子是输出层输入信号
的指数函数,分母是所有输入信号的指数函数的和。
"soft" because still assigns some probability to smallest
"max" because amplifies probability of largest
2.什么时候用softmax:
神经网络可以用在分类问题和回归问题上。一般而言,回归问题用恒等函数,就是原样输出;分类问题用softmax函数。
分类问题是数据属于哪一类别的问题。比如区分图像中的动物是猫还是狗的问题就是分类问题。
回归问题是根据某个输入预测一个(连续的)数值问题。比如根据一个人的图像预测体重。
3.softmax函数的python实现:
按照softmax函数公式:
import numpy as np
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
a = np.array([2, 5, 6])
print(softmax(a))
4.实现softmax函数时的注意事项及改进:
上面的softmax函数的实现虽然正确描述了公式,但是在计算机的运算上有一定缺陷。这个缺陷就是溢出问题。因为计算机就在处理“数”时,数值必须在4字节或8字节的有限数据宽度内。这意味着数存在有效位数,也就是说,可以表示的数值范围是有限的。因此会出现超大值无法表示的问题。
softmax函数的实现中要进行指数函数的运算,所以指数的值可能会变得非常大。如的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行出发运算,结果会出现不确定的情况。
因此要对softmax的实现进行改进:
这个式子说明,在进行sotfmax函数的指数运算时,加上或减去某个常数并不会改变运算的结果。这里的C'可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值。所以softmax函数可以改为:
import numpy as np
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
a = np.array([990, 1000, 1010])
print(softmax(a))
5.softmax函数的特征
对于
a = np.array([2, 5, 6])
print(softmax(a))
print(np.sum(softmax(a)))
输出为:
可以发现softmax函数的输出是0.0到1.0之间的实数。并且,softmax函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。因此,我们才可以把softmax函数的输出解释为“概率”。也就是说,通过使用softmax函数,可以用概率方法处理问题。