反向传播:整体描述

正如我之前所阐述的,反向传播涉及了两个谜题。第一个谜题是,这个算法究竟在做什么?我们之前的描述是将错误量从输出层反向传播。但是,我们是否能够更加深入,对这些矩阵、向量的乘法背后作出更加符合直觉的解释?第二个谜题是,人们一开始是如何发现反向传播算法的?按照算法流程一步步走下来,或者证明算法的正确性,这是一回事。但这并不代表你能够理解问题的本质从而能够从头发现这个算法。是否有一条合理的思维路线使你能够发现反向传播算法?在本节中,我会对这两个谜题作出解释。

为了更好地构建的反向传播算法在做什么的直觉,让我们假设我们对网络中的某个权重做出了一个小的改变量

tikz22

这个改变量会导致与其相关的神经元的输出激活值的改变:

tikz23

以此类推,会引起下一层的所有激活值的改变:

tikz24

这些改变会继续引起再下一层的改变、下下层...依次类推,直到最后一层,然后引起代价函数的改变:

tikz25

代价函数的改变量与最初权重的改变量是有关的,关系是下面这个等式

这表明了计算的一种可能方法是,计算上的一个小改变量经过正向传播,对引起了多大的改变量。如果我们能够通过小心翼翼的计算做到这点,那我们就可以计算出

让我们尝试来写一下计算过程。改变量层的第个神经元的激活值带来了的改变量。它的大小是

激活值改变量会引起下一层(第层)的所有激活值都改变。我们先关注其中的一个结点,

tikz26

它产生的改变量是:

将等式(48)带入其中,得到:

当然,改变量会继续造成下一层的激活值的改变。实际上,我们可以想象一条从的路径,其中每一个结点的激活值的改变都会引起下一层的激活值的改变,最终引起输出层的代价的改变。如果这条路径是,那么最终的改变量是

这样,我们使用了一系列的形式的项,对应了路径上的每一个结点,包括最终项。这就计算出了在神经网络的这条路径上,最初的改变量引起了多大的改变。当然,由的改变量影响代价改变的路径选择是很多的,我们现在只考虑了其中的一条路径。为了计算最终总共的改变量,很显然我们应该对所有可能的路径对其带来的改变量进行求和:

其中,我们对每条路径中所有出现的神经元都进行求和。与等式(47)进行比较,我们得到:

等式(53)看上去很复杂。不过,它在直觉上很容易理解。我们计算出了相对于网络中的一个权重的变化速率。这个等式告诉我们的是,每一条连接两个神经元的边都可以对应一个变化速率,这个变化速率的大小是后一个神经元对前一个神经元的偏导。连接第一个权重和第一个神经元的边对应的变化速率是。一条路径对应的变化速率恰好是路径上的变化速率的连乘。总变化速率是从起始权重到最终代价上的所有可能的路径的变化速率的总和。用图片来说明这个过程,对于一条路径来说:

tikz27

目前为止我所阐述的是一种启发式的观点,当你困惑于神经网络中的权重时,可以通过这种观点来思考。下面我会给你一些简要的思路使你可以更进一步的完善这个观点。首先,你可以显式地计算出等式53中的每一项的偏导表达式。这很容易做到,只需要一点计算量就行。做完之后,你可以尝试将所有的求和通过矩阵的形式来表示。这个过程会有一点无聊,并且需要一些毅力,但是不会特别的困难。随后,你可以尝试尽可能的将表达式简化,最终你会发现你得到了反向传播算法!所以,你可以将反向传播算法看作是一种对所有路径上的所有变化率进行求和的方法。或者用另外一种方式来说,反向传播算法是一种很聪明的方法,当小扰动沿着网络传播、到达输出并影响代价的过程中,它能够记录其对相应权重(和偏置)的影响量。

我的解释到此为止了。这可能有点复杂,并且需要仔细思考所有的细节。如果你乐于接受挑战,你可能会很享受这个过程。如果不是,我希望我的这些想法能够给你一些关于反向传播在做什么的启发。

那关于其它的谜题呢——反向传播最初是如何被发现的?实际上,如果你一路看下来我的阐述,你能够找到关于反向传播算法的一种证明。不幸的是,完整的证明实际上比我在本章的描述更长更复杂。那这个相对更简单(但更玄虚)的证明是如何发现的呢?当你把试图把完整的证明中的所有细节写出来时,你会发现有一些很显然能够被简化的形式。你做完这些简化,会得到一个简短一些的证明。然后你又会发现一些可以简化的内容。当你重复几次这个过程之后,你会得到本章中的这个简短的证明,但是它有点晦涩,因为其中所有复杂的结构都被简化掉了!我希望你能够相信我,完整的证明与本章中简短的证明没有什么本质区别。我只是对证明过程做了很多简化的工作。

results matching ""

    No results matching ""