1. softmax函数定义
softmax函数为神经网络定义了一种新的输出层:它把每个神经元的输入占当前层所有神经元输入之和的比值,当作该神经元的输出。假设人工神经网络第$L$层的第$j$个节点的带权输入为
在该层应用softmax函数作为激活函数,则第$j$个节点的激活值$a^{L}_{j}$就为
一般来说,我们只在神经网络最后一层应用softmax函数,并把该层叫做softmax层。可以看到,softmax层的所有输出均为正数,且总和为1,因而可以被看作是一个概率分布。因为softmax层的输出是每个神经元的输入占当前层所有神经元输入之和的比值,所以某个神经元的输出值越大,则该神经元对应的类别是真实类别的可能性更高。我们可以选取输出值最大的神经元对应的类别,作为我们的预测结果!
softmax层的形象表示如下图:
PyTorch实现softmax的代码示例如下:
import torch import torch.nn.functional as F data = torch.FloatTensor([[3, 1, -3], [2, 8, 1]]) out = F.softmax(data, dim=1) # dim=1表示对每一行求softmax print(out)
结果如下:
tensor([[8.7888e-01, 1.1894e-01, 2.1785e-03], [2.4704e-03, 9.9662e-01, 9.0880e-04]])
2. 交叉熵损失函数
softmax层和交叉熵损失函数结合起来可解决该层参数学习缓慢的问题。交叉熵损失函数定义为
式中,$a_k$表示第$k$个神经元的输出值,$y_k$表示第$k$个神经元对应的真实值,一般取值为0或1。值得注意的是,该损失函数的求和号是对softmax层的所有神经元求和。
3. 求导和反向传播
交叉熵损失函数关于偏置$b_j$的偏导数
式(*)中除了$\frac{\partial a_j}{\partial z_j}$和$\frac{\partial a_k}{\partial z_j}$之外,其它均为已知,下面将推导这两个偏导数的值
把上面两个偏导值代入式(*)中,可得
同样地,可以推导得到交叉熵损失函数关于权重$w_jk$的偏导数
参考资料
[2]. 详解softmax函数以及相关求导过程