BP算法详细推导及分析


神经网络基础篇 我们介绍了神经网络的一些基础知识,并提到神经网络的强大的表达能力,但是我们并不知道该如何训练它以获取各个参数,为此我们将介绍其中最最典型的算法: 误差逆传播算法( B a c k P r o p a g a t i o n BackPropagation BackPropagation,简称 B P BP BP),它是一种与最优化方法(如梯度下降法)结合使用,用来训练人工神经网络的常见方法。该方法对网络中所有权重 w w w和偏置 b b b计算损失函数的梯度,这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。

在正式介绍 B P BP BP算法之前,我们需要明确一些内容

1. 链式法则( C h a i n   r u l e Chain \ rule Chain rule)

链式法则是复合函数求导中的常用规则,这里简单举例介绍,不详细展开

  • y = f ( x ) , z = g ( y ) y = f(x),z=g(y) y=f(x),z=g(y)

    此时,如果给 x x x一个很小的变化 Δ x \Delta x Δx,则会通过 f ( x ) f(x) f(x)函数影响 y y y y y y变化又会通过函数 g ( y ) g(y) g(y)影响 z z z,即

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

    则有

    ∂ z ∂ x = ∂ z ∂ y ⋅ ∂ y ∂ x \begin{aligned}\frac{\partial{z}}{\partial{x}} = \frac{\partial{z}}{\partial{y}} \cdot \frac{\partial{y}}{\partial{x}}\end{aligned} xz=yzxy

  • z = f ( x , y ) , w h e r e   x = g ( t ) , y = h ( t ) z=f(x,y), where \ x=g(t),y=h(t) z=f(x,y),where x=g(t),y=h(t)

    同样如果给 t t t一个很小的变化 Δ t \Delta t Δt,则会通过 g ( t ) g(t) g(t)函数影响 x x x,通过 h ( t ) h(t) h(t)函数影响 y y y x x x y y y变化均会通过函数 f ( x , y ) f(x,y) f(x,y)影响 z z z,即 t t t发生变化时,可以通过 Δ x \Delta x Δx Δ y \Delta y Δy两条路径影响 z z z

    导数关系图

    此时有

    ∂ z ∂ t = ∂ z ∂ x ⋅ ∂ x ∂ t + ∂ z ∂ y ⋅ ∂ y ∂ t \begin{aligned}\frac{\partial{z}}{\partial{t}} = \frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{t}}+\frac{\partial{z}}{\partial{y}} \cdot \frac{\partial{y}}{\partial{t}}\end{aligned} tz=xztx+yzty

2. B P BP BP算法流程

B P BP BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,算法流程大致如下:

  1. 随机初始化所有的 ( w , b ) (w,b) (w,b)

  2. 输入训练样本集 { ( x ( n ) , y ( n ) ) } , n = 1 , 2 , ⋯   , N \{(x^{(n)},y^{(n)}) \},n = 1,2,\cdots,N {(x(n),y(n))},n=1,2,,N,带入神经网络,计算出所有的 ( z , a , y ^ ) (z,a,\hat y) (z,a,y^) ,这个是信号的前向传播过程

  3. 使用梯度下降法,最小化损失函数

    E = 1 2 N ∑ i = 1 N ( y ^ ( i ) − y ( i ) ) 2 \begin{aligned} E &=\frac{1}{2N}\sum\limits_{i=1}^N(\hat y^{(i)}-y^{(i)})^2 \end{aligned} E=2N1i=1N(y^(i)y(i))2

    这里通过链式法则求解损失函数 E E E对各个参数 w , b w,b w,b的偏导数,并根据规则更新参数

    w n e w = w o l d − η ∂ E ∂ w ∣ w o l d b n e w = b o l d − η ∂ E ∂ b ∣ b o l d \begin{aligned}w^{new} &= w^{old} - \eta \frac{\partial{E}}{\partial{w}}\bigg|_{w^{old}} \\ b^{new} &= b^{old} - \eta \frac{\partial{E}}{\partial{b}}\bigg|_{b^{old}}\end{aligned} wnewbnew=woldηwEwold=boldηbEbold

  4. 重复2-3步骤,直至损失函数足够小(达到满意的设定值)

3. 前馈神经网络的一些记号说明

记 号 含 义 L 神 经 网 络 层 数 M l 第 l 层 神 经 元 的 个 数 ϕ l ( ⋅ ) 第 l 层 神 经 元 的 激 活 函 数 W [ l ] ∈ R M l × M l − 1 第 l − 1 层 到 第 l 层 的 权 重 矩 阵 w i j [ l ] 第 l − 1 层 的 第 i 个 神 经 元 与 第 l 层 第 j 个 神 经 元 的 连 接 权 重 b [ l ] ∈ R M l 第 l 层 的 偏 置 矩 阵 b i [ l ] 第 l 层 第 i 个 神 经 元 的 偏 置 z [ l ] ∈ R M l 第 l 层 神 经 元 的 非 激 活 值 z i [ l ] 第 l 层 第 i 个 神 经 元 的 非 激 活 值 a [ l ] ∈ R M l 第 l 层 的 激 活 值 a i [ l ] 第 l 层 第 i 个 神 经 元 的 激 活 值 \begin{array}{l|clr} 记号 & 含义 \\ \hline L & 神经网络层数 \\ M_l & 第l层神经元的个数 \\ \phi_l(\cdot) & 第l层神经元的激活函数 \\ W^{[l]} \in R^{M_l \times M_{l-1}} & 第l-1层到第l层的权重矩阵 \\w_{ij}^{[l]} & 第l-1层的第i个神经元与第l层第j个神经元的连接权重\\ b^{[l]} \in R^{M_l} & 第l层的偏置矩阵 \\b_i^{[l]} & 第l层第i个神经元的偏置 \\ z^{[l]} \in R^{M_l} & 第l层神经元的非激活值 \\z_i^{[l]} & 第l层第i个神经元的非激活值\\ a^{[l]} \in R^{M_l} & 第l层的激活值 \\a_i^{[l]} &第l层第i个神经元的激活值 \end{array} LMlϕl()W[l]RMl×Ml1wij[l]b[l]RMlbi[l]z[l]RMlzi[l]a[l]RMlai[l]lll1ll1iljllillilli

4. 以三层神经网络为例,讲解梯度计算

