热身:一个基于矩阵的快速计算神经网络输出的方法

在讨论反向传播算法之前,我们先介绍一个基于矩阵的快速计算神经网络输出的方法来热热身。实际上在上一章的末尾我们经见过这个方法了,但是那时我说得很快,因此有必要详细回顾一下。另外在熟悉的上下文背景中,也能让你对反向传播会用到的符号记法感到习惯一些。

我们先介绍一种符号来表示网络中的权重参数,这种表示法不会引发歧义。我们用来表示从第层的第个神经元到第层的第个神经元的连接的权重。例如,下图展示了从第二层的第四个神经元到第三层的第二个神经元的连接的权重:

tikz16

一开始你会觉得这种表示很麻烦,而且的确需要一些功夫来掌握它。但是经过一些努力,你就会发现这种表示简单而自然。这种表示的一个奇怪之处就是下标的顺序。你可能会认为用表示输入神经元,用表示输出神经元更加合理。然而并不是这样的。在下面我会解释其中的原因。

我们用一种相似的记法来表示网络的偏置和激活值。确切地,我们用表示第层第个神经元的偏置,用表示第层的第个神经元的激活值。下图展示了这种记法的一个例子:

tikz17

利用这些记法,第层第个神经元的激活值通过下面的式子与第层神经元的激活值联系起来(比较上一章节中的等式(4)和它附近的讨论内容):

这里的求和针对的是第层的所有神经元。为了将这个式子写成矩阵形式,我们为每一层定义一个权重矩阵。矩阵的每一项就是连接到第层神经元的权重,这就是说,中第行第列的元素就是。相似地,我们为每一层定义一个偏置向量。你大概可以猜到这是如何工作的——偏置向量的每一项就是的值,每一项对应第层中的一个神经元。最后,我们定义一个激活向量,其中的每一项就是激活值

最后一个我们需要改写成矩阵形式的想法就是把这样的函数向量化。我们在上一章中简单提到了向量化,这里面的思想就是我们想把一个函数比如,应用到一个向量中的每一项。我们用一个直观的记号来表示这种作用在每一个元素上的函数操作。就是说,的每一项就是。比如,如果我们有一个函数的向量化形式具有如下作用:

就是说,向量化的函数是对向量中的每一个元素求平方。

如果你记住了这些记法,那么等式(23)可以改写成下面简洁优美的矩阵形式:

这个式子给我们对一层的激活值是如何与上一层中激活值产生关联的进行全局思考:我们仅仅将权重矩阵作用于上一层的激活值,然后加上偏置向量,最后用函数作用于这个结果,(就得到了本层的激活函数值)。相比于之前我们采用的神经元到神经元的视角,这种全局的视角通常更加简明和容易理解(涉及到更少的下标!)。你可以把它当做一种脱离下标魔咒,同时还能对正在进行的事情保持精确的阐释。这种表达式在实际操作中也非常有用,因为大多数矩阵库提供了更快的方式来实现矩阵乘法,向量加法以及函数向量化操作。实际上,上一章节中的代码隐式地使用了这种表达式来计算网络的行为。

当使用等式(25)来计算的时候,我们顺便也计算出了中间结果的值。这个数值非常有用,以至于值得我们专门给它一个名字:我们称为对第层神经元的加权输入(weighted input)。在本章的后续部分中我们将大量地使用到加权输入。等式(25)有时候会被写成与加权输入有关的形式,即。值得注意的是组成,这就是说,就是第层第个神经元激活函数的加权输入。

results matching ""

    No results matching ""