基于计算图的Softmax层反向传播推导

0. 前言

经朋友推荐,近日阅读斋藤康毅先生编写的《深度学习入门 · 基于Python的理论与实现》,书本十分通俗易懂,在Chapter 5 —— 反向传播部分,作者以计算图方式给出了Sigmoid函数,全连接层的反向传播过程,但是在给出Softxmax层的反向传播推导过程的时候,将Softmax函数与交叉熵计算函数直接相连,视为同一个层次,并且给出这个层次的反向传播计算图推导,这篇文章主要关注于两点:

  • 将Softmax函数单独视为一层,该层的反向传播导数的输出是什么?
  • 验证作者在文中所提出的观点 :

    对于Sotfmax-with-loss层,当损失函数为交叉熵时,反向传播输出为 : ∂ L ∂ A = Y i − T i \frac {\partial L}{\partial A} = Y_{i} - T_{i} AL=YiTi ( 其中 : A为Softmax函数输入 , Y为Softmax函数输出 , T为样本的真实标签 )

PS :

  1. 本文为本人阅读笔记,可作为对该书的补充理解,具体知识点请参阅书本
  2. 本文所列出的公式可为代码编写时,softmax函数的反向传播输出提供参考借鉴
1. Softmax层计算图结构

如《深度学习入门 · 基于Python的理论与实现》一书所示,Softmax-with-Loss层计算图和反向传播过程如下图所示 :
Softmax-with-Loss
此处,我使用相同的样例——假设softmax函数输出为一个1X3的向量,分析softmax函数本身的反向传播过程(层次画的略乱,各位见谅) :
Softmax此处,进行参数补全与名词解释 :

  • L1, L2, L3 : 上层函数对softmax各维的输出的求导的结果,若使用书中的交叉熵,则 : L i = − t i y i … … ① Li = -{\frac {t_{i}}{y_{i}}} ……① Li=yiti
  • 图中没有给出的参数
    1. L 1 ∗ e a 1 L1 * e^{a1} L1ea1
    2. L 2 ∗ e a 2 L2 * e^{a2} L2ea2
    3. L 3 ∗ e a 3 L3 * e^{a3} L3ea3
    4. − L 1 e a 1 + L 2 e a 2 + L 3 e a 3 ( ∑ e a i ) 2 - \frac{L_{1}e^{a1} + L_{2}e^{a2} + L3e^{a3}}{(\sum e^{ai})^{2}} (eai)2L1ea1+L2ea2+L3ea3
    5. 根据计算图加法原则,同4
    6. 同上
    7. 同上
    8. ( L 1 − L 2 ) e a 2 + ( L 1 − L 3 ) e a 3 ( ∑ e a i ) 2 ∗ e a 1 \frac{(L_{1}-L_{2})e^{a2}+(L_{1}-L_{3})e^{a3}}{(\sum e^{ai})^{2}} * e^{a1} (eai)2(L1L2)ea2+(L1L3)ea3ea1
    9. ( L 2 − L 1 ) e a 1 + ( L 2 − L 3 ) e a 3 ( ∑ e a i ) 2 ∗ e a 2 \frac{(L_{2}-L_{1})e^{a1}+(L_{2}-L_{3})e^{a3}}{(\sum e^{ai})^{2}} * e^{a2} (eai)2(L2L1)ea1+(L2L3)ea3ea2
    10. ( L 3 − L 1 ) e a 1 + ( L 3 − L 2 ) e a 2 ( ∑ e a i ) 2 ∗ e a 3 \frac{(L_{3}-L_{1})e^{a1}+(L_{3}-L_{2})e^{a2}}{(\sum e^{ai})^{2}} * e^{a3} (eai)2(L3L1)ea1+(L3L2)ea2ea3
2. 作者的推导合理性的验证

