杂记:神经网络BP反向传播公式推导【前馈神经网络篇】

杂记:神经网络BP反向传播公式推导【前馈神经网络篇】

本篇文章是在学习了邱锡鹏老师的《神经网络与深度学习》之后写得。邱老师写的很好,本篇文章主要是对反向传播这块的公式进行整理与推导。

前馈神经网络的简单模型:

他的基本结构是:前一层的神经元输出,经过激活函数后,成为后一层神经网络的输入。
用公式来表达上述关系就是:
z ( l + 1 ) = W ( l + 1 ) a ( l ) + b ( l + 1 ) a ( l ) = f l ( z ( l ) ) \begin{aligned} \boldsymbol{ z}^{(l+1)}&=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)} \\ \boldsymbol{ a}^{(l)}&=f_l(\boldsymbol{z}^{(l)}) \end{aligned} z(l+1)a(l)=W(l+1)a(l)+b(l+1)=fl(z(l))上述模型揭示了两个关系:
(1)全连接网络的网络结构是:由输入经过一个权重矩阵 W \boldsymbol{W} W和偏置 b \boldsymbol{b} b,得到全连接层的输出。
(2) z ( l ) \boldsymbol{ z}^{(l)} z(l)是第 l l l层全连接层的直接输出,经过激活函数 f l ( ⋅ ) f_l(\boldsymbol ·) fl()得到本层的输出 a ( l ) \boldsymbol{ a}^{(l)} a(l),它也是下一层的输入。

模型优化简述:

  在前馈神经网络的模型上,多层的神经网络已经能够完成由给定输入得到输出,为了让神经网络更好的表示输入和输出的关系,我们需要逐步更改权重矩阵 W W W,使得给定输入、尽可能的得到期望的正确输出。
  这种更改模型的参数 W \boldsymbol W W使得模型结果变优的过程,可以说是训练过程,它的常用的方法是梯度下降法:它的核心是在量化预测结果和输出结果的误差的基础上,以梯度下降的方法使得预测误差下降以达到可接受的范围内。
  梯度下降法在网络训练中存在的问题
W ( l ) ← W ( l ) − α ∂ R ( W , b ) ∂ W ( l ) = W ( l ) − α ( 1 N ∑ n = 1 N ( ∂ L ( y ( n ) , y ^ ( n ) ) ∂ W ( l ) ) + λ W ( l ) ) b ( l ) ← b ( l ) − α ∂ R ( W , b ) ∂ b ( l ) = b ( l ) − α ( 1 N ∑ n = 1 N ∂ L ( y ( n ) , y ^ ( n ) ) ∂ b ( l ) ) \begin{aligned} \boldsymbol{W}^{(l)} & \leftarrow \boldsymbol{W}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{W}^{(l)}} \\ &=\boldsymbol{W}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N}\left(\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}}\right)+\lambda \boldsymbol{W}^{(l)}\right) \\ \boldsymbol{b}^{(l)} & \leftarrow \boldsymbol{b}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{b}^{(l)}} \\ &=\boldsymbol{b}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N} \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}}\right) \end{aligned} W(l)b(l)W(l)αW(l)R(W,b)=W(l)αN1n=1NW(l)L(y(n),y^(n))+λW(l)b(l)αb(l)R(W,b)=b(l)αN1n=1Nb(l)L(y(n),y^(n))  参数迭代需要计算大量的计算,非常复杂。

参数优化的解决方案:反向传播算法

先把握核心概念:仍然是梯度下降,但是是利用后一层的“误差”去更新前一层的“误差”。我觉得这是反向传播的内涵,抓住了这一点就不会在复杂的公式中迷失了。
再把握优化目标
             参数1:权重矩阵 W \boldsymbol W W 参数2:偏置向量 b \boldsymbol b b
明确直接目的:
  根据梯度下降法的内涵,参数的更新过程应为:
