神经网络向量化
From Ufldl
Line 1: | Line 1: | ||
在本节,我们将引入神经网络的向量化版本。在前面关于[[神经网络]]介绍的章节中,我们已经给出了一个部分向量化的实现,它在一次输入一个训练样本时是非常有效率的。下边我们看看如何实现同时处理多个训练样本的算法。具体来讲,我们将把正向传播、反向传播这两个步骤以及稀疏特征集学习扩展为多训练样本版本。 | 在本节,我们将引入神经网络的向量化版本。在前面关于[[神经网络]]介绍的章节中,我们已经给出了一个部分向量化的实现,它在一次输入一个训练样本时是非常有效率的。下边我们看看如何实现同时处理多个训练样本的算法。具体来讲,我们将把正向传播、反向传播这两个步骤以及稀疏特征集学习扩展为多训练样本版本。 | ||
- | == | + | ==正向传播== |
考虑一个三层网络(一个输入层、一个隐含层、以及一个输出层),并且假定x是包含一个单一训练样本<math>x^{(i)} \in \Re^{n}</math> 的列向量。则向量化的正向传播步骤如下: | 考虑一个三层网络(一个输入层、一个隐含层、以及一个输出层),并且假定x是包含一个单一训练样本<math>x^{(i)} \in \Re^{n}</math> 的列向量。则向量化的正向传播步骤如下: | ||
Line 17: | Line 17: | ||
<syntaxhighlight> | <syntaxhighlight> | ||
- | % | + | % 非向量化实现 |
for i=1:m, | for i=1:m, | ||
z2 = W1 * x(:,i) + b1; | z2 = W1 * x(:,i) + b1; | ||
Line 26: | Line 26: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
- | + | 这个<tt>for</tt>循环能去掉吗?对于很多算法而言,我们使用向量来表示计算过程中的中间结果。例如在前面的非向量化实现(9-2)中,<tt>z2</tt>,<tt>a2</tt>,<tt>z3</tt>都是列向量,分别用来计算隐层和输出层的激励结果。为了充分利用并行化和高效矩阵运算的优势,我们希望算法能同时处理多个训练样本。让我们先暂时忽略前面公式中的<tt>b1</tt>和<tt>b2</tt>(把它们设置为0),那么可以实现如下: | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | 这个<tt>for</tt> | + | |
<syntaxhighlight> | <syntaxhighlight> | ||
Line 81: | Line 75: | ||
'''初译:''' | '''初译:''' | ||
- | + | 最后,我们前面实现的正向传播的向量化忽略了<tt>b1</tt>和<tt>b2</tt>。为了包含他们进来,我们将使用Matlab/Octave的内建的函数<tt>repmat</tt>: | |
'''一审:''' | '''一审:''' | ||
- | + | 最后,我们前面的正向传播向量化实现中忽略了<tt>b1</tt>和<tt>b2</tt>。现在要把他们包含进来,我们将用到Matlab/Octave的内建的函数<tt>repmat</tt>: | |
<syntaxhighlight> | <syntaxhighlight> |