Softmax激活函数的损失函数求导过程推导

  • Softmax函数介绍
  • Softmax的损失函数:交叉熵
  • Softmax求导过程
  • 损失函数求导

Softmax函数介绍

在深度学习领域,多分类问题的激活函数常常使用softmax函数,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!
以前学机器学习时了解过softmax,但没仔细推导过,这段时间在学CS224n课程,要自己推导,看了一些网上的推导,始终有些地方不明白的,后来终于把softmax求梯度过程弄明白了,下面把自己的心得和推导过程记录一下
先看一下Softmax函数:
S o f t m a x ( θ i ) = e θ i ∑ k e θ Softmax(\theta i) = \frac{e^{\theta i}}{\sum_k e^{\theta}} Softmax(θi)=∑k​eθeθi​

Softmax的损失函数:交叉熵

L o s s = ∑ k y i l n a i Loss=\sum_k y_i {\ }{\rm ln } {\ }a_i Loss=k∑​yi​ ln ai​

Softmax求导过程

Softmax函数输入 θ \theta θ是有k个元素的向量,每个 θ \theta θ都会对应着一个softmax,因此,每个softmax都要分别对每个 θ \theta θ求导,对 θ \theta θ求导结果就是一个k*k的雅可比矩阵
[ ∂ S 0 ∂ θ 0 ∂ S 1 ∂ θ 0 . . . ∂ S k ∂ θ 0 ∂ S 0 ∂ θ 1 ∂ S 1 ∂ θ 1 . . . ∂ S k ∂ θ 0 . . . . . . . . . . . . ∂ S 0 ∂ θ k ∂ S 1 ∂ θ k . . . ∂ S k ∂ θ k ] \begin{bmatrix} \frac {\partial S_0 }{\partial \theta_0} & \frac {\partial S_1 }{\partial \theta_0} & {...} & \frac {\partial S_k }{\partial \theta_0} \\ \frac {\partial S_0 }{\partial \theta_1} & \frac {\partial S_1 }{\partial \theta_1} & {...} & \frac {\partial S_k }{\partial \theta_0} \\ {...} &{...}&{...}&{...} \\ \frac {\partial S_0 }{\partial \theta_k} & \frac {\partial S_1 }{\partial \theta_k} & {...} & \frac {\partial S_k }{\partial \theta_k} \end{bmatrix} ⎣⎢⎢⎡​∂θ0​∂S0​​∂θ1​∂S0​​...∂θk​∂S0​​​∂θ0​∂S1​​∂θ1​∂S1​​...∂θk​∂S1​​​............​∂θ0​∂Sk​​∂θ0​∂Sk​​...∂θk​∂Sk​​​⎦⎥⎥⎤​

