2.8 在哪种层面上,反向传播是快速的算法?
在哪种层面上,反向传播是快速的算法?为了回答这个问题,首先考虑另一个计算梯度的方法。就当我们回到上世界 50、60 年代的神经网络研究。假设你是世界上首个考虑使用梯度下降方法学习的那位!为了让自己的想法可行,就必须找出计算代价函数梯度的方法。想想自己学到的微积分,决定试试看链式法则来计算梯度。但玩了一会后,就发现代数式看起来非常复杂,然后就退缩了。所以就试着找另外的方式。你决定仅仅把代价看做权重的函数 (我们马上会回到偏置)。你给这些权重 进行编号,期望计算某些权重 的偏导数 。而一种近似的方法就是下面这种:
其中 是一个很小的正数,而 是在第 个方向上的单位向量。换句话说,我们可以通过计算两个接近相同的 值的代价 来估计 ,然后应用公式 (46)。同样方法也可以用来计算 。
这个方法看起来非常有希望。概念上易懂,容易实现,使用几行代码就可以搞定。看起来,这样的方法要比使用链式法则来计算梯度还要有效。
然后,遗憾的是,当你实现了之后,运行起来这样的方法非常缓慢。为了理解原因,想象我们的网络中有 权重。对每个不同的权重 我们需要计算 来计算 。这意味着为了计算梯度,我们需要计算代价函数 次,需要 前向传播(对每个样本)。我们同样需要计算 ,总共是一次网络传播需要 次。
反向传播聪明的地方就是它确保我们可以同时计算所有的偏导数 ,仅仅使用一次前向传播,加上一次后向传播。粗略地说,后向传播的计算代价和前向的一样5。所以反向传播总的计算代价大概是两倍的前向传播。比起直接计算导数,显然反向传播有着更大的优势。所以即使反向传播看起来要比 (46) 更加复杂,但实际上要更快。
这个加速算法在 1986 年首次被众人接受,并直接导致神经网络可以处理的问题的扩展。这也导致了大量的研究者涌向了神经网络方向。当然,反向传播并不是万能钥匙。在 1980 年代后期,人们尝试挑战极限,尤其是尝试使用反向传播来训练深度神经网络。本书后面,我们将看到现代计算机和一些聪明的新想法已经让反向传播成功地训练这样的深度神经网络。
5. 这个说法是合理的,但需要额外的说明来澄清这一事实。在前向传播过程中主要的计算代价消耗在权重矩阵的乘法上,而反向传播则是计算权重矩阵 的转置矩阵。这些操作显然有着类似的计算代价。 ↩