一、softmax函数

softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!

假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是:

$$  S_i = \frac{e^j }{ \sum\nolimits_{j} e^j}  \tag{1}$$

更形象的如下图表示:

softmax直白来说就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标。

二、softmax相关求导

当我们对分类的Loss进行改进的时候,我们要通过梯度下降,每次优化一个step大小的梯度,这个时候我们就要求Loss对每个权重矩阵的偏导,然后应用链式法则。那么这个过程的第一步,就是对softmax求导传回去,不用着急,我后面会举例子非常详细的说明。在这个过程中,你会发现用了softmax函数之后,梯度求导过程非常非常方便。

下面我们举出一个简单例子。

根据图片网络所示,我们能得到下面公式:

z4 = w41*o1+w42*o2+w43*o3

z5 = w51*o1+w52*o2+w53*o3

z6 = w61*o1+w62*o2+w63*o3

z4,z5,z6分别代表结点4,5,6的输出,01,02,03代表是结点1,2,3往后传的输入.

那么我们可以经过softmax函数得到:

$$a_4 = \frac{e^{z_4}}{e^{z_4} + e^{z_5} + e^{z_6}}, a_5 = \frac{e^{z_5}}{e^{z_4} + e^{z_5} + e^{z_6}}, a_6 = \frac{e^{z_6}}{e^{z_4} + e^{z_5} + e^{z_6}}   \tag{2}$$

经过上面的形式化后,接下来我们选用交叉熵作为损失函数来推导Softmax的偏导。交叉熵的形式为:

$$ Loss = -\sum_{i} y_i \cdot \ln a_i    \tag{3}$$

其中$y$代表我们的真实值,$a$代表我们softmax求出的值。$i$代表的是输出结点的标号。

为了形式化说明,我这里认为训练数据的真实输出为第$j$个为1,其它均为0,那么Loss就变成了$Loss = - y_j \cdot \ln a_j = - \ln a_j$,累和已经去掉,现在我们开始求导数。

参数的形式在该例子中,总共分为w41,w42,w43,w51,w52,w53,w61,w62,w63.这些,那么比如我要求出w41,w42,w43的偏导,就需要将Loss函数求偏导传到结点4,然后再利用链式法则继续求导即可。

举个例子此时求w41的偏导为:

$$
\frac{\partial Loss}{\partial w_{41}} = \frac{\partial Loss}{\partial a_{4}} \cdot \frac{\partial a_4}{\partial z_{4}} \cdot \frac{\partial z_4}{\partial w_{41}}
\\= - \frac{1}{a_4} \cdot \frac{\partial a_4}{\partial z_{4}} \cdot 1  \tag{4}
$$

上式中,只要求出$\frac{\partial a_4}{\partial z_{4}}$就可以完成推导。这里分为两种情况:

1. 当$j=i$时:

$$ \frac{\partial a_j}{\partial z_i} = \frac{\partial}{\partial z_i}(\frac{e^{z_j}}{\sum_k e^{z_k}})
\\=\frac{(e^{z_j})' \cdot \sum_k e^{z_k} - e^{z_j} \cdot e^{z_j}}{(\sum_k e^{z_k})^2}
\\=\frac{e^{z_j}}{\sum_k e^{z_k}} - \frac{e^{z_j}}{\sum_k e^{z_k}} \cdot \frac{e^{z_j}}{\sum_k e^{z_k}}
\\=a_j \cdot (1-a_j)
\tag{5} $$

将(5)式带入(4)中,得到$ \frac{\partial Loss}{\partial w_{j}} = -\frac{1}{a_j} \cdot a_j \cdot (1-a_j) = a_j - 1$。

2. 当$j \neq i$时:

$$ \frac{\partial a_j}{\partial z_i} = \frac{\partial}{\partial z_i}(\frac{e^{z_j}}{\sum_k e^{z_k}})
\\=\frac{0 \cdot \sum_k e^{z_k} - e^{z_j} \cdot e^{z_i}}{(\sum_k e^{z_k})^2}
\\=- \frac{e^{z_j}}{\sum_k e^{z_k}} \cdot \frac{e^{z_i}}{\sum_k e^{z_k}}
\\=-a_j \cdot a_i
\tag{6} $$

将(6)式带入(4)中,得到$ \frac{\partial Loss}{\partial w_{j}} = -\frac{1}{a_j} \cdot -a_j \cdot a_i = a_i$。

OK,到此我们已经完全推导完Softmax部分的反向传播。

参考:

1. https://zhuanlan.zhihu.com/p/25723112

2. https://blog.csdn.net/u014313009/article/details/51045303

转载于:https://www.cnblogs.com/shixiangwan/p/9285233.html

Deep Learning基础--Softmax求导过程相关推荐

  1. Logistic回归-代价函数求导过程 | 内含数学相关基础

    转载自:https://blog.csdn.net/JUNJUN_ZHAO/article/details/78564557 相关函数求导公式 先复习回顾下一些数学基础,帮助推导过程可以更好的理解.下 ...

  2. 激活函数汇总,包含公式、求导过程以及numpy实现,妥妥的万字干货

    文章目录 1.激活函数的实现 1.1 sigmoid 1.1.1 函数 1.1.2 导数 1.1.3 代码实现 1.2 softmax 1.2.1 函数 1.2.2 导数 1.2.3 代码实现 1.3 ...

  3. sigmoid函数的求导过程

    sigmoid函数的求导过程涉及"链式求导"和"自然指数"的求导.

  4. 数学----常见函数求导过程

    常见函数求导过程 前言 看了之前的导数,有了一个结论,一般导函数的表示如下: f ′ ( t ) = lim ⁡ Δ t → 0 f ( t + Δ t ) − f ( t ) Δ t f'(t) = ...

  5. 对 RNN 中 BPTT 求导过程的解析尝试

    (转载一次对 RNN 中 BPTT 求导过程的解析尝试 - 知乎 其中关于雅可比的内容 参考: 学习笔记之--Jacobian matrix(雅可比矩阵)学习笔记之--Jacobian matrix( ...

  6. [损失函数]Softmax求导

    原文链接: https://blog.csdn.net/u014380165/article/details/79632950 我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个C ...

  7. 逻辑回归函数求导过程

    基础公式 逻辑回归函数形式为: 它在二维坐标系中的表现形式是这样的: 因为其外形类似S形状,因而又称为Sigmoid函数.sigmoid,英/'sɪgmɒɪd/n. 乙状结肠(等于sigmoidal) ...

  8. 为什么使用负采样技术(附详细求导过程)

    word2vec的初心是什么,为什么使用负采样技术.后面看论文过程经常遇到负采样,如mepath2vec等等,对这个知识点不了解清楚,论文很多精华部分理解就会有偏差了. 看了很多博客和B站视频讲解,还 ...

  9. arctanx麦克劳林公式推导过程_三角函数的求导过程

    上高中的同学一定会很疑惑三角函数的求导公式是怎么推导出来的,毕竟推导过程书本上并没有讲. 如上图,这个推导过程是许多同学都会推导的,但是推导过程仍有漏洞,比如(sinx/x)趋近于0的极限还未证明.三 ...

最新文章

  1. 怎样把字符1变成数字1
  2. mysql创建用户并授登录权限_mysql创建用户并授予权限
  3. 什么是网络可见性?—Vecloud微云
  4. MySQL为表添加外键约束
  5. 能源项目xml文件 -- app-context.xml
  6. nodejs_NodeJS历险记
  7. java语言中json转换,JSON字符串和JAVA语言对象的相互转换教程
  8. mfc动态改变clip风格_echarts动态滑动平均滤波
  9. JavaScript中的私有函数;Javascript构造函数的私有方法中访问其属性和公有方法
  10. 【VS2010学习笔记】【函数学习】一(MFC+OpenCV2.4.7读取摄像头之WM_TIMER消息处理函数的添加问题)
  11. java 数据结构与算法_数据结构与算法—常用数据结构及其Java实现
  12. 编辑邮件时去掉回车光标跟随
  13. UTF-8、BOM、feff的问题
  14. 乐符识别matlab,基于DPP的自动音符切分识别研究
  15. Win10系统中没有Microsoft Store(微软商城)解决方法【详细步骤】
  16. php国际象棋棋盘,php趣味编程 - php输出国际象棋棋盘 - 小徐
  17. 来自#Devoxx 2014的WebSocket螺母和螺栓的幻灯片
  18. Java实现 稀疏矩阵乘积
  19. 为什么 UDP 有时比 TCP 更有优势
  20. TensorFlow 真正从零开始,TensorFlow详细安装入门图文教程

热门文章

  1. python之log日志模块
  2. 实现electron-bridge
  3. parallels desktop
  4. C51数据类型扩充定义
  5. PyCharm配置django环境
  6. Windows操作系统的发展历史
  7. 利用Javascrip实现web窗体的打开和关闭后的刷新
  8. linux拷贝到新建文件夹命令行,Linux创建文件touch,复制文件cp,tab补全,链接文件ln命令...
  9. Redis五大基本数据类型及其相关命令及常用用途
  10. 数据科学入门与实战:Seaborn002热力图等