当前位置:   article > 正文

一步一步学习 神经网络里面的反向传播算法

一步一步学习 神经网络里面的反向传播算法
转载于知乎,,,,

作者:知乎用户
链接:https://www.zhihu.com/question/24827633/answer/91489990
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一般都是用链式法则解释
比如如下的神经网络
<img src="https://pic1.zhimg.com/50/9db015cf20d7f569eae57761c0dade47_hd.jpg" data-rawwidth="436" data-rawheight="371" class="origin_image zh-lightbox-thumb" width="436" data-original="https://pic1.zhimg.com/9db015cf20d7f569eae57761c0dade47_r.jpg">
  • 前向传播
对于节点 h_1来说, h_1的净输入 net_{h_1}如下:
net_{h_1}=w_1\times i_1+w_2\times i_2+b_1\times 1
接着对 net_{h_1}做一个sigmoid函数得到节点 h_1的输出:
out_{h_1}=\frac{1}{1+e^{-net_{h_1}}}
类似的,我们能得到节点 h_2o_1o_2的输出 out_{h_2}out_{o_1}out_{o_2}

  • 误差
得到结果后,整个神经网络的输出误差可以表示为:
E_{total}=\sum\frac{1}{2}(target-output)^2
其中 output就是刚刚通过前向传播算出来的 out_{o_1}out_{o_2}target是节点 o_1o_2的目标值。 E_{total}用来衡量二者的误差。
这个 E_{total}也可以认为是cost function,不过这里省略了防止overfit的regularization term( \sum{w_i^2}
展开得到
E_{total}=E{o_1}+E{o_2}=\frac{1}{2}(target_{o_1}-out_{o_1})^2+\frac{1}{2}(target_{o_2}-out_{o_2})^2

  • 后向传播
对输出层的 w_5
通过梯度下降调整 w_5,需要求 \frac{\partial {E_{total}}}{\partial {w_5}},由链式法则:
\frac{\partial {E_{total}}}{\partial {w_5}}=\frac{\partial {E_{total}}}{\partial {out_{o_1}}}\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}\frac{\partial {net_{o_1}}}{\partial {w_5}}
如下图所示:
<img src="https://pic1.zhimg.com/50/f2d8768af0d9264687905a0134dae927_hd.jpg" data-rawwidth="525" data-rawheight="257" class="origin_image zh-lightbox-thumb" width="525" data-original="https://pic1.zhimg.com/f2d8768af0d9264687905a0134dae927_r.jpg"> \frac{\partial {E_{total}}}{\partial {out_{o_1}}}=\frac{\partial}{\partial {out_{o_1}}}(\frac{1}{2}(target_{o_1}-out_{o_1})^2+\frac{1}{2}(target_{o_2}-out_{o_2})^2)=-(target_{o_1}-out_{o_1})
\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}=\frac{\partial }{\partial {net_{o_1}}}\frac{1}{1+e^{-net_{o_1}}}=out_{o_1}(1-out_{o_1})
\frac{\partial {net_{o_1}}}{\partial {w_5}}=\frac{\partial}{\partial {w_5}}(w_5\times out_{h_1}+w_6\times out_{h_2}+b_2\times 1)=out_{h_1}
以上3个相乘得到梯度 \frac{\partial {E_{total}}}{\partial {w_5}},之后就可以用这个梯度训练了:
w_5^+=w_5-\eta \frac{\partial {E_{total}}}{\partial {w_5}}
很多教材比如Stanford的课程,会把中间结果 \frac{\partial {E_{total}}}{\partial {net_{o_1}}}=\frac{\partial {E_{total}}}{\partial {out_{o_1}}}\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}记做 \delta_{o_1},表示这个节点对最终的误差需要负多少责任。。所以有 \frac{\partial {E_{total}}}{\partial {w_5}}=\delta_{o_1}out_{h_1}