我们以三层神经网络为例,说明 B P BP BP算法的梯度计算流程,为了更好的理解算法本质,这里只使用一个输入样例,并且每层的激活函数均为 S i g m o i d Sigmoid Sigmoid 函数,则有 ϕ ′ ( z ) = ϕ ( z ) ( 1 − ϕ ( z ) ) = a ( 1 − a ) \phi'(z)=\phi(z)(1−\phi(z))=a(1-a) ϕ(z)=ϕ(z)(1ϕ(z))=a(1a)

bp算法神经网络讲解模型

对于上面的神经网络有以下几个式子成立:

z 1 [ 1 ] = x 1 ∗ w 11 [ 1 ] + x 2 ∗ w 21 [ 1 ] + b 1 [ 1 ] , a 1 [ 1 ] = ϕ 1 ( z 1 [ 1 ] ) z 2 [ 1 ] = x 1 ∗ w 12 [ 1 ] + x 2 ∗ w 22 [ 1 ] + b 2 [ 1 ] , a 2 [ 1 ] = ϕ 1 ( z 2 [ 1 ] ) z 1 [ 2 ] = a 1 [ 1 ] ∗ w 11 [ 2 ] + a 2 [ 1 ] ∗ w 21 [ 2 ] + b 1 [ 2 ] , a 1 [ 2 ] = ϕ 2 ( z 1 [ 2 ] ) z 2 [ 2 ] = a 1 [ 1 ] ∗ w 12 [ 2 ] + a 2 [ 1 ] ∗ w 22 [ 2 ] + b 2 [ 2 ] , a 2 [ 2 ] = ϕ 2 ( z 2 [ 2 ] ) z 1 [ 3 ] = a 1 [ 2 ] ∗ w 11 [ 3 ] + a 2 [ 2 ] ∗ w 21 [ 3 ] + b 1 [ 3 ] , a 1 [ 3 ] = ϕ 3 ( z 1 [ 3 ] ) y ^ = a 1 [ 3 ] E = 1 2 ( y ^ − y ) 2 \begin{aligned} z^{[1]}_1 &= x_1* w_{11}^{[1]}+x_2* w_{21}^{[1]}+b_1^{[1]},\quad a_1^{[1]} = \phi_1(z_1^{[1]}) \\ z^{[1]}_2 &= x_1* w_{12}^{[1]}+x_2* w_{22}^{[1]}+b_2^{[1]},\quad a_2^{[1]} = \phi_1(z_2^{[1]}) \\ \\ z^{[2]}_1 &= a_1^{[1]}* w_{11}^{[2]}+a_2^{[1]}* w_{21}^{[2]}+b_1^{[2]},\quad a_1^{[2]} = \phi_2(z_1^{[2]}) \\ z^{[2]}_2 &= a_1^{[1]}* w_{12}^{[2]}+a_2^{[1]}* w_{22}^{[2]}+b_2^{[2]},\quad a_2^{[2]} = \phi_2(z_2^{[2]})\\ \\ z^{[3]}_1 &= a_1^{[2]}* w_{11}^{[3]}+a_2^{[2]}* w_{21}^{[3]}+b_1^{[3]},\quad a_1^{[3]} = \phi_3(z_1^{[3]}) \\ \\\hat{y}&=a_1^{[3]} \\\\ E &= \frac{1}{2}(\hat y-y)^2 \end{aligned} z1[1]z2[1]z1[2]z2[2]z1[3]y^E=x1w11[1]+x2w21[1]+b1[1]a1[1]=ϕ1(z1[1])=x1w12[1]+x2w22[1]+b2[1]a2[1]=ϕ1(z2[1])=a1[1]w11[2]+a2[1]w21[2]+b1[2]a1[2]=ϕ2(z1[2])=a1[1]w12[2]+a2[1]w22[2]+b2[2]a2[2]=ϕ2(z2[2])=a1[2]w11[3]+a2[2]w21[3]+b1[3]a1[3]=ϕ3(z1[3])=a1[3]=21(y^y)2

这是数据前向传播的过程,通过前向传播我们可以算出每层的 z 、 a z、a za以及最终的输出 y ^ \hat y y^

需要注意的是,上面的几个式子中, x 1 x_1 x1 x 2 x_2 x2 是输入的测试样例的两个维度值,因此是已知的。激活函数 ϕ 1 \phi_1 ϕ1 ϕ 2 \phi_2 ϕ2在进行神经网络学习之前就需要设定,因此这两个函数也是已知的,这里我们假设都是 S i g m o i d Sigmoid Sigmoid。损失函数中的 y y y为输入样例的标签值,因此也是已知的,综合下来,就只有每层的 w w w b b b是需要学习的参数

下面我们开始计算损失函数对所有参数 w , b w,b w,b的导数,以损失函数对 w 11 1 w_{11}^{1} w111的偏导数为例,通过观察该神经网络的结构不难发现,改变 w 11 1 w_{11}^{1} w111的值,将通过神经网络图中的红色路线对 E E E造成影响,变化路径如下图所示

三层神经网络导数关系图

则有

