[Deep Learning] 反向传播算法(Backpropagation Algorithm)

Rhea ·
更新时间:2024-09-20
· 784 次阅读

Chain Rule(链式法则) Case 1

如果有:

y=g(x)      z=h(y)y = g(x)\ \ \ \ \ \ z = h(y)y=g(x)      z=h(y)

那么“变量影响链”就有:

Δx→ΔyΔz\Delta x\rightarrow \Delta y \Delta zΔx→ΔyΔz

因此就有:

dzdx=dzdydydx\frac{d z}{d x} = \frac{d z}{d y}\frac{d y}{d x}dxdz​=dydz​dxdy​

Case 2

如果有:

y=g(s)      y=h(s)      z=k(x,y)y = g(s)\ \ \ \ \ \ y = h(s)\ \ \ \ \ \ z=k(x,y)y=g(s)      y=h(s)      z=k(x,y)

那么“变量影响链”就有:

因此就有:

dzds=∂z∂xdxds+∂z∂ydyds\frac{d z}{d s} = \frac{\partial z}{\partial x}\frac{d x}{ds} + \frac{\partial z}{\partial y}\frac{d y}{ds} dsdz​=∂x∂z​dsdx​+∂y∂z​dsdy​

Backpropagation(反向传播算法)——实例讲解 定义

反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。 该方法对网络中所有权重计算损失函数的梯度。 这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。(误差的反向传播)——维基百科

说明

假设现在有N个样本数据,那么实际上损失函数可以表示为:

L(θ)=∑n=1Nln(θ)L(\theta) = \sum_{n=1}^Nl^n(\theta)L(θ)=n=1∑N​ln(θ)

其中θ\thetaθ为需要学习的参数。

那么现在ω\omegaω对LLL进行偏微分,实际上是对每个样本数据的损失函数l(θ)l(\theta)l(θ)进行偏微分后再求和:

∂L(θ)∂ω=∑n=1N∂ln(θ)∂ω\frac{\partial L(\theta)}{\partial \omega} = \sum_{n=1}^N\frac{\partial l^n(\theta)}{\partial \omega}∂ω∂L(θ)​=n=1∑N​∂ω∂ln(θ)​

用代数表示为:

z1=ω11x1+ω12x2+b1           a1=σ(z1)z_1 = \omega_{11}x_1 + \omega_{12}x_2 + b_1 \ \ \ \ \ \ \ \ \ \ \ a_1 = \sigma(z_1)z1​=ω11​x1​+ω12​x2​+b1​           a1​=σ(z1​)

z2=ω21x1+ω22x2+b2           a2=σ(z2)z_2 = \omega_{21}x_1 + \omega_{22}x_2 + b_2 \ \ \ \ \ \ \ \ \ \ \ a_2 = \sigma(z_2)z2​=ω21​x1​+ω22​x2​+b2​           a2​=σ(z2​)

z3=ω31a1+ω32a2+b3           a3=σ(z3)z_3 = \omega_{31}a_1 + \omega_{32}a_2 + b_3 \ \ \ \ \ \ \ \ \ \ \ a_3 = \sigma(z_3)z3​=ω31​a1​+ω32​a2​+b3​           a3​=σ(z3​)

z4=ω41a1+ω42a2+b4           a4=σ(z4)z_4 = \omega_{41}a_1 + \omega_{42}a_2 + b_4 \ \ \ \ \ \ \ \ \ \ \ a_4 = \sigma(z_4)z4​=ω41​a1​+ω42​a2​+b4​           a4​=σ(z4​)

z5=ω51a3+ω52a4+b5           y1=σ(z5)z_5 = \omega_{51}a_3 + \omega_{52}a_4 + b_5 \ \ \ \ \ \ \ \ \ \ \ y_1 = \sigma(z_5)z5​=ω51​a3​+ω52​a4​+b5​           y1​=σ(z5​)

z6=ω61a3+ω62a4+b6           y2=σ(z6)z_6 = \omega_{61}a_3 + \omega_{62}a_4 + b_6 \ \ \ \ \ \ \ \ \ \ \ y_2 = \sigma(z_6)z6​=ω61​a3​+ω62​a4​+b6​           y2​=σ(z6​)

