深度学习理论基础11-输出层的设计
首先,继续上节的话题。softmax()函数。
这只就是softmax函数了。其中a代表输出层的输入数据,ak代表第k个输入。
如果你觉得又难理解又难记,其实可以拆成3步来理解:
1.把所有的输入计算成序列[e**(a1),e**(a2),e**(a3)...e**(an)],用np的广播功能一行就能搞定
2.计算得到上面的结果之和sum
3.第k个输入的softmax之值即为 e**(ak)/sum
是不是用Python语言比数学语言好理解多了?下面是Python实现,感受下。
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
但是这个函数还有一个瑕疵,如果np.exp方法的参数过大,会出现很大很大很大的数,
毕竟指数爆炸不是闹着玩的。
所以下面是改进版本
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
括号里减掉一个c难道不影响结果吗?不要着急懵,非数学精英请跟随我的证明。
如果理解依然有困难。可以这么想,e**(a+c)=e**a乘以e**c
既然分子和分母同时乘以e**c了,它们有什么理由不相同呢?
所以,括号里的部分,只要分子和分母加的是同一个东西,就不影响结果。
softmax()的结果在0~1之间。所以把softmax()的输出称为概率。
softmax()是单调递增的:
也就是说如果输入数据本来就是最大的,经过softmax()计算之后还是最大。
如果输入数据本来排行老二,经过softmax()计算之后还是排行老二。
所以神经网络在'推理'的过程可以省略softmax()。
'推理'是指用学到的模型对未知的数据进行分类,
也称为神经网络的前向传播(forward propagation)。
在输出层使用softmax函数是因为它和神经网络的学习有关系,这部分的内容在后面博文里。
--------结语--------
下集预告:手写数字识别。