深度学习理论基础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函数是因为它和神经网络的学习有关系,这部分的内容在后面博文里。

--------结语--------

下集预告:手写数字识别。

猜你喜欢

转载自blog.csdn.net/qq_40878431/article/details/85519761