∂ E ∂ w 11 [ 1 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 1 [ 2 ] ∂ a 1 [ 2 ] ∂ z 1 [ 2 ] ∂ z 1 [ 2 ] ∂ a 1 [ 1 ] ∂ a 1 [ 1 ] ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ w 11 [ 1 ] + ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 2 [ 2 ] ∂ a 2 [ 2 ] ∂ z 2 [ 2 ] ∂ z 2 [ 2 ] ∂ a 1 [ 1 ] ∂ a 1 [ 1 ] ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ w 11 [ 1 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] [ ∂ z 1 [ 3 ] ∂ a 1 [ 2 ] ∂ a 1 [ 2 ] ∂ z 1 [ 2 ] ∂ z 1 [ 2 ] ∂ a 1 [ 1 ] + ∂ z 1 [ 3 ] ∂ a 2 [ 2 ] ∂ a 2 [ 2 ] ∂ z 2 [ 2 ] ∂ z 2 [ 2 ] ∂ a 1 [ 1 ] ] ∂ a 1 [ 1 ] ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ w 11 [ 1 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ( ∑ i = 1 2 ∂ z 1 [ 3 ] ∂ a i [ 2 ] ∂ a i [ 2 ] ∂ z i [ 2 ] ∂ z i [ 2 ] ∂ a 1 [ 1 ] ) ∂ a 1 [ 1 ] ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ w 11 [ 1 ] = ( y ^ − y ) ⋅ 1 ⋅ ϕ ′ ( z 1 [ 3 ] ) ( ∑ i = 1 2 w i 1 [ 3 ] ϕ ′ ( z i [ 2 ] ) w 1 i [ 2 ] ) ϕ ′ ( z 1 [ 1 ] ) x 1 = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) ( ∑ i = 1 2 w i 1 [ 3 ] ϕ ′ ( z i [ 2 ] ) w 1 i [ 2 ] ) ϕ ′ ( z 1 [ 1 ] ) x 1 同 样 我 们 计 算 出 ∂ E ∂ w 21 [ 1 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ( ∑ i = 1 2 ∂ z 1 [ 3 ] ∂ a i [ 2 ] ∂ a i [ 2 ] ∂ z i [ 2 ] ∂ z i [ 2 ] ∂ a 1 [ 1 ] ) ∂ a 1 [ 1 ] ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ w 21 [ 1 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) ( ∑ i = 1 2 w i 1 [ 3 ] ϕ ′ ( z i [ 2 ] ) w 1 i [ 2 ] ) ϕ ′ ( z 1 [ 1 ] ) x 2 ∂ E ∂ w 12 [ 1 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ( ∑ i = 1 2 ∂ z 1 [ 3 ] ∂ a i [ 2 ] ∂ a i [ 2 ] ∂ z i [ 2 ] ∂ z i [ 2 ] ∂ a 2 [ 1 ] ) ∂ a 2 [ 1 ] ∂ z 2 [ 1 ] ∂ z 2 [ 1 ] ∂ w 12 [ 1 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) ( ∑ i = 1 2 w i 1 [ 3 ] ϕ ′ ( z i [ 2 ] ) w 2 i [ 2 ] ) ϕ ′ ( z 2 [ 1 ] ) x 1 ∂ E ∂ w 22 [ 1 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ( ∑ i = 1 2 ∂ z 1 [ 3 ] ∂ a i [ 2 ] ∂ a i [ 2 ] ∂ z i [ 2 ] ∂ z i [ 2 ] ∂ a 2 [ 1 ] ) ∂ a 2 [ 1 ] ∂ z 2 [ 1 ] ∂ z 2 [ 1 ] ∂ w 22 [ 1 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) ( ∑ i = 1 2 w i 1 [ 3 ] ϕ ′ ( z i [ 2 ] ) w 2 i [ 2 ] ) ϕ ′ ( z 2 [ 1 ] ) x 2 ∂ E ∂ w 11 [ 2 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 1 [ 2 ] ∂ a 1 [ 2 ] ∂ z 1 [ 2 ] ∂ z 1 [ 2 ] ∂ w 11 [ 2 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) w 11 [ 3 ] ϕ ′ ( z 1 [ 2 ] ) a 1 [ 1 ] ∂ E ∂ w 21 [ 2 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 1 [ 2 ] ∂ a 1 [ 2 ] ∂ z 1 [ 2 ] ∂ z 1 [ 2 ] ∂ w 21 [ 2 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) w 11 [ 3 ] ϕ ′ ( z 1 [ 2 ] ) a 2 [ 1 ] ∂ E ∂ w 12 [ 2 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 2 [ 2 ] ∂ a 2 [ 2 ] ∂ z 2 [ 2 ] ∂ z 2 [ 2 ] ∂ w 12 [ 2 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) w 21 [ 3 ] ϕ ′ ( z 2 [ 2 ] ) a 1 [ 1 ] ∂ E ∂ w 22 [ 2 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 2 [ 2 ] ∂ a 2 [ 2 ] ∂ z 2 [ 2 ] ∂ z 2 [ 2 ] ∂ w 22 [ 2 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) w 21 [ 3 ] ϕ ′ ( z 2 [ 2 ] ) a 2 [ 1 ] ∂ E ∂ w 11 [ 3 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ w 11 [ 3 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) a 1 [ 2 ] ∂ E ∂ w 21 [ 3 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 [ 3 ] ∂ a 1 [ 3 ] ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ w 21 [ 3 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) a 2 [ 2 ] \begin{aligned}\frac{\partial E}{\partial w_{11}^{[1]}} &= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}}\frac{\partial z_1^{[3]}}{\partial a_1^{[2]}} \frac{\partial a_1^{[2]}}{\partial z_1^{[2]}}\frac{\partial z_1^{[2]}}{\partial a_1^{[1]}} \frac{\partial a_1^{[1]}}{\partial z_1^{[1]}} \frac{\partial z_1^{[1]}}{\partial w_{11}^{[1]}} +\frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}}\frac{\partial z_1^{[3]}}{\partial a_2^{[2]}} \frac{\partial a_2^{[2]}}{\partial z_2^{[2]}}\frac{\partial z_2^{[2]}}{\partial a_1^{[1]}} \frac{\partial a_1^{[1]}}{\partial z_1^{[1]}} \frac{\partial z_1^{[1]}}{\partial w_{11}^{[1]}} \\&= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}}\bigg[\frac{\partial z_1^{[3]}}{\partial a_1^{[2]}} \frac{\partial a_1^{[2]}}{\partial z_1^{[2]}}\frac{\partial z_1^{[2]}}{\partial a_1^{[1]}}+\frac{\partial z_1^{[3]}}{\partial a_2^{[2]}} \frac{\partial a_2^{[2]}}{\partial z_2^{[2]}}\frac{\partial z_2^{[2]}}{\partial a_1^{[1]}}\bigg] \frac{\partial a_1^{[1]}}{\partial z_1^{[1]}} \frac{\partial z_1^{[1]}}{\partial w_{11}^{[1]}} \\ &=\frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}}\bigg(\sum\limits_{i=1}^{2}\frac{\partial z_1^{[3]}}{\partial a_i^{[2]}} \frac{\partial a_i^{[2]}}{\partial z_i^{[2]}}\frac{\partial z_i^{[2]}}{\partial a_1^{[1]}}\bigg)\frac{\partial a_1^{[1]}}{\partial z_1^{[1]}} \frac{\partial z_1^{[1]}}{\partial w_{11}^{[1]}} \\&=(\hat y -y)\cdot 1 \cdot \phi'(z_1^{[3]})(\sum\limits_{i=1}^2w_{i1}^{[3]}\phi'(z_{i}^{[2]})w_{1i}^{[2]})\phi'(z_1^{[1]})x_1 \\&= (\hat y -y)\phi'(z_1^{[3]})\bigg(\sum\limits_{i=1}^2w_{i1}^{[3]}\phi'(z_{i}^{[2]})w_{1i}^{[2]}\bigg)\phi'(z_1^{[1]})x_1 \\ 同样我们计算出 \\ \frac{\partial E}{\partial w_{21}^{[1]}} &=\frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}}\bigg(\sum\limits_{i=1}^{2}\frac{\partial z_1^{[3]}}{\partial a_i^{[2]}} \frac{\partial a_i^{[2]}}{\partial z_i^{[2]}}\frac{\partial z_i^{[2]}}{\partial a_1^{[1]}}\bigg)\frac{\partial a_1^{[1]}}{\partial z_1^{[1]}} \frac{\partial z_1^{[1]}}{\partial w_{21}^{[1]}} \\&= (\hat y -y)\phi'(z_1^{[3]})\bigg(\sum\limits_{i=1}^2w_{i1}^{[3]}\phi'(z_{i}^{[2]})w_{1i}^{[2]}\bigg)\phi'(z_1^{[1]})x_2 \\ \frac{\partial E}{\partial w_{12}^{[1]}} &=\frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}}\bigg(\sum\limits_{i=1}^{2}\frac{\partial z_1^{[3]}}{\partial a_i^{[2]}} \frac{\partial a_i^{[2]}}{\partial z_i^{[2]}}\frac{\partial z_i^{[2]}}{\partial a_2^{[1]}}\bigg)\frac{\partial a_2^{[1]}}{\partial z_2^{[1]}} \frac{\partial z_2^{[1]}}{\partial w_{12}^{[1]}} \\&= (\hat y -y)\phi'(z_1^{[3]})\bigg(\sum\limits_{i=1}^2w_{i1}^{[3]}\phi'(z_{i}^{[2]})w_{2i}^{[2]}\bigg)\phi'(z_2^{[1]})x_1 \\ \frac{\partial E}{\partial w_{22}^{[1]}} &=\frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}}\bigg(\sum\limits_{i=1}^{2}\frac{\partial z_1^{[3]}}{\partial a_i^{[2]}} \frac{\partial a_i^{[2]}}{\partial z_i^{[2]}}\frac{\partial z_i^{[2]}}{\partial a_2^{[1]}}\bigg)\frac{\partial a_2^{[1]}}{\partial z_2^{[1]}} \frac{\partial z_2^{[1]}}{\partial w_{22}^{[1]}} \\&= (\hat y -y)\phi'(z_1^{[3]})\bigg(\sum\limits_{i=1}^2w_{i1}^{[3]}\phi'(z_{i}^{[2]})w_{2i}^{[2]}\bigg)\phi'(z_2^{[1]})x_2 \\ \\ \frac{\partial E}{\partial w_{11}^{[2]}} &= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}} \frac{\partial z_1^{[3]}}{\partial a_1^{[2]}} \frac{\partial a_1^{[2]}}{\partial z_1^{[2]}} \frac{\partial z_1^{[2]}}{\partial w_{11}^{[2]}} \\&=(\hat y -y)\phi'(z_1^{[3]})w_{11}^{[3]}\phi'(z_1^{[2]})a_1^{[1]} \\ \frac{\partial E}{\partial w_{21}^{[2]}} &= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}} \frac{\partial z_1^{[3]}}{\partial a_1^{[2]}} \frac{\partial a_1^{[2]}}{\partial z_1^{[2]}} \frac{\partial z_1^{[2]}}{\partial w_{21}^{[2]}} \\&=(\hat y -y)\phi'(z_1^{[3]})w_{11}^{[3]}\phi'(z_1^{[2]})a_2^{[1]} \\ \frac{\partial E}{\partial w_{12}^{[2]}} &= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}} \frac{\partial z_1^{[3]}}{\partial a_2^{[2]}} \frac{\partial a_2^{[2]}}{\partial z_2^{[2]}} \frac{\partial z_2^{[2]}}{\partial w_{12}^{[2]}} \\&=(\hat y -y)\phi'(z_1^{[3]})w_{21}^{[3]}\phi'(z_2^{[2]})a_1^{[1]} \\ \frac{\partial E}{\partial w_{22}^{[2]}} &= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}} \frac{\partial z_1^{[3]}}{\partial a_2^{[2]}} \frac{\partial a_2^{[2]}}{\partial z_2^{[2]}} \frac{\partial z_2^{[2]}}{\partial w_{22}^{[2]}}\\&=(\hat y -y)\phi'(z_1^{[3]})w_{21}^{[3]}\phi'(z_2^{[2]})a_2^{[1]} \\ \\ \frac{\partial E}{\partial w_{11}^{[3]}} &= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}} \frac{\partial z_1^{[3]}}{\partial w_{11}^{[3]}} \\&=(\hat y -y)\phi'(z_1^{[3]})a_1^{[2]}\\ \frac{\partial E}{\partial w_{21}^{[3]}} &= \frac{\partial E}{\partial \hat y } \frac{\partial \hat y}{\partial a_1^{[3]} }\frac{\partial a_1^{[3]}}{\partial z_1^{[3]}} \frac{\partial z_1^{[3]}}{\partial w_{21}^{[3]}}\\&=(\hat y -y)\phi'(z_1^{[3]})a_2^{[2]} \end{aligned} w11[1]Ew21[1]Ew12[1]Ew22[1]Ew11[2]Ew21[2]Ew12[2]Ew22[2]Ew11[3]Ew21[3]E=y^Ea1[3]y^z1[3]a1[3]a1[2]z1[3]z1[2]a1[2]a1[1]z1[2]z1[1]a1[1]w11[1]z1[1]+y^Ea1[3]y^z1[3]a1[3]a2[2]z1[3]z2[2]a2[2]a1[1]z2[2]z1[1]a1[1]w11[1]z1[1]=y^Ea1[3]y^z1[3]a1[3][a1[2]z1[3]z1[2]a1[2]a1[1]z1[2]+a2[2]z1[3]z2[2]a2[2]a1[1]z2[2]]z1[1]a1[1]w11[1]z1[1]=y^Ea1[3]y^z1[3]a1[3](i=12ai[2]z1[3]zi[2]ai[2]a1[1]zi[2])z1[1]a1[1]w11[1]z1[1]=(y^y)1ϕ(z1[3])(i=12wi1[3]ϕ(zi[2])w1i[2])ϕ(z1[1])x1=(y^y)ϕ(z1[3])(i=12wi1[3]ϕ(zi[2])w1i[2])ϕ(z1[1])x1=y^Ea1[3]y^z1[3]a1[3](i=12ai[2]z1[3]zi[2]ai[2]a1[1]zi[2])z1[1]a1[1]w21[1]z1[1]=(y^y)ϕ(z1[3])(i=12wi1[3]ϕ(zi[2])w1i[2])ϕ(z1[1])x2=y^Ea1[3]y^z1[3]a1[3](i=12ai[2]z1[3]zi[2]ai[2]a2[1]zi[2])z2[1]a2[1]w12[1]z2[1]=(y^y)ϕ(z1[3])(i=12wi1[3]ϕ(zi[2])w2i[2])ϕ(z2[1])x1=y^Ea1[3]y^z1[3]a1[3](i=12ai[2]z1[3]zi[2]ai[2]a2[1]zi[2])z2[1]a2[1]w22[1]z2[1]=(y^y)ϕ(z1[3])(i=12wi1[3]ϕ(zi[2])w2i[2])ϕ(z2[1])x2=y^Ea1[3]y^z1[3]a1[3]a1[2]z1[3]z1[2]a1[2]w11[2]z1[2]=(y^y)ϕ(z1[3])w11[3]ϕ(z1[2])a1[1]=y^Ea1[3]y^z1[3]a1[3]a1[2]z1[3]z1[2]a1[2]w21[2]z1[2]=(y^y)ϕ(z1[3])w11[3]ϕ(z1[2])a2[1]=y^Ea1[3]y^z1[3]a1[3]a2[2]z1[3]z2[2]a2[2]w12[2]z2[2]=(y^y)ϕ(z1[3])w21[3]ϕ(z2[2])a1[1]=y^Ea1[3]y^z1[3]a1[3]a2[2]z1[3]z2[2]a2[2]w22[2]z2[2]=(y^y)ϕ(z1[3])w21[3]ϕ(z2[2])a2[1]=y^Ea1[3]y^z1[3]a1[3]w11[3]z1[3]=(y^y)ϕ(z1[3])a1[2]=y^Ea1[3]y^z1[3]a1[3]w21[3]z1[3]=(y^y)ϕ(z1[3])a2[2]

