Machine Learning,  Programming

反向传播算法

反向传播算法(Backpropagation)

概览

是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。

反向传播要求有对每个输入值想得到的已知输出,来计算损失函数梯度。因此,它通常被认为是一种监督式学习方法,虽然它也用在一些无监督网络(如自动编码器)中。它是多层前馈网络Delta规则的推广,可以用链式法则对每层迭代计算梯度。反向传播要求人工神经元(或“节点”)的激励函数可微

反向传播算法为什么要“反向”?

在机器学习中,很多算法最后都会转化为优化目标函数——求损失函数(lossfunctionloss functionlossfunction)的最小值。这个损失函数往往很复杂,难以求出最值的解析表达式,而梯度下降法可以解决这类问题。

avatar

现在假设输入向量经过正向传播后,现在要求出参数w1和w2的导数,按照上述方法计算时,对w1微扰后,需要重新计算红框内的节点,对w2微扰后,需要重新计算绿框内的节点。这两次计算中也有大量的“重复单元”即图中的蓝框,实际上神经网络的每一个参数的计算都包含着这样大量的重复单眼,那么神经网络规模一旦变大,这种算法的计算量一定爆炸,没有适用价值。所以选择了从后向前“反向”地计算各层参数的梯度。

为什么这个计算方向能够高效?因为在计算梯度时前面的单元是依赖后面的单元的计算,而“从后向前”的计算顺序正好“解耦”了这种依赖关系,先算后面的单元,并且记住后面单元的梯度值,计算前面单元之就能充分利用已经计算出来的结果,避免了重复计算,这也就是为什么反向传播算法要“反向”。

如何理解?

简单的理解,它的确就是复合函数的链式法则,但其在实际运算中的意义比链式法则(chainrulechain rulechainrule)要大的多。

avatar

 

如果已经对神经网络很熟悉,那么就是不停计算cost function的梯度,重复直到cost function收敛,那么如何计算梯度呢?

显然,需要求出cost function对每一个权值的偏导数,而BP算法就是求解这种多层复合函数的偏导数的利器。

我们以求e = (a+b)*(b+1)为例,它的复合关系如图

avator

avatar

可以注意到,这样做是十分冗杂的,因为很多路径都被重复访问了,比如a-c-e和b-c-e就都走了c-e,对于复杂的神经网络,这样的冗杂所导致的计算量相当大。

这时候,就需要BP算法来避开这种冗杂

从最上层的节点e开始,初始值为1,以层为单位进行处理。对于e的下一层的所有子节点,将1乘以e到某个节点路径上的偏导值,并将结果“堆放”在该子节点中。等e所在的层按照这样传播完毕后,第二层的每一个节点都“堆放”些值,然后我们针对每个节点,把它里面所有“堆放”的值求和,就得到了顶点e对该节点的偏导。然后将这些第二层的节点各自作为起始顶点,初始值设为顶点e对它们的偏导值,以”层”为单位重复上述传播过程,即可求出顶点e对每一层节点的偏导数。

总结来说,就是通过高等数学的链式法则来理解

发表评论

电子邮件地址不会被公开。 必填项已用*标注