那么我们实际要计算的是:

∂l∂ω=∂z∂ω∂l∂z\frac{\partial l}{\partial \omega} = \frac{\partial z}{\partial \omega}\frac{\partial l}{\partial z}∂ω∂l​=∂ω∂z​∂z∂l​

即分别计算出∂z∂ω\frac{\partial z}{\partial \omega}∂ω∂z​和∂l∂z\frac{\partial l}{\partial z}∂z∂l​:

Step 1:Forward Pass

这个过程实际上是计算Neural Network的所有∂zi∂ωi1\frac{\partial z_i}{\partial \omega_{i1}}∂ωi1​∂zi​​和∂zi∂ωi2\frac{\partial z_i}{\partial \omega_{i2}}∂ωi2​∂zi​​,即:

∂z1∂ω11=x1              ∂z1∂ω12=x2\frac{\partial z_1}{\partial \omega_{11}} = x_1 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{\partial z_1}{\partial \omega_{12}} = x_2∂ω11​∂z1​​=x1​              ∂ω12​∂z1​​=x2​

∂z2∂ω21=x1              ∂z2∂ω22=x2\frac{\partial z_2}{\partial \omega_{21}} = x_1 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{\partial z_2}{\partial \omega_{22}} = x_2∂ω21​∂z2​​=x1​              ∂ω22​∂z2​​=x2​

∂z3∂ω31=a1              ∂z3∂ω32=a2\frac{\partial z_3}{\partial \omega_{31}} = a_1 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{\partial z_3}{\partial \omega_{32}} = a_2∂ω31​∂z3​​=a1​              ∂ω32​∂z3​​=a2​

∂z4∂ω41=a1              ∂z4∂ω42=a2\frac{\partial z_4}{\partial \omega_{41}} = a_1 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{\partial z_4}{\partial \omega_{42}} = a_2∂ω41​∂z4​​=a1​              ∂ω42​∂z4​​=a2​

∂z5∂ω51=a3              ∂z5∂ω52=a4\frac{\partial z_5}{\partial \omega_{51}} = a_3 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{\partial z_5}{\partial \omega_{52}} = a_4∂ω51​∂z5​​=a3​              ∂ω52​∂z5​​=a4​

∂z6∂ω61=a3              ∂z6∂ω62=a4\frac{\partial z_6}{\partial \omega_{61}} = a_3 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{\partial z_6}{\partial \omega_{62}} = a_4∂ω61​∂z6​​=a3​              ∂ω62​∂z6​​=a4​

如果用具体数值表示的话,那就是下图所示:

因为这个过程必须从输入x1x_1x1​、x2x_2x2​开始到输出,否则无法计算出之后的a1a_1a1​、a2a_2a2​、a3a_3a3​、a4a_4a4​,所以这个过程叫做Forward Pass

Step 2:Backward Pass

这个过程是计算∂l∂z\frac{\partial l}{\partial z}∂z∂l​的过程,如果我们按照Step 1中的过程来计算的话,就会有如下过程:

∂l∂z1=∂a1∂z1∂l∂a1\frac{\partial l}{\partial z_1} = \frac{\partial a_1}{\partial z_1}\frac{\partial l}{\partial a_1}∂z1​∂l​=∂z1​∂a1​​∂a1​∂l​

其中,

∂a1∂z1=σ′(z1)\frac{\partial a_1}{\partial z_1} = \sigma'(z_1)∂z1​∂a1​​=σ′(z1​)

∂l∂a1=∂z3∂a1∂l∂z3+∂z4∂a1∂l∂z4=ω31∂l∂z3+ω41∂l∂z4\frac{\partial l}{\partial a_1} = \frac{\partial z_3}{\partial a_1}\frac{\partial l}{\partial z_3}+\frac{\partial z_4}{\partial a_1}\frac{\partial l}{\partial z_4} = \omega_{31}\frac{\partial l}{\partial z_3} + \omega_{41}\frac{\partial l}{\partial z_4}∂a1​∂l​=∂a1​∂z3​​∂z3​∂l​+∂a1​∂z4​​∂z4​∂l​=ω31​∂z3​∂l​+ω41​∂z4​∂l​