导数计算式子中的 y ^ 、 z 、 a \hat y、z、a y^za通过前向传播过程均已计算得出, ϕ ′ ( z ) \phi'(z) ϕ(z)可以通过 ϕ ′ ( z ) = ϕ ( z ) ( 1 − ϕ ( z ) ) = a ( 1 − a ) \phi'(z)=\phi(z)(1−\phi(z)) = a(1-a) ϕ(z)=ϕ(z)(1ϕ(z))=a(1a) 来计算,式子中的 w w w参数,有初始化的默认值,因此我们可以将数据对应代入各式,从而计算出损失函数对各个参数 w w w的偏导数。这里我们仅仅使用了链式法则,从前到后,依次计算出 E E E对各个 w w w 参数的导数,从而可以完成 w w w的更新,对 b b b计算偏导数也类似,不在单独描述。

这种从前往后计算偏导数的方式虽然也能算出结果,但是计算过程中,会发现有大量重复的计算,比如在计算 ∂ E ∂ w 11 [ 1 ] \frac{\partial E}{\partial w_{11}^{[1]}} w11[1]E ∂ E ∂ w 21 [ 1 ] \frac{\partial E}{\partial w_{21}^{[1]}} w21[1]E 时,就只有最后标红的 x 1 x_1 x1 x 2 x_2 x2是不同的