对隐藏层的w_1
通过梯度下降调整 w_1,需要求 \frac{\partial {E_{total}}}{\partial {w_1}},由链式法则:
\frac{\partial {E_{total}}}{\partial {w_1}}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}\frac{\partial {net_{h_1}}}{\partial {w_1}}
如下图所示:
<img src="https://pic2.zhimg.com/50/d50d1d812f0f036b8c5cb389e463b01a_hd.jpg" data-rawwidth="612" data-rawheight="494" class="origin_image zh-lightbox-thumb" width="612" data-original="https://pic2.zhimg.com/d50d1d812f0f036b8c5cb389e463b01a_r.jpg"> 参数 w_1影响了 net_{h_1},进而影响了 out_{h_1},之后又影响到 E_{o_1}E_{o_2}
求解每个部分:
\frac{\partial {E_{total}}}{\partial {out_{h_1}}}=\frac{\partial {E_{o_1}}}{\partial {out_{h_1}}}+\frac{\partial {E_{o_2}}}{\partial {out_{h_1}}}
其中 \frac{\partial {E_{o_1}}}{\partial {out_{h_1}}}=\frac{\partial {E_{o_1}}}{\partial {net_{o_1}}}\times \frac{\partial {net_{o_1}}}{\partial {out_{h_1}}}=\delta_{o_1}\times \frac{\partial {net_{o_1}}}{\partial {out_{h_1}}}=\delta_{o_1}\times \frac{\partial}{\partial {out_{h_1}}}(w_5\times out_{h_1}+w_6\times out_{h_2}+b_2\times 1)=\delta_{o_1}w_5,这里 \delta_{o_1}之前计算过。
\frac{\partial {E_{o_2}}}{\partial {out_{h_1}}}的计算也类似,所以得到
\frac{\partial {E_{total}}}{\partial {out_{h_1}}}=\delta_{o_1}w_5+\delta_{o_2}w_7
\frac{\partial {E_{total}}}{\partial {w_1}}的链式中其他两项如下:
\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}=out_{h_1}(1-out_{h_1})
\frac{\partial {net_{h_1}}}{\partial {w_1}}=\frac{\partial }{\partial {w_1}}(w_1\times i_1+w_2\times i_2+b_1\times 1)=i_1
相乘得到
\frac{\partial {E_{total}}}{\partial {w_1}}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}\frac{\partial {net_{h_1}}}{\partial {w_1}}=(\delta_{o_1}w_5+\delta_{o_2}w_7)\times out_{h_1}(1-out_{h_1}) \times i_1
得到梯度后,就可以对 w_1迭代了:
w_1^+=w_1-\eta \frac{\partial{E_{total}}}{\partial{w_1}}
在前一个式子里同样可以对 \delta_{h_1}进行定义, \delta_{h_1}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}=(\delta_{o_1}w_5+\delta_{o_2}w_7)\times out_{h_1}(1-out_{h_1}) =(\sum_o \delta_ow_{ho})\times out_{h_1}(1-out_{h_1}),所以整个梯度可以写成 \frac{\partial {E_{total}}}{\partial {w_1}}=\delta_{h_1}\times i_1

=======================
上述\delta就是教程Unsupervised Feature Learning and Deep Learning Tutorial 中第三步计算的由来。。

<img src="https://pic4.zhimg.com/50/2d29c11b1c9da7652c63f01d5e31284e_hd.jpg" data-rawwidth="822" data-rawheight="428" class="origin_image zh-lightbox-thumb" width="822" data-original="https://pic4.zhimg.com/2d29c11b1c9da7652c63f01d5e31284e_r.jpg">

所谓的后向传播,其实就是『将来在宣传传播上出了偏差,你们要负责的!』,每一个节点负责的量用\delta表示,那么,隐藏节点需要负责的量,就由输出节点负责的量一层层往前传导。

参考:
【1】 A Step by Step Backpropagation Example
【2】 Unsupervised Feature Learning and Deep Learning Tutorial
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/999039
推荐阅读
相关标签
  

闽ICP备14008679号