如果有:
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=dydzdxdy
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∂zdsdx+∂y∂zdsdy
Backpropagation(反向传播算法)——实例讲解 定义反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。 该方法对网络中所有权重计算损失函数的梯度。 这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。(误差的反向传播)——维基百科
说明假设现在有N个样本数据,那么实际上损失函数可以表示为:
L(θ)=∑n=1Nln(θ)L(\theta) = \sum_{n=1}^Nl^n(\theta)L(θ)=n=1∑Nln(θ)
其中θ\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=ω11x1+ω12x2+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=ω21x1+ω22x2+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=ω31a1+ω32a2+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=ω41a1+ω42a2+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=ω51a3+ω52a4+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=ω61a3+ω62a4+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
至此,“反向传播算法”及公式推导的过程总算是结束啦!我觉得这种思路还是比较好接受的,毕竟是受了“大木博士”的熏陶哈哈。