李宏毅机器学习笔记-7 反向传播算法(Backpropagation)

Backpropagation-反向传播算法


1 前言

1.1 为什么要用 Backpropagation

  • 在神经网络中的梯度下降算法和之前求线性回归方程中用的没有太大的区别,都是不断的计算微分,然后更新参数,最终找到一个最优解。

  • 但是在神经网络中,有着大量可能多达上百万个的参数,所以传统的求微分方法行不通,计算量太大无法快速有效的求出微分。

    1526280459578

1.2 链式求导法则(Chain Rule)

  • Backprogation 中设计的最重要的数学知识就是 chain rule,通过下面的图片回顾一下。这个都不会就要回去读高中了。

    1526280795387

    2 Backpropagation

    2.1 应该求什么

    从上一节内容我们知道,每一个神经网络都需要定义一个 Loss Function, 用来定义实际输出与预期输出之间的误差 C n ,则总的误差就是

    1526281509580

    我们的目的就是要使上式的值最小。用 Gradient descent 来做的话就是这个式子对权值 w 求偏导,即

    1526281766830

    由此我们知道只需要求每个 C n w 的偏导,然后全部加起来就可以了。

    2.2 Forward pass

    1526282352210

  • 对上面这个 Neural 来说,根据 Chain Rule,

    1526282731455 1526282740631

    很明显,计算 z / w 是很容易的,如在上图中,

    z / w 1 = x 1 , z / w 2 = x 2 ,

    即, z / w 就等于其所在边的输入。

2.3 Backward pass

  • 所以我们剩下的问题是计算 C / z ,(贴公式真是太麻烦了 :cry:),但是我们没办法直接算这个偏导,所以又要再做变换了。
    1526284100583

  • 由上图可知,

    1526284430397

    其中, a = σ ( z ) ,所以 a / z = σ ( z ) / z = σ ( z ) .

  • 于是我们剩下的任务就是求 C / a ,根据上图的公式我们知道剩下要求的就是 C / z C / z .

  • 接下来,我们假设 C / z C / z 是已知的(通过某些神奇的方法算出来了),于是将上述的东西凑起来,我们就可以算出

    1526286093580

  • 然后,我们继续假设下一层是输出层,如下图

    1526286309158

    我们发现,图中的公式是可以计算的(看不出来就多看几遍,再看不出来就假装已经看出来了),于是我们把所有要求的都求出来了,就可以计算微分值了。

  • 但是,如果下一层不是输出层呢?那就把问题继续往下一层传递,直到输出层,然后就可以从最后一层一直往前计算回来了。如下图,相当于把输出作为输入,建立一个反向的神经网络。

    1526286690305

    3. 总结

  • 所以,Backpropagation 算法的流程就是:

    1. Forward Pass: 算出每一层的输出 a ,也就是 z / w .
    2. Backward Pass: 反转神经网络,从输出层往回计算每一层的 C / z .
    3. 将前面算出来的两项相乘,得到 C / w .

    1526287432986

  • 对我来说,我觉得把这个算法过程当成是一次递归就会很好理解,Forward Pass 就是函数一层层的调用,达到返回条件(在BackPropagation中是遇到输出层)就开始返回,也就是 Backward Pass.

  • 最后,写一堆公式和符号真是麻烦啊!

猜你喜欢

转载自blog.csdn.net/memoryd/article/details/80312135
今日推荐