13 - 深度学习自动微分的Forward mode和Reverse mode的详细推导

1. 概述

在深度神经网络中,我们一般需要构造模型的前向运算和后向运算。其中实线是前向运算,虚线为后向运算。

  • 前向运算:通过输入,经过参数节点得到输出结果
  • 后向运算:经过前向运算,得到误差函数,我们求得误差函数关于所有参数节点的梯度,通过后向传播得到每个参数的更新后的值,这个过程就是后向运算
    在这里插入图片描述

2. 不同运算规则

  • manual-differentiation:手动计算梯度
  • coding:代码形式
  • symbolic-differentiation of the closed-form:符号微分
  • automatic differentiation:自动微分.这里特指前向符号微分;将运算进行分解成元操作;
  • numerical differentiation:数值微分,不稳定;基于导数几何定义

在这里插入图片描述

3. 前向微分

3.1 公式转换

定义一个函数如下:
f ( x 1 , x 2 ) = ln ⁡ ( x 1 ) + x 1 x 2 − sin ⁡ ( x 2 ) f(x_1,x_2)=\ln(x_1)+x_1x_2-\sin(x_2) f(x1,x2)=ln(x1)+x1x2sin(x2)
将上式公式转换成图节点形式如下:

  • 输入定义:
    v − 1 = x 1 = 2 ; v 0 = x 2 = 5 ; \begin{aligned}v_{-1}&=x_1\qquad=2;\\ v_0&=x_2\qquad=5;\end{aligned} v1v0=x1=2;=x2=5;
  • 中间节点:
    v 1 = ln ⁡ v − 1 = ln ⁡ 2 v 2 = v − 1 × v 0 = 2 × 5 v 3 = sin ⁡ v 0 = sin ⁡ 5 v 4 = v 1 + v 2 = 0.693 + 10 v 5 = v 4 − v 3 = 10.693 + 0.959 \begin{aligned}v_1&=\ln v_{-1} \qquad&&=\ln2\\ v_2&=v_{-1}\times v_0\qquad &&=2\times5\\ v_3&=\sin v_0 &&=\sin 5\\ v_4&=v_1+v_2\qquad&&=0.693+10\\ v_5&=v_4-v_3\qquad&&=10.693+0.959\end{aligned} v1v2v3v4v5=lnv1=v1×v0=sinv0=v1+v2=v4v3=ln2=2×5=sin5=0.693+10=10.693+0.959
  • 输出节点:
    y = v 5 = 11.652 y=v_5\qquad=11.652 y=v5=11.652

3.2 前向传播

  • 作用:输入节点的变化对中间节点和输出节点的影响
    定义偏导数如下:
    v ˙ − 1 = ∂ v − 1 ∂ x 1 \dot{v}_{-1}=\frac{\partial v_{-1}}{\partial x_1} v˙1=x1v1
  • 输入偏导如下:
    ∂ v − 1 ∂ x 1 = v ˙ − 1 = x ˙ 1 = 1 ∂ v 0 ∂ x 1 = v 0 ˙ = x ˙ 2 = 0 \begin{aligned}\frac{\partial v_{-1}}{\partial x_1}&=\dot{v}_{-1}&&=\dot{x}_1\qquad&&&=1\\\\ \frac{\partial v_{0}}{\partial x_1}&=\dot{v_0}&&=\dot{x}_2\qquad&&&=0\end{aligned} x1v1x1v0=v˙1=v0˙=x˙1=x˙2=1=0
  • 中间节点偏导:
    ∂ v 1 ∂ x 1 = v ˙ 1 = v ˙ − 1 v − 1 = 1 / 2 ∂ v 2 ∂ x 1 = v ˙ 2 = v ˙ − 1 v 0 + v − 1 v ˙ 0 = 1 × 5 + 2 × 0 ∂ v 3 ∂ x 1 = v ˙ 3 = v ˙ 0 × cos ⁡ v 0 = 0 × cos ⁡ 5 ∂ v 4 ∂ x 1 = v ˙ 4 = v ˙ 1 + v ˙ 2 = 0.5 + 5 ∂ v 5 ∂ x 1 = v ˙ 5 = v ˙ 4 − v ˙ 3 = 5.5 − 0 \begin{aligned}\frac{\partial v_{1}}{\partial x_1}&=\dot{v}_1&&=\frac{\dot{v}_{-1}}{v_{-1}}\qquad&&&&=1/2\\\\ \frac{\partial v_{2}}{\partial x_1}&=\dot{v}_2&&=\dot{v}_{-1}v_0+v_{-1}\dot{v}_0\qquad&&&&=1\times5+2\times0\\\\ \frac{\partial v_{3}}{\partial x_1}&=\dot{v}_3&&=\dot{v}_0\times\cos v_0&&&&=0\times\cos 5\\\\ \frac{\partial v_{4}}{\partial x_1}&=\dot{v}_4&&=\dot{v}_1+\dot{v}_2&&&&=0.5+5\\\\ \frac{\partial v_{5}}{\partial x_1}&=\dot{v}_5&&=\dot{v}_4-\dot{v}_3&&&&=5.5-0 \end{aligned} x1v1x1v2x1v3x1v4x1v5=v˙1=v˙2=v˙3=v˙4=v˙5=v1v˙1=v˙1v0+v1v˙0=v˙0×cosv0=v˙1+v˙2=v˙4v˙3=1/2=1×5+2×0=0×cos5=0.5+5=5.50
  • 输出节点:
    ∂ y ∂ x 1 = y ˙ = v ˙ 5 = 5.5 \begin{aligned}\frac{\partial y}{\partial x_1}&=\dot{y}&&=\dot{v}_5&&&&=5.5\end{aligned} x1y=y˙=v˙5=5.5

4. 后向微分

  • 作用:输出节点的变化对中间节点和输入节点的影响
    举例转换:
    ∂ y ∂ v 3 = ∂ y ∂ v 5 ⋅ ∂ v 5 ∂ v 3 \frac{\partial y}{\partial v_3}=\frac{\partial y}{\partial v_5}·\frac{\partial v_5}{\partial v_3} v3y=v5yv3v5
  • 当一个节点 v 0 v_0 v0的父节点既有 v 2 v_2 v2又有 v 3 v_3 v3,那么可得:
    ∂ y ∂ v 0 = ∂ y ∂ v 2 ⋅ ∂ v 2 ∂ v 0 + ∂ y ∂ v 3 ⋅ ∂ v 3 ∂ v 0 \frac{\partial y}{\partial v_0}=\frac{\partial y}{\partial v_2}·\frac{\partial v_2}{\partial v_0}+\frac{\partial y}{\partial v_3}·\frac{\partial v_3}{\partial v_0} v0y=v2yv0v2+v3yv0v3
    当
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值