此处,我们以(8)式为例进行推导——使用交叉熵函数作为损失函数,softmax输入端每个维度的导数是否与作者原文一样,等于yi-ti:
Step 1 . 在(8)式中代入①式,由Softmax的输出,可知 : y i = e a i ∑ e a j y_{i} = \frac {e^{ai}}{\sum{e^{aj}}} yi=eajeai
Step 2 . 所以可得 : ( L 1 − L 2 ) ∗ e a 1 ∗ e a 2 = t 2 ∗ S ∗ e a 1 − t 1 ∗ S ∗ e a 2 (L_{1} - L_{2}) * e^{a1} * e^{a2} = t_{2} * S * e^{a1} - t_{1} * S * e^{a2} (L1L2)ea1ea2=t2Sea1t1Sea2 ( L 1 − L 3 ) ∗ e a 1 ∗ e a 3 = t 3 ∗ S ∗ e a 1 − t 1 ∗ S ∗ e a 3 (L_{1} - L_{3}) * e^{a1} * e^{a3} = t_{3} * S * e^{a1} - t_{1} * S * e^{a3} (L1L3)ea1ea3=t3Sea1t1Sea3
其中 : S = ∑ e a j S = {\sum{e^{aj}}} S=eaj
Step 3 . 原式等价于 : t 2 e a 1 + t 3 e a 3 − t 1 e a 2 − t 1 e a 3 ∑ e a i \frac{t_{2}e^{a1} +t_{3}e^{a3} - t_{1}e^{a2} - t_{1}e^{a3}}{\sum e^{ai}} eait2ea1+t3ea3t1ea2t1ea3
Step 4 . 等价变换,原式等于 : ( t 1 e a 1 + t 2 e a 1 + t 3 e a 1 ) − ( t 1 e a 1 + t 1 e a 2 + t 1 e a 3 ) ∑ e a i \frac{(t_{1}e^{a1}+t_{2}e^{a1}+t_{3}e^{a1}) - (t_{1}e^{a1}+t_{1}e^{a2} + t_{1}e^{a3})}{\sum e^{ai}} eai(t1ea1+t2ea1+t3ea1)(t1ea1+t1ea2+t1ea3)
等于 : ( t 1 e a 1 + t 2 e a 1 + t 3 e a 1 ) ∑ e a i − t 1 \frac{(t_{1}e^{a1}+t_{2}e^{a1}+t_{3}e^{a1})}{\sum e^{ai}} - t_{1} eai(t1ea1+t2ea1+t3ea1)t1
Step 5 . 由于t1,t2,t3为样本的真实标签,且采用one-hot形式表示,即t1,t2,t3中只有一个为1,其余为0,所以,原式等于 :
e a 1 ∑ e a i − t 1 = y 1 − t 1 \frac{e^{a1}}{\sum e^{ai}} - t_{1} = y_{1} - t_{1} eaiea1t1=y1t1
Step 6. 比较上述结果,发现与作者所求结果一致,所以可知——softmax作为最后一层,且损失函数为交叉熵时,将二者视为同层,该层次反向传播的导数输出为y-t

3. 某些补充
  1. Problem : 为何"在正向传播时有分支流出,则反向传播时它们的反向传播值会相加"?
    Answer : 在链式求导中,对函数 f(u,y,φ) 求f关于x的偏导数(假设x是u,y,φ中的自变量),则 : ∂ f ∂ x = ∂ f ∂ u ∂ u ∂ x + ∂ f ∂ y ∂ y ∂ x + ∂ f ∂ φ ∂ φ ∂ x \frac{\partial f}{\partial x} = \frac{\partial f}{\partial u} \frac{\partial u}{\partial x} + \frac{\partial f}{\partial y} \frac{\partial y}{\partial x} + \frac{\partial f}{\partial φ} \frac{\partial φ}{\partial x} xf=ufxu+yfxy+φfxφ
    以softmax图中(1),(2),(3)合并到(4)为例,(1),(2),(3)其实分别就是f对u,y,φ的偏导数,之所以三者可以合并,是因为 u(x) = φ(x) = y(x) = 1/S 所以三个偏导数值可以相加乘以下一层的偏导

  2. Problem : 为什么我把(1,1,1)作为输入,得到的Softmax函数导数值为0
    Answer : 这只能说明对(1,1,1)向量,softmax函数无任何误差,达到最低点。但是这在交叉熵中不可能出现,因为 (ti/yi) 只有唯一一个不为0的值

4. Reference

《深度学习入门 · 基于Python的理论与实现》 —— 斋藤康毅

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
softmax是常用于分类问题的一种激活函数,它的反向传播可以使用交叉熵误差和梯度下降算法来实现。具体来说,softmax反向传播过程可以分为以下几步: 1. 计算softmax的输出值; 2. 计算损失函数(一般使用交叉熵误差)对softmax输出值的偏导数; 3. 计算损失函数对softmax输入值的偏导数(即梯度); 4. 将梯度传递给前一神经元,继续进行反向传播。 下面是每个步骤的详细说明: 1. 计算softmax的输出值:假设有n个类别,输入向量为x,输出向量为y,则softmax函数可以表示为: y_i = e^(x_i) / (sum(e^(x_j)), j=1,2,...,n) 其中,i表示当前类别,j表示所有类别。需要注意的是,softmax的输出值是一个概率分布,所有输出值的和为1。 2. 计算损失函数对softmax输出值的偏导数:假设样本的真实标签为t,则损失函数可以表示为交叉熵误差: L = -sum(t_i * log(y_i)) 则损失函数对softmax输出值y的偏导数可以表示为: dL/dy_i = y_i - t_i 3. 计算损失函数对softmax输入值的偏导数(即梯度):根据链式法则,可以得到: dL/dx_i = sum(dL/dy_j * dy_j/dx_i), j=1,2,...,n 根据softmax函数的定义,可以得到: dy_j/dx_i = y_i * (delta_ij - y_j) 其中,delta_ij是Kronecker delta符号,当i=j时为1,否则为0。 将上式带入前面的公式中,可以得到: dL/dx_i = y_i * (1 - t_i) + sum(y_j * t_j), j!=i 4. 将梯度传递给前一神经元,继续进行反向传播:将dL/dx_i传递给前一神经元,计算其对前一输入值的偏导数,并依次进行反向传播。这一过程中需要注意,如果前一神经元也使用了softmax激活函数,则需要将其输入值与当前输出值合并,重新计算softmax函数。这个过程称为“softmax with loss”
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值