zoukankan      html  css  js  c++  java
  • 【论文翻译】深入理解反向传播

    前言


      本篇是论文《Learning representations by back-propagating errors》的译文,论文原地址位于:http://www.iro.umontreal.ca/~pift6266/A06/refs/backprop_old.pdf ,虽然只有短短四页,但十分值得读。

    正文


      本篇文章的核心公式是本科时期高数书上的链式法则,如图:

      

      

      接下来我们用这个法则解释反向传播原理。

      下面,我们使用最简单的神经网络来说明。这个网络只有3层,分别是蓝色的输入层、绿色的隐藏层和红色的输出层。上一层中的每个单元都连接到下一层中的每个单元,而且每个连接都具有一个权重,当某个单元向另一个单元传递信息时,会乘以该连接的权重得到更新信息。某个单元会把连接到它的上一层所有单元的输入值相加,并对这个总和执行Logistic函数并向下一层网络传递该值。

        

      假设输入的样本数为m,第i个输入输出对为:(xi,yi

      其中,x和y是3维向量。对于输入x,我们把g称作神经网络的预测(输出)值,它也是一个3维向量,每个向量元素对应一个输出单元。所以,对于每个训练样本来说,有:

        

      给定输入x,我们要找到使得预测值g与输出值y相等或比较相近的一组网络权重。因此,我们加入了误差函数,定义如下:

        

      

      为了计算总误差,我们使用了训练集中的所有样本,并对红色输出层中的每个单元计算该单元预测值与真实输出间的平方误差。对每个样本分别计算并求和,得到总误差。

      由于g为网络的预测值,取决于网络的权重,可以看到总误差会随权重变化而变化,网络的训练目标就是找到一组误差最小的权重

      这一点可以利用梯度下降法做到,但是梯度下降法要求算出总误差E对每个权重的导数,这也是结合反向传播要实现的目标。

      现在,我们推广到一般情况,而不是之前的3个输出单元。假设输出层有任意数量的输出单元,设为n,对于这种情况此时的总误差为:

        

      这里为了简洁,删去了上标i,因为它是不变的。

      你可能会有疑问,这个误差值是怎么随着某个输出单元的预测值变化而变化的?我们通过求导得到总误差随着某个输出单元的预测值的变化关系。

        

      我们发现随着预测值的变化,总误差会根据预测值与真实值之间的差值,以同样的速率在变化。

      这里你可能还有疑问,当某个输出单元的总输入变化时,误差会如何变化。还是利用导数,用z来代表某个输出单元的总输入,求出下面公式的值:

        

      但是发现g是关于z的函数,所以利用链式法则,把该式重写为:

        

      要记住,在每个单元中,先使用Logistic函数处理输入后再把它向前传递。这意味着,g作为Logistic函数,z是它的输入,所以可以表示为:

        

      进而得到:

        

      到了这步,已经计算得到总误差与某个输出神经元总输入的变化规律。

      现在,我们已经得到了误差相对于某个权重的导数,这就是所求的梯度下降法。 

      设绿色单元(隐藏层)的预测值为g’,绿色层中的单元k与红色层(输出层)中的单元j之间的链接权重重新设置为 Wk,j

      考虑下图中,黄色输出单元对应的总输入z。为了计算这个总输入,先获得每个绿色单元的输出值,在把其与连接绿色单元和黄色单元的红色箭头权重相乘,并将它们全部相加。

        

      进一步推广,假设有n个绿色单元(重新定义的n,与上面的n不同),可以表示为:

        

      所以,我们不仅可以把z看作是自变量为连接权重的函数,也可以看作是自变量为连接单元输出值的函数。

      下面的步骤就是靠链式法则了。

      当隐藏层单元k与输出层单元j的链接权重变化时,误差如何变化?可表示为:

           

      上面已经计算出误差相对于输出单元连接权重的导数,这正是梯度下降所需的公式。

      但是推导还没有完成,我们仍需要计算误差相对于第一层和第二层连接权重的导数,这里还需要用到链式法则。

      接下来,计算误差与第k个绿色单元输出值的变化关系:

        

      由于k个单元有j个连接权重,我们将此也考虑在内:

        

      到这里,推导就结束了。我们得到了总误差相对于某个单元输出值的导数。现在,我们可以忽略红色输出层,把绿色层作为网络的最后一层,并重复上述所有步骤来计算总误差E相对于输入权重的导数。

      你会注意到,我们计算出的第一个导数与预测值和真实值之间的“误差”相等。同样地,最终的导数中也是这个误差项与其他项的乘积。

      这种算法叫做反向传播,因为我们把这种形式的误差进行反向传播,从最后一层反馈到第一层,并被用来计算误差E相对于网络中每个单元权重的导数。

      只要计算出了这些导数后,就可以在梯度下降的过程中使用它们来最小化误差E并训练网络。

      

    ————全心全意投入,拒绝画地为牢
  • 相关阅读:
    jQuery源码笔记——四
    jQuery源码笔记——三
    jQuery源码笔记——二
    深度理解作用域链和闭包
    事务的传播机制
    Jvm的运行时数据区
    SpringBoot 工程结构
    MyBatis的<if>标签判空
    Redis学习
    MyBatis调用Oracle的存储过程
  • 原文地址:https://www.cnblogs.com/Bw98blogs/p/9023060.html
Copyright © 2011-2022 走看看