W ( l ) ← W ( l ) − α ∂ L ( y ( n ) , y ^ ( n ) ) ∂ W ( l ) b ( l ) ← b ( l ) − α ∂ L ( y ( n ) , y ^ ( n ) ) ∂ b ( l ) \begin{aligned} \boldsymbol{W}^{(l)} & \leftarrow \boldsymbol{W}^{(l)}-\alpha \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}} \\ \boldsymbol{b}^{(l)} & \leftarrow \boldsymbol{b}^{(l)}-\alpha \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}} \\ \end{aligned} W(l)b(l)W(l)αW(l)L(y(n),y^(n))b(l)αb(l)L(y(n),y^(n))  也就是说我们只需要考虑两个指标:
∂ L ( y ( n ) , y ^ ( n ) ) ∂ W ( l ) , ∂ L ( y ( n ) , y ^ ( n ) ) ∂ b ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}} ,\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}} W(l)L(y(n),y^(n)),b(l)L(y(n),y^(n))   L ( y ( n ) , y ^ ( n ) ) \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right) L(y(n),y^(n))表示的是经过一种损失函数比如平方、交叉熵等量化的 y ( n ) , y ^ ( n ) \boldsymbol{y}^{(n)},\hat{\boldsymbol{y}}^{(n)} y(n),y^(n)的偏差。

反向传播算法推导之权重矩阵:

  明确一个概念:讨论 ∂ L ( y ( n ) , y ^ ( n ) ) ∂ W ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}} W(l)L(y(n),y^(n))和讨论 ∂ L ( y ( n ) , y ^ ( n ) ) ∂ w i j ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{w_{ij}}^{(l)}} wij(l)L(y(n),y^(n))等价的,进一步是 [ ∂ L ( y ( n ) , y ^ ( n ) ) ∂ W ( l ) ] i j = ∂ L ( y ( n ) , y ^ ( n ) ) ∂ w i j ( l ) \left[\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}}\right ]_{ij} =\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{w_{ij}}^{(l)}} [W(l)L(y(n),y^(n))]ij=wij(l)L(y(n),y^(n))
  所以只讨论:
∂ L ( y , y ^ ) ∂ w i j ( l ) = ∂ z ( l ) w i j ( l ) ∂ L ( y , y ^ ) ∂ z ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {w_{ij}}^{(l)}} =\frac{\partial \boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial \boldsymbol { z}^{(l)}} wij(l)L(y,y^)=wij(l)z(l)z(l)L(y,y^)

第一部分:证明 ∂ z ( l ) w i j ( l ) = [ 0... , a j ( l − 1 ) , 0... ] \frac{\partial\boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}=\left[ 0...,a_{j}^{(l-1)},0... \right ] wij(l)z(l)=[0...,aj(l1),0...]

  因为: z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) \boldsymbol{ z}^{(l)}=\boldsymbol{W}^{(l)}\boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)} z(l)=W(l)a(l1)+b(l),写成每一项的形式的话有: z i ( l ) = ∑ k w i k ( l ) a k ( l − 1 ) + b j ( l ) z^{(l)}_{i}=\sum_{k}w_{ik}^{(l)}a_k^{(l-1)}+b_j^{(l)} zi(l)=kwik(l)ak(l1)+bj(l)(矩阵乘法展开)
  所以唯一能出现 w i j ( l ) w_{ij}^{(l)} wij(l)项只有 k = j k=j k=j的情况,根据求导法则,其余项与 w i j ( l ) w_{ij}^{(l)} wij(l)无关,偏导为0,则有:
∂ z ( l ) w i j ( l ) = [ ∂ z 1 ( l ) w i j ( l ) , . . . ∂ z M ( l ) w i j ( l ) ] = [ 0... , ∂ z j ( l ) w i j ( l ) , 0... ] = [ 0... , a j ( l − 1 ) , 0... ] \begin{aligned} \frac{\partial\boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}&=\left[ \frac{\partial z_1^{(l)}}{{w_{ij}}^{(l)}} , ...\frac{\partial z_M^{(l)}}{{w_{ij}}^{(l)}} \right] \\&=\left[ 0...,\frac{\partial z_{j}^{(l)}}{{w_{ij}}^{(l)}},0... \right ] =\left[ 0...,a_{j}^{(l-1)},0... \right ] \end{aligned} wij(l)z(l)=[wij(l)z1(l),...wij(l)zM(l)]=[0...,wij(l)zj(l),0...]=[0...,aj(l1),0...]

