2.1 热身:神经网络中使用矩阵快速计算输出的方法

在讨论反向传播前,我们先熟悉一下基于矩阵的算法来计算网络的输出。事实上,我们在上一章的最后已经能够看到这个算法了,但是我在那里很快地略过了,所以现在让我们仔细讨论一下。特别地,这样能够用相似的场景帮助我们熟悉在反向传播中使用的矩阵表示。

我们首先给出网络中权重的清晰定义。我们使用 表示从 层的 个神经元到 层的 个神经元的链接上的权重。例如,下图给出了网络中第二层的第四个神经元到第三层的第二个神经元的链接上的权重:

tikz16

这样的表示粗看比较奇怪,需要花一点时间消化。但是,后面你会发现这样的表示会比较方便也很自然。奇怪的一点其实是下标 的顺序。你可能觉得反过来更加合理。但我接下来会告诉你为什么要这样做。

我们对网络的偏置和激活值也会使用类似的表示。显式地,我们使用 表示在 层第 个神经元的偏置,使用 表示 层第 个神经元的激活值。下面的图清楚地解释了这样表示的含义:

tikz17

有了这些表示, 层的第 个神经元的激活值 就和 层的激活值通过方程关联起来了(对比公式 (4) 和上一章的讨论):

其中求和是在 层的所有 个神经元上进行的。为了用矩阵的形式重写这个表达式,我们对每一层 都定义一个权重矩阵 。权重矩阵 的元素正是连接到 层神经元的权重,更确切地说,在第 行第 列的元素是 。类似的,对每一层 ,定义一个偏置向量。你已经猜到这些如何工作了 —— 偏置向量的每个元素其实就是前面给出的 ,每个元素对应于 层的每个神经元。最后,我们定义激活向量 ,其元素是那些激活值

最后我们需要引入向量化函数(如 )来按照矩阵形式重写公式 (23)。在上一章,我们其实已经碰到向量化了,其含义就是作用函数(如 )到向量 中的每个元素。我们使用 表示这种按元素进行的函数作用。所以, 的每个元素其实满足 。给个例子,如果我们的作用函数是 ,那么向量化的 的函数作用就起到下面的效果:

也就是说,向量化的 仅仅是对向量的每个元素进行了平方运算。

了解了这些表示,方程 (23) 就可以写成下面这种美妙而简洁的向量形式了:

这个表达式给出了一种更加全局的思考每层的激活值和前一层激活值的关联方式:我们仅仅用权重矩阵作用在激活值上,然后加上一个偏置向量,最后作用 函数1。这种全局的观点相比神经元层面的观点常常更加简明(没有更多的索引下标了!)。把它看做是在保留清晰认识的前提下逃离下标困境的方法。在实践中,表达式同样很有用,因为大多数矩阵库提供了实现矩阵乘法、向量加法和向量化的快速方法。实际上,上一章的代码其实已经隐式使用了这种表达式来计算网络行为。

在使用方程 (25) 计算 的过程中,我们计算了中间量 。这个量其实是非常有用的:我们称 层神经元的带权输入。在本章后面,我们会充分利用带权输入 。方程 (25) 有时候会以带权输入的形式写作 。同样要指出的是 的每个元素是 ,其实 就是第 层第 个神经元的激活函数的带权输入。


1. 其实,这就是让我们使用之前的矩阵下标 表示的初因。如果我们使用 来索引输入神经元, 索引输出神经元,那么在方程 (25) 中我们需要将这里的矩阵换做其转置。这是一个小的改变,但是令人困惑,这会使得我们无法自然地讲出(思考)“应用权重矩阵到激活值上”这样的简单的表达。

results matching ""

    No results matching ""