在分类问题与回归问题的解决上输出层可以采用不同的激活函数!一般来说,回归问题可用恒等函数,分类问题可用softmax函数
softmax函数
表达式:$y_{k}=\frac{e^{a _{k}}} { \sum_{i=1}^na_i }$
如上公式:分子为输入信号ak的指数函数,分母为所有输入信号的指数函数的和。用图表示输入信号在通过softmax函数之后的输出机构图。
从图中,可以看出每一项的输出,都与每一个输入信号有关!
python实现softmax函数
过程显示
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a) # 指数函数
print(exp_a) [ 1.34985881 18.17414537 54.59815003]
sum_exp_a = np.sum(exp_a) # 指数函数的和
print(sum_exp_a) 74.1221542102
y = exp_a / sum_exp_a
print(y) [ 0.01821127 0.24519181 0.73659691]
实现函数
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
关于softmax实现过程中的缺陷
因为softmax函数进行的为指数运算,但是指数运算的过程中有可能会导致数值变的特别的大,从而超过的了int的最大存储位数。因此,就会导致计算变的不在准确。
因此作出如下改进:
$$ y_{k}=\frac{e^{a _{k}}} { \sum_{i=1}^na_i } \\ \qquad = \frac{ Ce^{a _{k}}} {C \sum_{i=1}^na_i } \\ \qquad \qquad \quad = \frac{ e^{(a _{k} + \ln C)}} { \sum_{i=1}^n(a_i+\ln C) } \\ \qquad \qquad = \frac{ e^{(a _{k} + C _{\prime})}} { \sum_{i=1}^n(a_i+ C _{\prime}) } $$通过上面的推导式可以得出,softmax函数在做指数函数运算的时候,加上或者减去某个常数并不会改变运算的结果!虽然这里的常数可以为任何值,但是添加这个 常数的目的就是为了防止计算过程中溢出,因此一般会使用输入信号中的最大值。
经过修改的softmax函数
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
softmax函数的特征
softmax函数的输出值处于0.0到1.0之间,实数。并且softmax的输出值的总和恒等于1。因为有了这个重要的性质,softmax函数的输出可以解释为“概率”。用于多分类问题上很不错。
因为softmax函数为单调递增函数,因此输入的信号值越大,输出的值也越大,这在判断哪一个输出结果为最佳结果(恒等函数可以将输出最大的作为最佳结果)的方面帮助没有那么的大,并且指数运算需要消耗计算机一定的运算量,因此输出层的softmax函数一般会被省略。
输出层的神经元数量
输出层的神经元数量需要根据待解决的问题来决定。分类问题,可以类别的数量设置为输出层的数量,就像手写数字的识别(0-9)10个数字,输出层神经元数量可以设置为10个。