第二部分:记 ∂ L ( y , y ^ ) ∂ z ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial { z}^{(l)}} z(l)L(y,y^) δ ( l ) \delta^{(l)} δ(l),表示第 l l l层的误差项,推导反向传播公式,即用 δ ( l + 1 ) \delta^{(l+1)} δ(l+1)来计算 δ ( l ) \delta^{(l)} δ(l)

  根据模型:
z ( l + 1 ) = W ( l + 1 ) a ( l ) + b ( l + 1 ) a ( l ) = f l ( z ( l ) ) \begin{aligned} \boldsymbol{ z}^{(l+1)}&=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)} \\ \boldsymbol{ a}^{(l)}&=f_l(\boldsymbol{z}^{(l)}) \end{aligned} z(l+1)a(l)=W(l+1)a(l)+b(l+1)=fl(z(l))  可以看出,公式(1)中蕴含着“传播递推规律”,公式(2)作为联系两个变量的桥梁。
  所以核心公式推导为(利用链式法则):
δ ( l ) ≜ ∂ L ( y , y ^ ) ∂ z ( l ) = ∂ a ( l ) ∂ z ( l ) ∂ z ( l + 1 ) ∂ a ( l ) ∂ L ( y , y ^ ) ∂ z ( l + 1 ) = ∂ a ( l ) ∂ z ( l ) ∂ z ( l + 1 ) ∂ a ( l ) δ ( l + 1 ) \begin{aligned} \delta^{(l)} &\triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \\ &= \frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l+1)}} \\ &=\frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\delta^{(l+1)} \end{aligned} δ(l)z(l)L(y,y^)=z(l)a(l)a(l)z(l+1)z(l+1)L(y,y^)=z(l)a(l)a(l)z(l+1)δ(l+1)
  因为 z ( l + 1 ) = W ( l + 1 ) a ( l ) + b ( l + 1 ) \boldsymbol{ z}^{(l+1)}=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)} z(l+1)=W(l+1)a(l)+b(l+1),和矩阵的微分法则: ∂ A x ∂ x = A ⊤ , ∂ ( y + z ) ∂ x = ∂ y ∂ x + ∂ z ∂ x \frac{\partial \boldsymbol{A} \boldsymbol{x}}{\partial \boldsymbol{x}}=\boldsymbol{A}^{\top},\frac{\partial(\boldsymbol{y}+\boldsymbol{z})}{\partial \boldsymbol{x}}=\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}}+\frac{\partial \boldsymbol{z}}{\partial \boldsymbol{x}} xAx=A,x(y+z)=xy+xz,得到:
∂ z ( l + 1 ) ∂ a ( l ) = [ W ( l + 1 ) ] ⊤ \frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}=\left [\boldsymbol{W}^{(l+1)}\right ]^{\top} a(l)z(l+1)=[W(l+1)]
  由于激活函数具有按位计算的性质: a k = f l ( z k ) , ∀ k = 1 , ⋯   , K a_{k}=f_l\left(z_{k}\right), \quad \forall k=1, \cdots, K ak=fl(zk),k=1,,K,也就是说 ∂ a m ∂ z n = 0 , m ≠ n ∂ a m ∂ z n = f l ′ ( z m ) , m = n \begin{aligned} &\frac{\partial a_m}{\partial z_n}=0,m\ne n\\ &\frac{\partial a_m}{\partial z_n}=f_l'(z_m),m= n \end{aligned} znam=0,m=nznam=fl(zm),m=n  所以: ∂ a ( l ) ∂ z ( l ) = d i a g ( f ′ ( z ( l ) ) ) \frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}=diag(f'(\boldsymbol z^{(l)})) z(l)a(l)=diag(f(z(l)))  结论是
