输出层的设计:
输出层所用的激活函数,要根据求解问题的性质决定。一般地,回归问题可以使用恒等函数,二元分类问题可以使用sigmoid函数,多元分类问题可以使用softmax函数。
1、恒等函数
回归问题用恒等函数,恒等函数会将输入按原样输出,对于输入的信息,不加以任何改动地直接输出。
2、softmax函数
分类问题用softmax函数:
e
x
p
(
x
)
exp(x)
exp(x) 是表示
e
x
e^{x}
ex的指数函数(e=2.7182…)。假设输出层共有n个神经元,计算第k个神经元的输出
y
k
y_{k}
yk。如式所示,softmax函数的分子是输入信号
a
k
a_{k}
ak,分母是所有输入信号的指数函数的和。输出层的输入信号
a
k
a_{k}
ak是上一层隐藏层的输出。
实现softmax函数时的注意事项
实现softmax函数的时候会有缺陷,这个缺陷就是溢出问题。因为softmax函数的实现中要进行指数运算,但是此时指数函数的值很容易变得非常大。比如 e 1000 e^{1000} e1000的值会返回一个表示无穷的inf。
计算机处理 “数” 时, 数值必须在4字节或8字节的有限数据宽度内。这意味着数存在有效位数,也就是说,可以表示的数值范围是有限的。因此,会出现超大值无法表示的问题。这个问题称为溢出,在进行计算机的运算时必须 ( 常常 ) 注意。
softmax函数的实现可以像下面这样进行改进:
C
′
C^{'}
C′ 可以选择任何值,但是为了防止溢出,一般会使用输入信号中的最大值的相反数。
如该例所示,通过减去输入信号中的最大值 ( 上例中的 c ) ,我们发现原本为 nan (not a number,不确定 ) 的地方,现在被正确计算了。综上,我们可以像下面这样实现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()函数,可以按如下方式计算神经网络的输出。
softmax的输出都是处于[0,1]之间,加起来的和为1。正因为输出为和为1,所以每个输出为概率。如上图,第一个输出概率为18.211%,第二个输出的概率为24.51%,第三个输出的概率为73.6%。从概率来看,第三个输出的概率最高,所以将输入判定为第三个种类。
值得注意的一点是,虽然经过softmax函数,输出变成了概率的形式,但是数与数之间的大小并没有改变。一般而言,在训练过程中输出会使用softmax函数,但是在测试阶段,为了减少计算机运算量(softmax函数的指数运算),会省略softmax函数。