神经网络向量化
From Ufldl
Line 36: | Line 36: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
- | 在这个实现中,<tt>z2</tt>,<tt>a2</tt>,<tt>z3</tt>都是矩阵,每个训练样本对应矩阵的一列。在对多个训练样本实现向量化时常用的设计模式是,虽然前面每个样本对应一个列向量(比如<tt>z2</tt>),但我们可把这些列向量堆叠成一个矩阵以充分享受矩阵运算带来的好处。这样,在这个例子中,<tt>a2</tt>就成了一个<math>s_2</math>X<math>m</math>的矩阵(<math>s_2</math>是网络第二层中的神经元数,<math>m</math>是训练样本个数)。矩阵<tt>a2</tt>的物理含义是,当第<math>i</math>个训练样本<tt>x(:i)</tt>输入到网络中时,它的第<math>i</math>列就表示这个输入信号对隐神经元 (网络第二层)的激励结果。 | + | 在这个实现中,<tt>z2</tt>,<tt>a2</tt>,<tt>z3</tt>都是矩阵,每个训练样本对应矩阵的一列。在对多个训练样本实现向量化时常用的设计模式是,虽然前面每个样本对应一个列向量(比如<tt>z2</tt>),但我们可把这些列向量堆叠成一个矩阵以充分享受矩阵运算带来的好处。这样,在这个例子中,<tt>a2</tt>就成了一个<math>s_2</math> X <math>m</math>的矩阵(<math>s_2</math>是网络第二层中的神经元数,<math>m</math>是训练样本个数)。矩阵<tt>a2</tt>的物理含义是,当第<math>i</math>个训练样本<tt>x(:i)</tt>输入到网络中时,它的第<math>i</math>列就表示这个输入信号对隐神经元 (网络第二层)的激励结果。 |
- | 在上面的实现中,我们假定激活函数 <tt>f(z)</tt>接受矩阵形式的输入<tt>z</tt>,并对输入矩阵按列分别施以激活函数。需要注意的是,你在实现<tt>f(z)</tt>的时候要尽量多用Matlab/Octave的矩阵操作,并尽量避免使用for循环。假定激活函数采用Sigmoid函数,则实现代码如下所示: | + | 在上面的实现中,我们假定激活函数<tt>f(z)</tt>接受矩阵形式的输入<tt>z</tt>,并对输入矩阵按列分别施以激活函数。需要注意的是,你在实现<tt>f(z)</tt>的时候要尽量多用Matlab/Octave的矩阵操作,并尽量避免使用for循环。假定激活函数采用Sigmoid函数,则实现代码如下所示: |
<syntaxhighlight> | <syntaxhighlight> | ||
Line 53: | Line 53: | ||
% 高效的、向量化激活函数实现 | % 高效的、向量化激活函数实现 | ||
function output = vectorized_f(z) | function output = vectorized_f(z) | ||
- | output = 1./(1+exp(-z)); % "./" | + | output = 1./(1+exp(-z)); % "./" 在Matlab或Octave中表示对矩阵的每个元素分别进行除法操作 |
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
- | 最后,我们上面的正向传播向量化实现中忽略了<tt>b1</tt>和<tt>b2</tt> | + | 最后,我们上面的正向传播向量化实现中忽略了<tt>b1</tt>和<tt>b2</tt>,现在要把他们包含进来,为此我们需要用到Matlab/Octave的内建函数<tt>repmat</tt>: |
<syntaxhighlight> | <syntaxhighlight> |