∂ E ∂ w 11 [ 1 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) ( ∑ i = 1 2 w i 1 [ 3 ] ϕ ′ ( z i [ 2 ] ) w 1 i [ 2 ] ) ϕ ′ ( z 1 [ 1 ] ) x 1 ∂ E ∂ w 21 [ 1 ] = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) ( ∑ i = 1 2 w i 1 [ 3 ] ϕ ′ ( z i [ 2 ] ) w 1 i [ 2 ] ) ϕ ′ ( z 1 [ 1 ] ) x 2 \begin{aligned}\frac{\partial E}{\partial w_{11}^{[1]}} &= \color{green}{(\hat y -y)\phi'(z_1^{[3]})\bigg(\sum\limits_{i=1}^2w_{i1}^{[3]}\phi'(z_{i}^{[2]})w_{1i}^{[2]}\bigg)\phi'(z_1^{[1]})}\color{red}{x_1 } \\ \frac{\partial E}{\partial w_{21}^{[1]}} &= \color{green}{(\hat y -y)\phi'(z_1^{[3]})\bigg(\sum\limits_{i=1}^2w_{i1}^{[3]}\phi'(z_{i}^{[2]})w_{1i}^{[2]}\bigg)\phi'(z_1^{[1]})}\color{red}{x_2}\end{aligned} w11[1]Ew21[1]E=(y^y)ϕ(z1[3])(i=12wi1[3]ϕ(zi[2])w1i[2])ϕ(z1[1])x1=(y^y)ϕ(z1[3])(i=12wi1[3]ϕ(zi[2])w1i[2])ϕ(z1[1])x2

类似的重复计算还有很多,实际的神经网络模型往往十分复杂,这种大量的重复计算会造成很大的灾难。如果你有兴趣,可以按照这种方式将对 b b b的偏导数也列出来,同样会发现有各种重复计算。因此我们需要一个好的算法来快速计算梯度。

