文章目录
在 神经网络基础篇 我们介绍了神经网络的一些基础知识,并提到神经网络的强大的表达能力,但是我们并不知道该如何训练它以获取各个参数,为此我们将介绍其中最最典型的算法: 误差逆传播算法( 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} ∂x∂z=∂y∂z⋅∂x∂y
-
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} ∂t∂z=∂x∂z⋅∂t∂x+∂y∂z⋅∂t∂y
2. B P BP BP算法流程
B P BP BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,算法流程大致如下:
-
随机初始化所有的 ( w , b ) (w,b) (w,b)
-
输入训练样本集 { ( 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^) ,这个是信号的前向传播过程
-
使用梯度下降法,最小化损失函数
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=1∑N(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−η∂w∂E∣∣∣∣wold=bold−η∂b∂E∣∣∣∣bold
-
重复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×Ml−1wij[l]b[l]∈RMlbi[l]z[l]∈RMlzi[l]a[l]∈RMlai[l]含义神经网络层数第l层神经元的个数第l层神经元的激活函数第l−1层到第l层的权重矩阵第l−1层的第i个神经元与第l层第j个神经元的连接权重第l层的偏置矩阵第l层第i个神经元的偏置第l层神经元的非激活值第l层第i个神经元的非激活值第l层的激活值第l层第i个神经元的激活值
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(1−a)
对于上面的神经网络有以下几个式子成立:
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=x1∗w11[1]+x2∗w21[1]+b1[1],a1[1]=ϕ1(z1[1])=x1∗w12[1]+x2∗w22[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 z、a以及最终的输出 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]∂E同样我们计算出∂w21[1]∂E∂w12[1]∂E∂w22[1]∂E∂w11[2]∂E∂w21[2]∂E∂w12[2]∂E∂w22[2]∂E∂w11[3]∂E∂w21[3]∂E=∂y^∂E∂a1[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^∂E∂a1[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^∂E∂a1[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^∂E∂a1[3]∂y^∂z1[3]∂a1[3](i=1∑2∂ai[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=1∑2wi1[3]ϕ′(zi[2])w1i[2])ϕ′(z1[1])x1=(y^−y)ϕ′(z1[3])(i=1∑2wi1[3]ϕ′(zi[2])w1i[2])ϕ′(z1[1])x1=∂y^∂E∂a1[3]∂y^∂z1[3]∂a1[3](i=1∑2∂ai[2]∂z1[3]∂zi[2]∂ai[2]∂a1[1]∂zi[2])∂z1[1]∂a1[1]∂w21[1]∂z1[1]=(y^−y)ϕ′(z1[3])(i=1∑2wi1[3]ϕ′(zi[2])w1i[2])ϕ′(z1[1])x2=∂y^∂E∂a1[3]∂y^∂z1[3]∂a1[3](i=1∑2∂ai[2]∂z1[3]∂zi[2]∂ai[2]∂a2[1]∂zi[2])∂z2[1]∂a2[1]∂w12[1]∂z2[1]=(y^−y)ϕ′(z1[3])(i=1∑2wi1[3]ϕ′(zi[2])w2i[2])ϕ′(z2[1])x1=∂y^∂E∂a1[3]∂y^∂z1[3]∂a1[3](i=1∑2∂ai[2]∂z1[3]∂zi[2]∂ai[2]∂a2[1]∂zi[2])∂z2[1]∂a2[1]∂w22[1]∂z2[1]=(y^−y)ϕ′(z1[3])(i=1∑2wi1[3]ϕ′(zi[2])w2i[2])ϕ′(z2[1])x2=∂y^∂E∂a1[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^∂E∂a1[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^∂E∂a1[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^∂E∂a1[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^∂E∂a1[3]∂y^∂z1[3]∂a1[3]∂w11[3]∂z1[3]=(y^−y)ϕ′(z1[3])a1[2]=∂y^∂E∂a1[3]∂y^∂z1[3]∂a1[3]∂w21[3]∂z1[3]=(y^−y)ϕ′(z1[3])a2[2]
导数计算式子中的 y ^ 、 z 、 a \hat y、z、a y^、z、a通过前向传播过程均已计算得出, ϕ ′ ( 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(1−a) 来计算,式子中的 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]∂E∂w21[1]∂E=(y^−y)ϕ′(z1[3])(i=1∑2wi1[3]ϕ′(zi[2])w1i[2])ϕ′(z1[1])x1=(y^−y)ϕ′(z1[3])(i=1∑2wi1[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]=x1∗w11[1]+x2∗w21[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]∂E∂w11[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]∂E∂b1[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]∂E∂z1[1]∂E∂z1[2]∂E∂z2[2]∂E∂z1[3]∂E=∂z1[1]∂E∂w11[1]∂z1[1]=∂z1[1]∂Ex1=∂z1[2]∂E∂a1[1]∂z1[2]∂z1[1]∂a1[1]+∂z2[2]∂E∂a1[1]∂z2[2]∂z1[1]∂a1[1]=∂z1[2]∂Ew11[2]ϕ′(z1[1])+∂z2[2]∂Ew12[2]ϕ′(z1[1])=∂z1[3]∂E∂a1[2]∂z1[3]∂z1[2]∂a1[2]=∂z1[3]∂Ew11[3]ϕ′(z1[2])=∂z1[3]∂E∂a2[2]∂z1[3]∂z2[2]∂a2[2]=∂z1[3]∂Ew21[3]ϕ′(z2[2])=∂y^∂E∂a13∂y^∂z13∂a13=(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[l−1]+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[L−1]+b[L],a[L]=ϕL(z[L])=a[L]=21∣∣y^−y∣∣2
令 δ 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^i∂E∂ai[L]∂y^i∂zi[L]∂ai[L]=(y^i−yi)ϕ′(ziL)
对于隐藏层,为了方便理解,我们用图画出第 l l l层与第 l + 1 l+1 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=1∑Ml+1∂zj[l+1]∂E∂ai[l]∂zj[l+1]∂zi[l]∂ai[l]=j=1∑Ml+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]∂E∂bi[l]∂E=∂zj[l]∂E∂wij[l]∂zj[l]=δj[l]ai[l−1]=∂zi[l]∂E∂bi[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]∂E、∂bi[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=1∑Ml+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=1∑Ml+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[l−1] 可知,如果固定 j j j不变,则 δ j [ l ] \delta_j^{[l]} δj[l]为一个固定的值, a i [ l − 1 ] a_i^{[l-1]} ai[l−1]为 l − 1 l-1 l−1层第 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,⋯,Ml−1 变化时,所有的 ∂ 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激活函数,无法同时满足,从而导致梯度下降缓慢。