δ ( l ) = d i a g ( f ′ ( z ( l ) ) ) [ W ( l + 1 ) ] ⊤ δ ( l + 1 ) \delta^{(l)}=diag(f'(\boldsymbol z^{(l)}))\left [\boldsymbol{W}^{(l+1)}\right ]^{\top}\delta^{(l+1)} δ(l)=diag(f(z(l)))[W(l+1)]δ(l+1)

第三部分:结合前两个部分总结:

∂ L ( y , y ^ ) ∂ w i j ( l ) = ∂ z ( l ) w i j ( l ) ∂ L ( y , y ^ ) ∂ z ( l ) = [ 0... , a j ( l − 1 ) , 0... ] [ δ 1 ( l ) , . . . δ i ( l ) , . . . ] ⊤ = δ i ( l ) a j ( l − 1 ) \begin{aligned} \frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {w_{ij}}^{(l)}} &=\frac{\partial z^{(l)}}{{w_{ij}}^{(l)}}\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial { z}^{(l)}}\\ &=\left[ 0...,a_{j}^{(l-1)},0... \right ]\left[ \delta_1^{(l)},...\delta_i^{(l)},...\right]^{\top}\\ &=\delta_i^{(l)}a_{j}^{(l-1)} \end{aligned} wij(l)L(y,y^)=wij(l)z(l)z(l)L(y,y^)=[0...,aj(l1),0...][δ1(l),...δi(l),...]=δi(l)aj(l1)  注解: ∂ z ( l ) w i j ( l ) \frac{\partial\boldsymbol z^{(l)}}{{w_{ij}}^{(l)}} wij(l)z(l)只有第 z i ( l ) z_i^{(l)} zi(l)的项目的偏导不为0
  更新过程:利用第二部分反向传播计算 δ ( l ) \delta^{(l)} δ(l),再结合第一部分,利用第三部分的公式,更新权重矩阵

反向传播算法推导之偏置矩阵:

∂ L ( y , y ^ ) ∂ b ( l ) = ∂ z ( l ) b ( l ) ∂ L ( y , y ^ ) ∂ z ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {\boldsymbol b}^{(l)}} =\frac{\partial \boldsymbol z^{(l)}}{{\boldsymbol b}^{(l)}}\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial \boldsymbol { z}^{(l)}} b(l)L(y,y^)=b(l)z(l)z(l)L(y,y^)由于前面已经推导过: δ ( l ) ≜ ∂ L ( y , y ^ ) ∂ z ( l ) = ∂ a ( l ) ∂ z ( l ) ∂ z ( l + 1 ) ∂ a ( l ) ∂ L ( y , y ^ ) ∂ z ( l + 1 ) = ∂ a ( l ) ∂ z ( l ) ∂ z ( l + 1 ) ∂ a ( l ) δ ( l + 1 ) \begin{aligned} \delta^{(l)} &\triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \\ &= \frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l+1)}} \\ &=\frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\delta^{(l+1)} \end{aligned} δ(l)z(l)L(y,y^)=z(l)a(l)a(l)z(l+1)z(l+1)L(y,y^)=z(l)a(l)a(l)z(l+1)δ(l+1)只需要考虑 ∂ z ( l ) b ( l ) \frac{\partial \boldsymbol z^{(l)}}{{\boldsymbol b}^{(l)}} b(l)z(l),由于 z ( l + 1 ) = W ( l + 1 ) a ( l ) + b ( l + 1 ) \boldsymbol{ z}^{(l+1)}=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)} z(l+1)=W(l+1)a(l)+b(l+1),可知
∂ L ( y , y ^ ) ∂ b ( l ) = ∂ z ( l ) b ( l ) δ ( l ) = δ ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {\boldsymbol b}^{(l)}}= \frac{\partial \boldsymbol z^{(l)}}{{\boldsymbol b}^{(l)}}\delta^{(l)} =\delta^{(l)} b(l)L(y,y^)=b(l)z(l)δ(l)=δ(l)更新过程:利用反向传播计算 δ ( l ) \delta^{(l)} δ(l),直接更新偏置矩阵
本文的算法公式主要参考邱锡鹏老师的《神经网络与深度学习》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值