是什么让反向传播算法如些之快?


是什么让反向传播算法如些之快?为回答这个问题,让我们考虑另一种计算梯度的方式。想象在神经网络发现前的早些时候。大概在1950至1960年,你是世界上第一个想用梯度下降算法来学习的人!但为了实现这个想法,你必须找到一种计算成本函数梯度的途径。你回想你的微积分知识,并决定看下是否可以用链式法则来计算梯度。但玩了一会儿之后,代数式看上去很复杂,你有点灰心丧气。所以你尝试寻找别的方式。你决定将成本函数看成是只关于权重的函数(我们将在后面把偏移量加回来)。你数着权重,想去计算某个特定权重的偏导数。一种明显的方式是使用近似法

这里是一个小正数,是第个方向上的单位向量。换句话说,可以通过计算成本下的两个些许不同的值,然后运用等式(46)来估计。使用相同的方案可以计算偏移量的偏导数

这个方法看起来非常有希望。概念很简单,并且极容易实现,用几行代码就能搞定。当然,它比使用链式法则来计算梯度的方案看上去要靠谱许多!

不幸的是,虽然这个方案看上去挺靠谱,但当你实现代码后却运行极慢。为弄清为什么,想像在网络里有一百万个权重。然后每个不同的权重,都需要计算才能求出。这就意味着为了计算梯度,需要一百万次不同的成本函数,需要前馈整个网络一百万次(每个训练样本)。同样还需要计算,所以整整需要一百万加一次遍历整个网络。

反向传播的聪明之处在于它能同时计算所有的偏导数,却只需要正向遍历网络一次,然后再反向遍历网络一次。粗略的讲,反向遍历和正向遍历的计算量基本相同【这似乎是合理的,但需要一些分析才能下结论。它有合理性是因为在正向遍历中的主要计算是权重矩阵的乘法,同时反向遍历是权重矩阵转置的乘法。这些操作明显计算量差不多】。因此反向传播的总计算量差不多和正向遍历两次网络相同。和基于(46)的需要一百万加一次正向遍历比较一下!所以尽管反向传播算法表面上看起来比基于(46)的方法要更加复杂,但实际上要快很多很多。

这种速度上的提升在1986看被全面重视起来,并大大扩展了神经网络可以解决问题的范围。以至于有引起大量的人开始使用神经网络。当然,反向传播也不是灵丹妙药。在1980年代末,人们遇到了瓶颈,尤其是当使用反向传播来训练深度神经网络的时候,也就是,有很多隐含层的网络。在本书的后面将看到现代算法和目前一些聪明的新点子是如何让反向传播能能够训练如此深的神经网络的。

results matching ""

    No results matching ""