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

本文详细介绍了前馈神经网络的反向传播算法,重点在于理解反向传播如何通过梯度下降逐步更新权重矩阵和偏置向量。首先,明确了全连接网络结构和激活函数的作用;接着,阐述了梯度下降法在模型优化中的应用;然后,通过链式法则推导了权重矩阵和偏置向量的梯度,得出反向传播的核心公式;最后,通过实例解释了如何利用反向传播计算误差项,并以此更新参数。整个过程展示了反向传播如何利用后一层的误差来优化前一层的误差,从而优化整个神经网络的性能。
部署运行你感兴趣的模型镜像

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

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

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

他的基本结构是:前一层的神经元输出,经过激活函数后,成为后一层神经网络的输入。
用公式来表达上述关系就是:
z(l+1)=W(l+1)a(l)+b(l+1)a(l)=fl(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)是第lll层全连接层的直接输出,经过激活函数fl(⋅)f_l(\boldsymbol ·)fl()得到本层的输出a(l)\boldsymbol{ a}^{(l)}a(l),它也是下一层的输入。

模型优化简述:

  在前馈神经网络的模型上,多层的神经网络已经能够完成由给定输入得到输出,为了让神经网络更好的表示输入和输出的关系,我们需要逐步更改权重矩阵WWW,使得给定输入、尽可能的得到期望的正确输出。
  这种更改模型的参数W\boldsymbol WW使得模型结果变优的过程,可以说是训练过程,它的常用的方法是梯度下降法:它的核心是在量化预测结果和输出结果的误差的基础上,以梯度下降的方法使得预测误差下降以达到可接受的范围内。
  梯度下降法在网络训练中存在的问题
W(l)←W(l)−α∂R(W,b)∂W(l)=W(l)−α(1N∑n=1N(∂L(y(n),y^(n))∂W(l))+λW(l))b(l)←b(l)−α∂R(W,b)∂b(l)=b(l)−α(1N∑n=1N∂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 WW 参数2:偏置向量b\boldsymbol bb
明确直接目的:
  根据梯度下降法的内涵,参数的更新过程应为:
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))∂wij(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)]ij=∂L(y(n),y^(n))∂wij(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^)∂wij(l)=∂z(l)wij(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)wij(l)=[0...,aj(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),写成每一项的形式的话有:zi(l)=∑kwik(l)ak(l−1)+bj(l)z^{(l)}_{i}=\sum_{k}w_{ik}^{(l)}a_k^{(l-1)}+b_j^{(l)}zi(l)=kwik(l)ak(l1)+bj(l)(矩阵乘法展开)
  所以唯一能出现wij(l)w_{ij}^{(l)}wij(l)项只有k=jk=jk=j的情况,根据求导法则,其余项与wij(l)w_{ij}^{(l)}wij(l)无关,偏导为0,则有:
∂z(l)wij(l)=[∂z1(l)wij(l),...∂zM(l)wij(l)]=[0...,∂zj(l)wij(l),0...]=[0...,aj(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),表示第lll层的误差项,推导反向传播公式,即用δ(l+1)\delta^{(l+1)}δ(l+1)来计算δ(l)\delta^{(l)}δ(l)

  根据模型:
z(l+1)=W(l+1)a(l)+b(l+1)a(l)=fl(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),和矩阵的微分法则:∂Ax∂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)]
  由于激活函数具有按位计算的性质:ak=fl(zk),∀k=1,⋯ ,Ka_{k}=f_l\left(z_{k}\right), \quad \forall k=1, \cdots, Kak=fl(zk),k=1,,K,也就是说∂am∂zn=0,m≠n∂am∂zn=fl′(zm),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)=diag(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)=diag(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^)∂wij(l)=∂z(l)wij(l)∂L(y,y^)∂z(l)=[0...,aj(l−1),0...][δ1(l),...δi(l),...]⊤=δi(l)aj(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)wij(l)\frac{\partial\boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}wij(l)z(l)只有第zi(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),直接更新偏置矩阵
本文的算法公式主要参考邱锡鹏老师的《神经网络与深度学习》

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值