代入softmax公式,求偏导公式为:
∂ S i ∂ θ j = ∂ e θ i ∑ e θ ∂ θ j \frac{\partial S_i}{\partial \theta_j}=\frac{\partial \frac{e^{\theta_i}}{\sum e^\theta}}{\partial \theta_j} ∂θj​∂Si​​=∂θj​∂∑eθeθi​​​
令 u = e θ i u=e^{\theta_i} u=eθi​, v = ∑ e θ v=\sum e^\theta v=∑eθ,则根据复合函数求导法则, u v \frac{u}{v} vu​导数为 u ′ v − u v ′ v 2 \frac{u'v-uv'}{v^2} v2u′v−uv′​:
∂ S i ∂ θ j = ∂ e θ i ∑ e θ ∂ θ j = ∂ e θ i ∂ θ j ∑ e θ − e θ i ∂ ∑ e θ ∂ θ j ( ∑ e θ ) 2 \begin{aligned} \frac{\partial S_i}{\partial \theta_j}&=\frac{\partial \frac{e^{\theta_i}}{\sum e^\theta}}{\partial \theta_j}\\ &=\frac{\frac{{\partial e^{\theta_i}}}{\partial \theta_j}{\sum e^\theta}- e^{\theta_i}{\frac{\partial \sum e^\theta}{\partial \theta_j}}} {(\sum e^\theta)^2} \end{aligned} ∂θj​∂Si​​​=∂θj​∂∑eθeθi​​​=(∑eθ)2∂θj​∂eθi​​∑eθ−eθi​∂θj​∂∑eθ​​​
此时,需要考虑 i = j 和 i ≠ j i=j和i\ne j i=j和i̸​=j的情况
当 i = j i=j i=j时:
∂ e θ i ∂ θ j = e θ i ∂ ∑ e θ ∂ θ j = e θ i 则 ∂ S i ∂ θ j = e θ i ∑ e θ − e θ i e θ i ( ∑ e θ ) 2 = e θ i ∑ e θ ⋅ ∑ e θ − e θ i ∑ e θ = S i ⋅ ( 1 − S i ) \begin{aligned} \frac{\partial e^{\theta_i}}{\partial \theta_j}&=e^{\theta_i}\\ \frac{\partial \sum e^\theta}{\partial \theta_j} &= e^{\theta_i}\\ 则\frac{\partial S_i}{\partial \theta_j} &=\frac{e^{\theta_i}{\sum e^\theta}- e^{\theta_i}e^{\theta_i}}{(\sum e^\theta)^2}\\ &=\frac{e^{\theta_i}}{\sum e^\theta}\cdot \frac{\sum e^\theta-e^{\theta_i}}{\sum e^\theta}\\ &=S_i\cdot(1-S_i) \end{aligned} ∂θj​∂eθi​​∂θj​∂∑eθ​则∂θj​∂Si​​​=eθi​=eθi​=(∑eθ)2eθi​∑eθ−eθi​eθi​​=∑eθeθi​​⋅∑eθ∑eθ−eθi​​=Si​⋅(1−Si​)​
当 i ≠ j i\ne j i̸​=j时:
∂ e θ i ∂ θ j = 0 ∂ ∑ e θ ∂ θ j = e θ j 则 ∂ S i ∂ θ j = 0 ⋅ ∑ e θ − e θ i e θ j ( ∑ e θ ) 2 = − e θ i ∑ e θ ⋅ e θ j ∑ e θ = − S i ⋅ S j \begin{aligned} \frac{\partial e^{\theta_i}}{\partial \theta_j}&=0\\ \frac{\partial \sum e^\theta}{\partial \theta_j} &= e^{\theta_j}\\ 则\frac{\partial S_i}{\partial \theta_j} &=\frac{0\cdot{\sum e^\theta}- e^{\theta_i}e^{\theta_j}}{(\sum e^\theta)^2}\\ &=-\frac{e^{\theta_i}}{\sum e^\theta}\cdot \frac{e^{\theta_j}}{\sum e^\theta}\\ &=-S_i\cdot S_j \end{aligned} ∂θj​∂eθi​​∂θj​∂∑eθ​则∂θj​∂Si​​​=0=eθj​=(∑eθ)20⋅∑eθ−eθi​eθj​​=−∑eθeθi​​⋅∑eθeθj​​=−Si​⋅Sj​​

损失函数求导

根据链式求导法则,损失函数对 θ \theta θ求导可进行分解:
d L d θ = d L d S ⋅ d S d θ = − d ∑ y i l n S i d S i ⋅ d S i d θ i = − ∑ y i S i ⋅ d S i d θ j \begin{aligned} \frac{dL}{d\theta}&=\frac{dL}{d S}\cdot \frac{dS}{d\theta}\\ &=-\frac{d\sum y_i {\rm ln}S_i}{dS_i} \cdot \frac{dS_i}{d\theta_i}\\ &=-\sum \frac{y_i}{S_i} \cdot \frac{dS_i}{d\theta_j} \end{aligned} dθdL​​=dSdL​⋅dθdS​=−dSi​d∑yi​lnSi​​⋅dθi​dSi​​=−∑Si​yi​​⋅dθj​dSi​​​
代入上面的softmax求导结果,将 i = j i=j i=j和 i ≠ j i\ne j i̸​=j结果相加:
d L d θ = − y i S i ⋅ S i ( 1 − S i ) − ∑ i ≠ j y i S j ⋅ ( − S i ⋅ S j ) = − y i ⋅ ( 1 − S i ) + ∑ i ≠ j y i ⋅ S i = S i ∑ y i − y i \begin{aligned} \frac{dL}{d\theta}&=-\frac{y_i}{S_i} \cdot S_i(1-S_i) - \sum_{i\ne j} \frac{y_i}{S_j} \cdot (-S_i\cdot S_j)\\ &=-y_i\cdot(1-S_i) +\sum_{i\ne j}y_i\cdot S_i\\ &=S_i\sum y_i - y_i \end{aligned} dθdL​​=−Si​yi​​⋅Si​(1−Si​)−i̸​=j∑​Sj​yi​​⋅(−Si​⋅Sj​)=−yi​⋅(1−Si​)+i̸​=j∑​yi​⋅Si​=Si​∑yi​−yi​​
因为yi相加的结果等于1,因此最后的结果就是
d L d θ = S i − y i \frac{dL}{d\theta}=S_i-y_i dθdL​=Si​−yi​

