Softmax函数
Softmax是将神经网络得到的多个值,进行归一化处理,使得到的值在
之间,让结果变得可解释。即可以将结果看作是概率,某个类别概率越大,将样本归为该类别的可能性也就越高。Softmax就如下图(借鉴李宏毅老师的课件)

为了更加清晰的看清整个过程,我将其制作成gif,如下图所示:

交叉熵:
假设
和
是关于样本集的两个分布,其中
是样本集的真实分布,
是样本集的估计分布,那么按照真是分布
来衡量识别一个样本所需要编码长度的期望(即,平均编码长度):
如果用估计分布
来表示真实分布
的平均编码长度,应为:
这是因为用
来编码的样本来自于真是分布
,所以期望值
中的概率是
。而
就是交叉熵。
注:不了解什么是编码的请看这里:如何理解用信息熵来表示最短的平均编码长度。
在神经网络后面添加Softmax,真实的标签(或者是类别)就相当于真实的分布,经过Softmax得出的值就是预测的结果,因此可以使用交叉熵函数来作为损失函数。有了交叉熵的概念,我们就可以得出,Softmax的损失函数:

其中
是神经元的输出也可以作为预测结果,
是第i个类别的真实值,
只能取值
。在Softmax中我们取以
为底的对数,因为都是
的指数形式,可以方便计算。在反向传播的过程中,如何对交叉熵损失函数求导呢?可以先看下图的示例,显示了如何得到损失函数:


由上图可以看到,损失函数具体形式是什么。为了计算反向传播,我们从最后一层开始,也就是首先要对Softmax的输入
求导,得:
,其中
由于每个
的分母中都有
的贡献,故我们要考虑每一个输出值。则:
![\frac{\partial L}{\partial y_{j}}=\frac{\partial[ -\sum_{j}\hat{y_{j}}logy_{j}]}{\partial y_{j}}=-\sum_{j}\frac{\hat{y_{j}}}{y_{j}}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
对于
,需要分开讨论因为
和
时的求导结果不同,故需分开讨论。则

- 当
时,有:
![\large {\color{Magenta} \begin{matrix} {\color{Golden} \frac{\partial y_{j}}{\partial z_{i}}}=\frac{\partial y_{i}}{\partial z_{i}}=\frac{\partial [\frac{e^{z_{i}} }{\sum_{k}e^{z_{k}}}]}{\partial z_{i}}=\frac{e^{z_{i}}\sum_{k}e^{z_{k}}-(e^{z_{i}})^{2} }{ (\sum_{k}e^{z_{k}})^{2} }\\ \\ \: \: \: \: =\frac{e^{z_{i}} }{\sum_{k}e^{z_{k}} }(1-\frac{e^{z_{i}} }{\sum_{k}e^{z_{k}} })=y_{i}(1-y_{i}) \end{matrix}}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
- 当
时
![{\color{Magenta} {\color{Golden} \frac{\partial y_{j}}{\partial z_{i}}}=\frac{\partial [\frac{e^{z_{j}} }{\sum_{k}e^{z_{k}}}]}{\partial z_{i}}=\frac{0-e^{z_{j}}e^{z_{i}} }{ (\sum_{k}e^{z_{k}})^{2} }=-y_{i}y_{j}}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
故,
注:因为如果给定一个样本
那么他对应的真实标签只有一个值为
,其余为0,故,
Sotfmax的交叉熵损失函数,还有另外的形式:
其本质是一样的,因为
是示性函数,只有当大括号内的值为真时才取值为1,否则为0,即
。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219527.html原文链接:https://javaforall.net