为了优化梯度计算,我们尝试另外一种方式来计算,在计算 ∂ E ∂ w 11 [ 1 ] \begin{aligned}\frac{\partial E}{\partial w_{11}^{[1]}}\end{aligned} w11[1]E 时,我们发现,在正向传播过程中,只有 z 1 [ 1 ] = x 1 ∗ w 11 [ 1 ] + x 2 ∗ w 21 [ 1 ] + b 1 [ 1 ] z^{[1]}_1 = x_1* w_{11}^{[1]}+x_2* w_{21}^{[1]}+b_1^{[1]} z1[1]=x1w11[1]+x2w21[1]+b1[1] 含有 w 21 [ 1 ] w_{21}^{[1]} w21[1],如果我们能直接计算出 ∂ E ∂ z 1 [ 1 ] \begin{aligned}\frac{\partial E}{\partial z_{1}^{[1]}}\end{aligned} z1[1]E 的值,那么就可以通过 ∂ E ∂ w 11 [ 1 ] = ∂ E ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ w 11 [ 1 ] = ∂ E ∂ z 1 [ 1 ] x 1 \begin{aligned}\frac{\partial E}{\partial w_{11}^{[1]}}= \frac{\partial E}{\partial z_{1}^{[1]}}\frac{\partial z_{1}^{[1]}}{\partial w_{11}^{[1]}} = \frac{\partial E}{\partial z_{1}^{[1]}}x_1\end{aligned} w11[1]E=z1[1]Ew11[1]z1[1]=z1[1]Ex1 式子计算对 w 11 [ 1 ] w_{11}^{[1]} w11[1]的偏导数,且此时对 b 1 [ 1 ] b_1^{[1]} b1[1]的偏导数可以通过 ∂ E ∂ b 1 [ 1 ] = ∂ E ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ b 1 [ 1 ] = ∂ E ∂ z 1 [ 1 ] \begin{aligned}\frac{\partial E}{\partial b_{1}^{[1]}} = \frac{\partial E}{\partial z_{1}^{[1]}}\frac{\partial z_{1}^{[1]}}{\partial b_{1}^{[1]}} = \frac{\partial E}{\partial z_{1}^{[1]}}\end{aligned} b1[1]E=z1[1]Eb1[1]z1[1]=z1[1]E 算出来,一举两得。按照这个思路,我们尝试以下计算

∂ E ∂ w 11 [ 1 ] = ∂ E ∂ z 1 [ 1 ] ∂ z 1 [ 1 ] ∂ w 11 [ 1 ] = ∂ E ∂ z 1 [ 1 ] x 1 ∂ E ∂ z 1 [ 1 ] = ∂ E ∂ z 1 [ 2 ] ∂ z 1 [ 2 ] ∂ a 1 [ 1 ] ∂ a 1 [ 1 ] ∂ z 1 [ 1 ] + ∂ E ∂ z 2 [ 2 ] ∂ z 2 [ 2 ] ∂ a 1 [ 1 ] ∂ a 1 [ 1 ] ∂ z 1 [ 1 ] = ∂ E ∂ z 1 [ 2 ] w 11 [ 2 ] ϕ ′ ( z 1 [ 1 ] ) + ∂ E ∂ z 2 [ 2 ] w 12 [ 2 ] ϕ ′ ( z 1 [ 1 ] ) ∂ E ∂ z 1 [ 2 ] = ∂ E ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 1 [ 2 ] ∂ a 1 [ 2 ] ∂ z 1 [ 2 ] = ∂ E ∂ z 1 [ 3 ] w 11 [ 3 ] ϕ ′ ( z 1 [ 2 ] ) ∂ E ∂ z 2 [ 2 ] = ∂ E ∂ z 1 [ 3 ] ∂ z 1 [ 3 ] ∂ a 2 [ 2 ] ∂ a 2 [ 2 ] ∂ z 2 [ 2 ] = ∂ E ∂ z 1 [ 3 ] w 21 [ 3 ] ϕ ′ ( z 2 [ 2 ] ) ∂ E ∂ z 1 [ 3 ] = ∂ E ∂ y ^ ∂ y ^ ∂ a 1 3 ∂ a 1 3 ∂ z 1 3 = ( y ^ − y ) ϕ ′ ( z 1 [ 3 ] ) \begin{aligned}\frac{\partial E}{\partial w_{11}^{[1]}} &= \frac{\partial E}{\partial z_{1}^{[1]}}\frac{\partial z_{1}^{[1]}}{\partial w_{11}^{[1]}} = \frac{\partial E}{\partial z_{1}^{[1]}}x_1 \\ \frac{\partial E}{\partial z_{1}^{[1]}} &= \frac{\partial E}{\partial z_{1}^{[2]}}\frac{\partial z_{1}^{[2]}}{\partial a_{1}^{[1]}}\frac{\partial a_1^{[1]}}{\partial z_{1}^{[1]}}+\frac{\partial E}{\partial z_{2}^{[2]}}\frac{\partial z_{2}^{[2]}}{\partial a_{1}^{[1]}}\frac{\partial a_1^{[1]}}{\partial z_{1}^{[1]}} = \frac{\partial E}{\partial z_{1}^{[2]}}w_{11}^{[2]}\phi'(z_1^{[1]})+\frac{\partial E}{\partial z_{2}^{[2]}}w_{12}^{[2]}\phi'(z_1^{[1]}) \\\frac{\partial E}{\partial z_{1}^{[2]}} &= \frac{\partial E}{\partial z_{1}^{[3]}} \frac{\partial z_1^{[3]}}{\partial a_{1}^{[2]}} \frac{\partial a_1^{[2]}}{\partial z_{1}^{[2]}} = \frac{\partial E}{\partial z_{1}^{[3]}}w_{11}^{[3]}\phi'(z_1^{[2]}) \\ \frac{\partial E}{\partial z_{2}^{[2]}} &= \frac{\partial E}{\partial z_{1}^{[3]}} \frac{\partial z_1^{[3]}}{\partial a_{2}^{[2]}} \frac{\partial a_2^{[2]}}{\partial z_{2}^{[2]}} = \frac{\partial E}{\partial z_{1}^{[3]}}w_{21}^{[3]}\phi'(z_2^{[2]})\\\frac{\partial E}{\partial z_{1}^{[3]}}&=\frac{\partial E}{\partial \hat y}\frac{\partial \hat y}{\partial a_1^{3}}\frac{\partial a_1^{3}}{\partial z_1^{3}} = (\hat y -y)\phi'(z_1^{[3]})\end{aligned} w11[1]Ez1[1]Ez1[2]Ez2[2]Ez1[3]E=z1[1]Ew11[1]z1[1]=z1[1]Ex1=z1[2]Ea1[1]z1[2]z1[1]a1[1]+z2[2]Ea1[1]z2[2]z1[1]a1[1]=z1[2]Ew11[2]ϕ(z1[1])+z2[2]Ew12[2]ϕ(z1[1])=z1[3]Ea1[2]z1[3]z1[2]a1[2]=z1[3]Ew11[3]ϕ(z1[2])=z1[3]Ea2[2]z1[3]z2[2]a2[2]=z1[3]Ew21[3]ϕ(z2[2])=y^Ea13y^z13a13=(y^y)ϕ(z1[3])

