引言
在神经网络中,为了更有效的计算梯度,需要用到反向传播算法。我们先从链式求导法则开始。
链式求导法
先介绍下链式求导法则,在后面的反向传播算法中会用到。
有
那么;
有
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tCHUNDUb-1577369599077)(_v_images/20191226202915321_20747.png)] 李宏毅机器学习——深度学习反向传播算法_神经网络_04](https://s2.51cto.com/images/blog/202207/13165222_62ce87c6c54a223298.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
改变了s会改变x和y,从而改变了z。
注意,如果改变s会改变多个变量,它们的关系也是成立的。
损失函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dnxvSeRt-1577369599078)(_v_images/20191226203608959_23215.png)] 李宏毅机器学习——深度学习反向传播算法_反向传播算法_06](https://s2.51cto.com/images/blog/202207/13165223_62ce87c72b81483608.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
假设给定一组参数,把一个训练数据
代入NN(神经网络)中,会得到输出
。
是输出
和实际
距离函数,值越大代表越距离远,也就是效果越不好。
那在神经网络训练算法中,损失函数定义为:
如果把损失函数对参数做微分的话,得到
只要计算出某一笔数据对的微分,就可以得到
对
的微分。

假设我们先考虑这个神经元。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eth5wURE-1577369599079)(_v_images/20191226204431854_16296.png)] 李宏毅机器学习——深度学习反向传播算法_神经网络_20](https://s2.51cto.com/images/blog/202207/13165224_62ce87c80235f5073.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
假设只有两个输入,计算
得到
后再代入激活函数,经过多次运算会得到最终的输出
。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKqVbw2D-1577369599079)(_v_images/20191226204622410_15098.png)] 李宏毅机器学习——深度学习反向传播算法_深度学习_25](https://s2.51cto.com/images/blog/202207/13165224_62ce87c844c7439487.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
现在问题是如何计算损失(距离函数)对
的偏微分
利用链式求导法
计算的过程叫做正向过程(Forward pass);计算
的过程叫做反向过程(Backward pass)。
正向过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2a9Z4Ic-1577369599079)(_v_images/20191226205915655_32463.png)] 李宏毅机器学习——深度学习反向传播算法_反向传播算法_34](https://s2.51cto.com/images/blog/202207/13165224_62ce87c886fea13067.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
如上图所示,假设输入是,上面蓝色神经元的参数:
,激活函数是
Sigmoid函数;
下面蓝色神经元的参数:
对下面的神经元来说,计算的偏微分,可以很快得出
,也就是输入
,随着从前往后计算每个神经元的输出,整个过程就可以很快结束,因此叫正向过程。
反向过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PYFLvzls-1577369599079)(_v_images/20191226210813603_16863.png)] 李宏毅机器学习——深度学习反向传播算法_深度学习_41](https://s2.51cto.com/images/blog/202207/13165225_62ce87c905ccf45097.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
困难的是如何计算
假设激活函数是Sigmoid函数,然后得到的函数值
会乘上某个权重(比如
)再加上其他值得到
(注意这里只是一个符号,不是
的导数);
也会乘上权重(比如
)再加上其他东西得到
(注意这里只是一个符号,不是
的二阶导数);
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IwHcHWyr-1577369599080)(_v_images/20191226211217380_32053.png)] 李宏毅机器学习——深度学习反向传播算法_反向传播算法_53](https://s2.51cto.com/images/blog/202207/13165225_62ce87c94df0135231.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
可以这样理解,通过影响
来影响
。
而
那就剩下
改变了会改变
和
,从而改变了
我们先计算简单的
有
同理
现在难点就是和
我们这里先假装我们知道这两项的值。然后整理下原来的式子:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I7cjk4Ly-1577369599080)(_v_images/20191226214024450_27012.png)] 李宏毅机器学习——深度学习反向传播算法_反向传播算法_70](https://s2.51cto.com/images/blog/202207/13165225_62ce87c9b84586567.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
假设有另外一个特殊的神经元,它是上图的样子,输入就是和
,它们分别乘以
和
,然后求和得到的结果再乘上
就得到了
在正向传播的过程中已经知道了,因此这里的
是一个常数。
说了这么多,还是没说怎么计算和
啊。别急,下面就开始计算。
这里要分两种情况考虑:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BiSbf5tC-1577369599080)(_v_images/20191226214926144_15098.png)] 李宏毅机器学习——深度学习反向传播算法_深度学习_81](https://s2.51cto.com/images/blog/202207/13165226_62ce87ca5a7d340697.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
情形一: 红色的两个神经元就是输出层,它们能直接得到输出。
根据链式法则有:
只要知道激活函数是啥就能计算出
也可以根据我们选取的损失函数简单的计算出来。
同理的计算也一样
情形二:红色的不是输出层
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RM7wSAxA-1577369599081)(_v_images/20191226220033042_12662.png)] 李宏毅机器学习——深度学习反向传播算法_激活函数_86](https://s2.51cto.com/images/blog/202207/13165226_62ce87caceb7d675.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
红色的是中间层,它们的激活函数的值会当成下一层的输入继续参数计算。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UefOrgCj-1577369599081)(_v_images/20191226220203239_4057.png)] 李宏毅机器学习——深度学习反向传播算法_神经网络_87](https://s2.51cto.com/images/blog/202207/13165227_62ce87cba8e1293229.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
如果我们知道和
同理(回顾一下上面那个特殊的神经元)我们就可以计算
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2J9i11V-1577369599081)(_v_images/20191226220512917_26589.png)] 李宏毅机器学习——深度学习反向传播算法_深度学习_91](https://s2.51cto.com/images/blog/202207/13165228_62ce87cc1ad3187123.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
问题就会这样反复循环下去,我们不停的看下一层,直到遇到了输出层。然后就可以由输出层往前计算出整个NN的所有的参数。
那我们为何不换个角度考虑问题,我们直接先算输出层的偏微分,然后依次往前计算。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ORibfTTy-1577369599081)(_v_images/20191226221214641_7228.png)] 李宏毅机器学习——深度学习反向传播算法_激活函数_92](https://s2.51cto.com/images/blog/202207/13165228_62ce87cc81b4d24769.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
这就是反向传播算法的思想。
