Softmax及其损失函数求导推导过程相关推荐

  1. 逻辑回归损失函数求导推导过程

    逻辑回归--分类算法 代价函数的寻找 sigmoid函数的非线性会导致损失函数变得非线性,无法找到全局最优值,所以需要进行损失函数替换. 代价函数的合理性分析 预测正确,损失较小:预测错误,损失较大 ...

  2. 最详细的Sigmoid函数的求导推导过程

    Sigmoid函数为logistic回归.神经网络等模型的激活函数. 函数图像如下: 定义域是从 (−∞,+∞),值域是(0,1). 函数: 导数: 推导过程为:                   ...

  3. 二次型x^TAx梯度(求导)推导过程

    y=xTAxy=x^TAxy=xTAx,其中x是n维向量,A是n阶方阵,求dy/dxdy/dxdy/dx 记A=[aij]A=\left[a_{i j}\right]A=[aij​].x∈Rn,x=( ...

  4. 卷积神经网络系列之softmax loss对输入的求导推导

    我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等.虽然现在已经开源了很多深度学习框架(比如MxNet,Caf ...

  5. softmax loss对输入的求导推导

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

  6. 简单易懂的softmax交叉熵损失函数求导

    简单易懂的softmax交叉熵损失函数求导 本博客转自:http://m.blog.csdn.net/qian99/article/details/78046329 来写一个softmax求导的推导过 ...

  7. 【数据挖掘】神经网络 后向传播算法 ( 梯度下降过程 | 梯度方向说明 | 梯度下降原理 | 损失函数 | 损失函数求导 | 批量梯度下降法 | 随机梯度下降法 | 小批量梯度下降法 )

    文章目录 I . 梯度下降 Gradient Descent 简介 ( 梯度下降过程 | 梯度下降方向 ) II . 梯度下降 示例说明 ( 单个参数 ) III . 梯度下降 示例说明 ( 多个参数 ...

  8. sigmoid函数、tanh函数、softmax函数及求导

    sigmoid函数和tanh函数都是激活函数,接收一个输入,产生一个输出.这里的求导是对激活函数求导.而softmax函数是一个多输入多输出的激活函数,这里提到的求导是对经过softmax函数后进行交 ...

  9. Sigmoid函数与损失函数求导

    文章目录 1. sigmoid函数 1.1 从指数函数到sigmoid 1.2 对数函数与sigmoid 2. sigmoid函数求导 3 .神经网络损失函数求导 1. sigmoid函数 sigmo ...

最新文章

  1. oracle10 exp imp 中文乱码
  2. ArcEngine对Blob字段赋值的方法
  3. 不包含本位置值的累乘数组
  4. java文件file字符集_获取文件字符集(或文件编码) 的工具类
  5. python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路
  6. RabbitMQ 集群搭建_02_rpm版本(linux环境)
  7. spring cloud alibaba微服务原理与实战_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...
  8. SpringCloud工作笔记077---SpringBoot中使用JPA操作数据库
  9. 点评10款Github上最火爆的国产开源项目
  10. java的Date.getTime()转换成C#的Datetime.ticks
  11. python3清屏命令_python3.4中清屏的处理方法
  12. 2013年上半年 系统分析师 论文 真题
  13. easypr4android,EasyPR的基本使用
  14. ActivityManager 管理Activity
  15. 光机电气一体化控制实训系统
  16. Ubuntu如何安装TeamViewer Ubuntu安装TeamViewer教程
  17. CentOS系统下文件夹目录结构及其作用
  18. 德银天下招股书再度“失效”,陕汽控股集团提前“套现”约5亿元
  19. LeetCode - 441 - 排列硬币(arranging-coins)
  20. 如何使用 Enterprise Architect 画 UML

热门文章

  1. linux drm 内存管理,linux DRM GEM 笔记
  2. jQuery 加入购物车 弹窗
  3. Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 85 bytes)
  4. addEventListener() 的参数之passive 的用法
  5. Opencv2.4.9源码分析——Stitching(四)
  6. 【线上活动】中秋诗词接龙!
  7. newt.h:没有那个文件或目录
  8. Vue3基础难点总结
  9. docker 安装RabbitMQ(镜像安装)
  10. jbpm3\jbpm4_在jBPM中支持高级用户交互模式