我们通过这种方式计算 ∂ E ∂ w 11 [ 1 ] \begin{aligned}\frac{\partial E}{\partial w_{11}^{[1]}}\end{aligned} w11[1]E ,经过一系列推导,发现我们最终只需要计算出 ∂ E ∂ z 1 [ 3 ] \begin{aligned}\frac{\partial E}{\partial z_{1}^{[3]}}\end{aligned} z1[3]E,然后从下至上层层传递,即可完成导数计算,且在往上递推的同时,有效避免了重复计算,原因是我们同时还计算出了其他的 ∂ E ∂ z i [ l ] \begin{aligned}\frac{\partial E}{\partial z_{i}^{[l]}}\end{aligned} zi[l]E 的值,根据该值很容易算出 E E E对其他关联参数的偏导数。

这就是 B P BP BP算法的做的事情,通过误差逆向传播的方式,快速高效的计算 E E E对各个参数的偏导数。

5. B P BP BP算法一般化推导

通过上面的例子,我们大致了解了 B P BP BP算法的计算方式,现在我们将进行一般化的正式推导,为了方便书写,我们将采用向量的方式进行推导,输入仍然使用一组数据 ( X , y ) (X,y) (X,y),并令 x = a [ 0 ] x = a^{[0]} x=a[0]

则对于一般的神经网络,我们有

z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] , a [ 1 ] = ϕ 1 ( z [ 1 ] ) z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] , a [ 2 ] = ϕ 2 ( z [ 2 ] ) ⋮ z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] , a [ l ] = ϕ l ( z [ l ] ) z [ l + 1 ] = W [ l + 1 ] a [ l ] + b [ l + 1 ] , a [ l + 1 ] = ϕ l + 1 ( z [ l + 1 ] ) ⋮ z [ L ] = W [ L ] a [ L − 1 ] + b [ L ] , a [ L ] = ϕ L ( z [ L ] ) y ^ = a [ L ] E = 1 2 ∣ ∣ y ^ − y ∣ ∣ 2 \begin{aligned} z^{[1]} &= W^{[1]} a^{[0]}+b^{[1]}, a^{[1]} = \phi_1(z^{[1]}) \\z^{[2]} &= W^{[2]} a^{[1]}+b^{[2]}, a^{[2]} = \phi_2(z^{[2]}) \\ &\vdots \\z^{[l]} &= W^{[l]} a^{[l-1]}+b^{[l]}, a^{[l]} = \phi_{l}(z^{[l]}) \\ z^{[l+1]} &= W^{[l+1]} a^{[l]}+b^{[l+1]}, a^{[l+1]} = \phi_{l+1}(z^{[l+1]}) \\ &\vdots \\ z^{[L]} &= W^{[L]} a^{[L-1]}+b^{[L]}, a^{[L]} = \phi_L(z^{[L]}) \\\hat y &= a^{[L]} \\ E &= \frac{1}{2}||\hat y-y||^2 \end{aligned} z[1]z[2]z[l]z[l+1]z[L]y^E=W[1]a[0]+b[1],a[1]=ϕ1(z[1])=W[2]a[1]+b[2],a[2]=ϕ2(z[2])=W[l]a[l1]+b[l],a[l]=ϕl(z[l])=W[l+1]a[l]+b[l+1],a[l+1]=ϕl+1(z[l+1])=W[L]a[L1]+b[L],a[L]=ϕL(z[L])=a[L]=21y^y2

δ i [ l ] = ∂ E ∂ z i [ l ] \begin{aligned}\delta_i^{[l]} = \frac{\partial E}{\partial z_{i}^{[l]}}\end{aligned} δi[l]=zi[l]E

则对于第 L L L层(输出层)有

δ i [ L ] = ∂ E ∂ z i [ L ] = ∂ E ∂ y ^ i ∂ y ^ i ∂ a i [ L ] ∂ a i [ L ] ∂ z i [ L ] = ( y ^ i − y i ) ϕ ′ ( z i L ) \begin{aligned}\delta_i^{[L]} &= \frac{\partial E}{\partial z_{i}^{[L]}} = \frac{\partial E}{\partial \hat y_i}\frac{\partial \hat y_i}{\partial a_i^{[L]}}\frac{\partial a_i^{[L]}}{\partial z_i^{[L]}} = (\hat y_i-y_i)\phi'(z_i^{L})\end{aligned} δi[L]=zi[L]E=y^iEai[L]y^izi[L]ai[L]=(y^iyi)ϕ(ziL)

对于隐藏层,为了方便理解,我们用图画出第 l l l层与第 l + 1 l+1 l+1层的关系,如下图所示

第l层与第l+1层连接关系
,很明显, z i [ l ] z_i^{[l]} zi[l]的值会影响 l + 1 l+1 l+1层所有的神经元,因此有公式

δ i [ l ] = ∑ j = 1 M l + 1 ∂ E ∂ z j [ l + 1 ] ∂ z j [ l + 1 ] ∂ a i [ l ] ∂ a i [ l ] ∂ z i [ l ] = ∑ j = 1 M l + 1 δ j [ l + 1 ] w i j [ l + 1 ] ϕ l ′ ( z i [ l ] ) \begin{aligned}\delta_i^{[l]} &= \sum\limits_{j=1}^{M_{l+1}}\frac{\partial E}{\partial z_{j}^{[l+1]}}\frac{\partial z_{j}^{[l+1]}}{\partial a_i^{[l]}}\frac{\partial a_i^{[l]}}{\partial z_i^{[l]}} = \sum\limits_{j=1}^{M_{l+1}}\delta_j^{[l+1]}w_{ij}^{[l+1]}\phi_l'(z_i^{[l]}) \end{aligned} δi[l]=j=1Ml+1zj[l+1]Eai[l]zj[l+1]zi[l]ai[l]=j=1Ml+1δj[l+1]wij[l+1]ϕl(zi[l]) 成立

利用该公式可层层递推,计算出 δ i [ l ] \delta_i^{[l]} δi[l]的值,再根据

