zoukankan      html  css  js  c++  java
  • softmax函数,对数似然代价函数及求导反向传播

    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函数以及相关求导过程

  • 相关阅读:
    C#线程优先级浅析
    Android常用组件
    Android 内存监测工具 DDMS --> Heap
    Android 十个非常漂亮的常用组件
    RelativeLayout 相对布局 常用属性
    Android 关于横竖屏
    (转)Android 之 StrictMode 介绍
    Android如何获取SIM卡信息
    Android 读SIM卡信息
    Android Camera 使用小结
  • 原文地址:https://www.cnblogs.com/picassooo/p/12435023.html
Copyright © 2011-2022 走看看