softmax函数,对数似然代价函数及求导反向传播

时间:2024-02-24 07:21:28

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$的偏导数

 

参考资料

[1]. softmax的log似然代价函数(公式求导)

[2]. 详解softmax函数以及相关求导过程