即:

∂l∂z1=σ′(z1)(ω31∂l∂z3+ω41∂l∂z4) \frac{\partial l}{\partial z_1} = \sigma'(z_1)(\omega_{31}\frac{\partial l}{\partial z_3} + \omega_{41}\frac{\partial l}{\partial z_4})∂z1​∂l​=σ′(z1​)(ω31​∂z3​∂l​+ω41​∂z4​∂l​)

同理,有:

∂l∂z2=σ′(z2)(ω32∂l∂z3+ω42∂l∂z4) \frac{\partial l}{\partial z_2} = \sigma'(z_2)(\omega_{32}\frac{\partial l}{\partial z_3} + \omega_{42}\frac{\partial l}{\partial z_4})∂z2​∂l​=σ′(z2​)(ω32​∂z3​∂l​+ω42​∂z4​∂l​)

因此,如果我们要计算出∂l∂z1\frac{\partial l}{\partial z_1}∂z1​∂l​和∂l∂z2\frac{\partial l}{\partial z_2}∂z2​∂l​,我们还要先计算∂l∂z3\frac{\partial l}{\partial z_3}∂z3​∂l​和∂l∂z4\frac{\partial l}{\partial z_4}∂z4​∂l​,可以想象出来,我们再计算∂l∂z3\frac{\partial l}{\partial z_3}∂z3​∂l​和∂l∂z4\frac{\partial l}{\partial z_4}∂z4​∂l​的过程中,肯定还要计算∂l∂z5\frac{\partial l}{\partial z_5}∂z5​∂l​和∂l∂z6\frac{\partial l}{\partial z_6}∂z6​∂l​…

没错,这是一个递归过程!这还只是个比较简单的例子,如果是比较复杂的深度神经网络的话,时间复杂度必然是很高的,所以说,不能用Forward Pass的方法计算∂l∂z\frac{\partial l}{\partial z}∂z∂l​!

(重点来了!!!)

现在,如果你仔细端详∂l∂z1=σ′(z1)(ω31∂l∂z3+ω41∂l∂z4)\frac{\partial l}{\partial z_1} = \sigma'(z_1)(\omega_{31}\frac{\partial l}{\partial z_3} + \omega_{41}\frac{\partial l}{\partial z_4})∂z1​∂l​=σ′(z1​)(ω31​∂z3​∂l​+ω41​∂z4​∂l​) 这个式子,你会发现,式子的形式是不是很像神经元的形式:∂l∂z3\frac{\partial l}{\partial z_3}∂z3​∂l​和∂l∂z4\frac{\partial l}{\partial z_4}∂z4​∂l​作为输入,ω31\omega_{31}ω31​和ω41\omega_{41}ω41​作为权重,而σ′(z1)\sigma'(z_1)σ′(z1​)可以看作是一个数值放大器,放大了ω31∂l∂z3+ω41∂l∂z4\omega_{31}\frac{\partial l}{\partial z_3} + \omega_{41}\frac{\partial l}{\partial z_4}ω31​∂z3​∂l​+ω41​∂z4​∂l​的结果!如下图:

因此,计算∂l∂z\frac{\partial l}{\partial z}∂z∂l​的过程可以用如下图来表示:

这种方法就是Backward Pass,这样就不会出现刚才所说的递归了!

summary

通过Forward Pass计算得到的∂z∂ω\frac{\partial z}{\partial \omega}∂ω∂z​以及Backward Pass计算得到的∂l∂z\frac{\partial l}{\partial z}∂z∂l​,就可以得到∂l∂ω\frac{\partial l}{\partial \omega}∂ω∂l​

至此,“反向传播算法”及公式推导的过程总算是结束啦!我觉得这种思路还是比较好接受的,毕竟是受了“大木博士”的熏陶哈哈。


作者:Oh_MyBug



反向传播算法 反向传播 deep 算法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号