欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 反向传播

反向传播

2025/10/14 20:30:55 来源:https://blog.csdn.net/qq_53983845/article/details/147979362  浏览:    关键词:反向传播

        如果你要用梯度下降算法来训练一个神经网络,应该怎么做?

        假设网络有一堆的参数:\theta =\begin{Bmatrix} w_{1},w_{2},...,b_{1},b_{2},... \end{Bmatrix}。首先选择一个初始的参数\theta ^{0},计算\theta ^{0}对损失函数的梯度,也就是计算神经网络里面的参数w_{1},w_{2},...,b_{2},b_{2},...对loss损失函数的导数,计算出后,更新参数\theta ^{1}=\theta ^{0}-\eta \bigtriangledown L(\theta ^{0});再计算\theta ^{1}对损失函数的梯度,再更新\theta ^{2},以此类推.......

        我们会定义一个loss损失函数,这个损失函数就是所有训练样本的预测值与真实值之间差值和,对损失函数进行梯度下降算法的公式如下:

         现在我们来看一下怎么对某一笔的样本计算梯度。

         对于上述的神经元,先考虑计算某一个神经元的梯度:

        通过前向过程计算可得z=x_{1}w_{1}+x_{2}w_{2}+b,对于\frac{\partial C}{\partial w}=\frac{\partial C}{\partial z}\frac{\partial z}{\partial w}。计算\frac{\partial z}{\partial w}是前向过程,计算\frac{\partial C}{\partial z}是反向过程。

        我们先来看下怎么计算\frac{\partial z}{\partial w}  。因为z=x_{1}w_{1}+x_{2}w_{2}+b\frac{\partial z}{\partial w_{1}}=x_{1}\frac{\partial z}{\partial w_{1}}=x_{2}。对于\frac{\partial z}{\partial w}就是看这个w前面接的是什么,那微分以后就是什么。w_{1}前面接的输入是x_{1},所以求导后就是x_{1}w_{2}前面接的输入是x_{2},所以求导后就是x_{2},就是这样的规律。

        假如给你如下图的神经网络,它里面有一大堆的参数,计算里面的\frac{\partial z}{\partial w},这件事非常容易。

        如果有人想问你: 这个\frac{\partial z}{\partial w}是多少,你看这个w=1前面接的输入是-1,你可以瞬间告诉他\frac{\partial z}{\partial w}=-1

        接下来,有人想问你:,对于这个w=-1,\frac{\partial z}{\partial w}是多少,你可以很快告诉他\frac{\partial z}{\partial w}=0.12

        知道了怎么计算\frac{\partial z}{\partial w},我们现在来看看怎么计算\frac{\partial C}{\partial z}。计算\frac{\partial C}{\partial z}你会觉得很困难,因为z通过激活函数后得到一个输出。

      假设激活函数时sigmoid函数,z通过sigmoid函数后得到a。我们知道\frac{\partial C}{\partial z}=\frac{\partial C}{\partial a}\frac{\partial a}{\partial z}a=\sigma (z)\frac{\partial a}{\partial z}就是sigmoid函数的偏微分。sigmoid函数如下图绿色线所示,它的微分如蓝色线所示:

因为a会影响后面的{z}'{z}'会影响C;a会影响后面{z}''{z}''会影响C。所以\frac{\partial C}{\partial a}=\frac{\partial {z}'}{\partial a}\frac{\partial C}{\partial {z}'}+\frac{\partial {z}''}{\partial a}\frac{\partial C}{\partial {z}"}。因为{z}'=aw_{3}+aw_{4}+...,所以我们能很快知道\frac{\partial {z}'}{\partial a}=w_{3}\frac{\partial {z}''}{\partial a}=w_{4},但是我们又很难计算\frac{\partial C}{\partial {z}'}\frac{\partial C}{\partial {z}''},因为神经网络后面可能会又其他的运算,在此,我们先假设知道\frac{\partial C}{\partial {z}'}\frac{\partial C}{\partial {z}''}这两项的值。 现在我们就可以计算\frac{\partial C}{\partial z}= {\sigma}'(z)\begin{bmatrix} w_{3}\frac{\partial C}{\partial {z}'}+w_{4}\frac{\partial C}{\partial {z}''} \end{bmatrix}的值。

        我们可以从另一个观点看待这个式子,如下图,其中{\sigma }'(z)是一个常数,因为z在计算前向过程的时候就被决定好了。

        回到上一个问题,我们要怎么算\frac{\partial C}{\partial {z}'}\frac{\partial C}{\partial {z}''}呐?

                第一个例子是我们假设橘色的这两个神经元是输出层,所以可以计算出\frac{\partial C}{\partial {z}'}=\frac{\partial C}{\partial y_{1}}\frac{\partial y_{1}}{\partial {z}'} ,\frac{\partial C}{\partial {z}''}=\frac{\partial C}{\partial y_{2}}\frac{\partial y_{2}}{\partial {z}''}

        假设橘色的神经元并不是整个神经网络的输出,它后面还有其他的层,那应该怎么算呢?

        如果我们知道\frac{\partial C}{\partial z_{a}}\frac{\partial C}{\partial z_{b}},我们就能计算出\frac{\partial C}{\partial {z}'},但我们现在无法计算出\frac{\partial C}{\partial z_{a}}\frac{\partial C}{\partial z_{b}},因为我们不知道后续的层是什么样的。我们可以再往下一层去看,如果绿色的神经元是输出层的话,计算\frac{\partial C}{\partial z_{a}}\frac{\partial C}{\partial z_{b}}就不成问题。

        实际上,我们是从输出层的\frac{\partial C}{\partial z}开始计算的:

        假设我们现在有6个神经元,现在我们要计算\frac{\partial C}{\partial z},如果先计算\frac{\partial C}{\partial z_{1}}\frac{\partial C}{\partial z_{2}},那就没有效率;如果先算\frac{\partial C}{\partial z_{5}}\frac{\partial C}{\partial z_{6}},就很有效率。

        算出\frac{\partial C}{\partial z_{5}}\frac{\partial C}{\partial z_{6}}后,就可以算出\frac{\partial C}{\partial z_{3}}\frac{\partial C}{\partial z_{4}},然后算出\frac{\partial C}{\partial z_{1}}\frac{\partial C}{\partial z_{2}}

        实际上,这个过程如下图所示:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词