∂ E ∂ w i j [ l ] = ∂ E ∂ z j [ l ] ∂ z j [ l ] ∂ w i j [ l ] = δ j [ l ] a i [ l − 1 ] ∂ E ∂ b i [ l ] = ∂ E ∂ z i [ l ] ∂ z i [ l ] ∂ b i [ l ] = δ i [ l ] \begin{aligned}\frac{\partial E}{\partial w_{ij}^{[l]}} &= \frac{\partial E}{\partial z_{j}^{[l]}} \frac{\partial z_{j}^{[l]}}{\partial w_{ij}^{[l]}} = \delta_j^{[l]}a_i^{[l-1]}\\\frac{\partial E}{\partial b_{i}^{[l]}} &=\frac{\partial E}{\partial z_{i}^{[l]}} \frac{\partial z_{i}^{[l]}}{\partial b_{i}^{[l]}} = \delta_i^{[l]}\end{aligned} wij[l]Ebi[l]E=zj[l]Ewij[l]zj[l]=δj[l]ai[l1]=zi[l]Ebi[l]zi[l]=δi[l] 计算出所有的 ∂ E ∂ w i j [ l ] 、 ∂ E ∂ b i [ l ] \begin{aligned}\frac{\partial E}{\partial w_{ij}^{[l]}} 、\frac{\partial E}{\partial b_{i}^{[l]}} \end{aligned} wij[l]Ebi[l]E即可。

其实你会发现, B P BP BP算法的推导是十分简单的,关键在于理解和运用链式法则。

6. 误差逆向传播过程理解

我们在推导 B P BP BP算法的时候,有递推公式 δ i [ l ] = ∑ j = 1 M l + 1 δ j [ l + 1 ] w i j [ l + 1 ] ϕ l ′ ( z i [ l ] ) \begin{aligned}\delta_i^{[l]} =\sum\limits_{j=1}^{M_{l+1}}\delta_j^{[l+1]}w_{ij}^{[l+1]}\phi_l'(z_i^{[l]}) \end{aligned} δi[l]=j=1Ml+1δj[l+1]wij[l+1]ϕl(zi[l])

事实上,在逆向传播的过程中, δ i [ l ] \delta_i^{[l]} δi[l]是沿着神经网络的反方向有规律的进行传播的,为了方便理解,我们以三层神经网络为例,误差的逆向传播过程可通过下图表示,其结构跟前向神经网络结构是保持一致的,只不过前向传播的是信号,后向传播的是误差。通过该图也能很好的理解,后向传播算法在计算梯度时,没有重复计算,效率会比直接计算梯度高很多。

误差逆向传播过程

7. 关于梯度消失

还是根据公式 δ i [ l ] = ∑ j = 1 M l + 1 δ j [ l + 1 ] w i j [ l + 1 ] ϕ l ′ ( z i [ l ] ) \begin{aligned}\delta_i^{[l]} =\sum\limits_{j=1}^{M_{l+1}}\delta_j^{[l+1]}w_{ij}^{[l+1]}\phi_l'(z_i^{[l]}) \end{aligned} δi[l]=j=1Ml+1δj[l+1]wij[l+1]ϕl(zi[l]) 进行分析。

误差从输出层反向传播时,在每一层都要乘以该层的激活函数的导数,如果激活函数使用 S i g m o i d Sigmoid Sigmoid或者 T a n h Tanh Tanh时,其导数值均小于 1 1 1,且输入过大或者过小时,导数均趋于 0 0 0,误差经过每一层传递都会不断衰减。当网络层数很深时,梯度就会不停衰减,甚至消失,使得整个网络很难训练,这就是所谓的梯度消失问题。越靠近输入层的神经元,其梯度衰减也就越明显。可通过更换激活函数、较少神经网络层数等方式,解决梯度消失问题。

至于梯度爆炸,也能通过该公式进行分析,但是梯度爆炸往往是由于错误的初始化 w w w,导致越靠近输入层的权重变化越大,甚至出现权值数据溢出,进而发生梯度爆炸现象,该现象处理方式相对相对简单,保证 w w w初始化值不要过大,也可以通过梯度裁剪的方式进行粗暴的解决,如将梯度限定在 [ − 1 , 1 ] [-1,1] [1,1]之间,即如果梯度大于 1 1 1,则令梯度为 1 1 1。若小于 − 1 -1 1,则令梯度为 − 1 -1 1,这叫做 G r a d i e n t   C l i p p i n g Gradient \ Clipping Gradient Clipping

8. 激活函数为什么需要零均值

S i g m o i d Sigmoid Sigmoid函数是非零均值的,其输出值均大于 0 0 0,可能会导致模型收敛缓慢,这个是神经网络基础篇 遗留的问题,了解完 B P BP BP算法之后,这里给出解释:根据公式 ∂ E ∂ w i j [ l ] = δ j [ l ] a i [ l − 1 ] \begin{aligned}\frac{\partial E}{\partial w_{ij}^{[l]}} = \delta_j^{[l]}a_i^{[l-1]}\end{aligned} wij[l]E=δj[l]ai[l1] 可知,如果固定 j j j不变,则 δ j [ l ] \delta_j^{[l]} δj[l]为一个固定的值, a i [ l − 1 ] a_i^{[l-1]} ai[l1] l − 1 l-1 l1层第 i i i个神经元的激活值,其值大于 0 0 0, 此时 ∂ E ∂ w i j [ l ] \begin{aligned}\frac{\partial E}{\partial w_{ij}^{[l]}}\end{aligned} wij[l]E值的正负,取决于 δ j [ l ] \delta_j^{[l]} δj[l],这会导致当 i = 1 , 2 , ⋯   , M l − 1 i=1,2,\cdots,M_{l-1} i=1,2,,Ml1 变化时,所有的 ∂ E ∂ w i j [ l ] \begin{aligned}\frac{\partial E}{\partial w_{ij}^{[l]}}\end{aligned} wij[l]E均同正或者同负,即所有的 w i j [ l ] w_{ij}^{[l]} wij[l](下图中红色连接线对应的权重)只能往同一个方向更新,当实际的更新需求为一部分 w i j [ l ] w_{ij}^{[l]} wij[l]往正方向更新,一部分 w i j [ l ] w_{ij}^{[l]} wij[l]往负方向更新时,使用 S i g m o i d Sigmoid Sigmoid激活函数,无法同时满足,从而导致梯度下降缓慢。

激活函数非零均值插图

  • 12
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步以至千里。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值