神经网络向量化

From Ufldl

Jump to: navigation, search
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>  
-
%Unvectorized implementation 非向量化实现
+
% 非向量化实现
for i=1:m,  
for i=1:m,  
   z2 = W1 * x(:,i) + b1;
   z2 = W1 * x(:,i) + b1;
Line 26: Line 26:
</syntaxhighlight>  
</syntaxhighlight>  
-
Can we get rid of the <tt>for</tt> loop?  For many algorithms, we will represent intermediate stages of computation via vectors.  For example, <tt>z2</tt>, <tt>a2</tt>, and <tt>z3</tt> here are all column vectors that're used to compute the activations of the hidden and output layers.  In order to take better advantage of parallelism and efficient matrix operations, we would like to ''have our algorithm operate simultaneously on many training examples''.  Let us temporarily ignore <tt>b1</tt> and <tt>b2</tt> (say, set them to zero for now).  We can then implement the following:
+
这个<tt>for</tt>循环能去掉吗?对于很多算法而言,我们使用向量来表示计算过程中的中间结果。例如在前面的非向量化实现(9-2)中,<tt>z2</tt>,<tt>a2</tt>,<tt>z3</tt>都是列向量,分别用来计算隐层和输出层的激励结果。为了充分利用并行化和高效矩阵运算的优势,我们希望算法能同时处理多个训练样本。让我们先暂时忽略前面公式中的<tt>b1</tt>和<tt>b2</tt>(把它们设置为0),那么可以实现如下:
-
 
+
-
'''初译:'''
+
-
我们能否去掉这个<tt>for</tt>循环?对于很多算法,我们使用向量来表达计算过程中的中间阶段。例如在前面的非向量化实现(9-2)中,<tt>z2</tt>,<tt>a2</tt>,<tt>z3</tt>都是列向量。这几个列向量被用来计算隐含层和输出层的激活。为了能够使得矩阵运算并行和更有效率,我们希望我们的算法操作能够同时使用在多个训练样本上。让我们暂时忽略前面公式中的<tt>b1</tt>和<tt>b2</tt>(把它们设置为0)。我们可以有如下的实现:
+
-
 
+
-
'''一审:'''
+
-
这个<tt>for</tt>循环能否去掉?对于很多算法,我们使用向量来表示计算过程中的中间结果。例如在前面的非向量化实现(9-2)中,<tt>z2</tt>,<tt>a2</tt>,<tt>z3</tt>都是列向量,分别用来计算隐层和输出层的激励结果(译者注:这个表述不是十分准确,<tt>z2</tt>和<tt>z3</tt>分别是对隐层和输出层的输入刺激,a2才是隐层的激励结果)。为了充分发挥快捷矩阵运算和并行化计算的优势,我们希望算法操作能够处理多个训练样本。让我们先暂时忽略前面公式中的<tt>b1</tt>和<tt>b2</tt>(把它们设置为0),那么可以实现如下:
+
<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>:
'''一审:'''
'''一审:'''
-
最后,我们前面的正向传导向量化实现中忽略了<tt>b1</tt>和<tt>b2</tt>。现在要把他们包含进来,我们将用到Matlab/Octave的内建的函数<tt>repmat</tt>:
+
最后,我们前面的正向传播向量化实现中忽略了<tt>b1</tt>和<tt>b2</tt>。现在要把他们包含进来,我们将用到Matlab/Octave的内建的函数<tt>repmat</tt>:
<syntaxhighlight>
<syntaxhighlight>

Revision as of 15:33, 15 March 2013

Personal tools