神经网络

From Ufldl

Jump to: navigation, search
Line 1: Line 1:
-
举一个监督学习的例子,假设我们有训练样本集 <math>(x(^ i),y(^ i))</math>,那么神经网络算法能够提供一种复杂且非线性的假设模型<math>h_{W,b}(x)</math>,它具有参数<math>W, b</math>,可以以此参数来拟合我们的数据。
+
 
 +
 
 +
举一个监督学习的例子,假设我们有训练样本集 <math>\textstyle(x(^ i),y(^ i))</math>,那么神经网络算法能够提供一种复杂且非线性的假设模型<math>\textstyleh_{W,b}(x)</math>,它具有参数<math>\textstyleW, b</math>,可以以此参数来拟合我们的数据。
为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:
为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:
Line 5: Line 7:
[[Image:SingleNeuron.png|300px|center]]
[[Image:SingleNeuron.png|300px|center]]
-
这个“神经元”是一个以<math>x_1, x_2, x_3</math>及截距+1为输入值的运算单元,其输出为<math>\textstyle h_{W,b}(x) = f(W^Tx) = f(\sum_{i=1}^3 W_{i}x_i +b)</math>,其中函数<math>f : \Re \mapsto \Re</math>称为“激活函数”。在本教程中,我们的'''激活函数'''<math>f(\cdot)</math>将选用sigmoid函数
+
这个“神经元”是一个以<math>\textstylex_1, x_2, x_3</math>及截距+1为输入值的运算单元,其输出为<math>\textstyle h_{W,b}(x) = f(W^Tx) = f(\sum_{i=1}^3 W_{i}x_i +b)</math>,其中函数<math>\textstylef : \Re \mapsto \Re</math>被称为“激活函数”。在本教程中,我们选用sigmoid函数
-
 
+
作为'''激活函数'''<math>\textstylef(\cdot)</math>
-
:<math>
+
:<math>\textstyle
f(z) = \frac{1}{1+\exp(-z)}.
f(z) = \frac{1}{1+\exp(-z)}.
</math>
</math>
-
那么,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)。
+
可以看出,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)。
-
虽然本系列教程将采用sigmoid函数,但你也可以选择双曲正切函数(tanh):
+
虽然本系列教程采用sigmoid函数,但你也可以选择双曲正切函数(tanh):
-
:<math>
+
:<math>\textstyle
f(z) = \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}},   
f(z) = \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}},   
</math>
</math>
Line 26: Line 28:
</div>
</div>
-
<math>\tanh(z)</math> 函数是sigmoid函数的一种变体,它的取值范围为<math>[-1,1]</math>,而不是sigmoid函数的<math>[0,1]</math>。
+
<math>\textstyle\tanh(z)</math> 函数是sigmoid函数的一种变体,它的取值范围为<math>\textstyle[-1,1]</math>,而不是sigmoid函数的<math>\textstyle[0,1]</math>。
-
注意,与其它地方(包括OpenClassroom公开课以及斯坦福大学CS229课程)不同的是,这里我们不再令<math>x_0=1</math>。取而代之,我们用单独的参数<math>b</math>来表示截距。
+
注意,与其它地方(包括OpenClassroom公开课以及斯坦福大学CS229课程)不同的是,这里我们不再令<math>\textstylex_0=1</math>。取而代之,我们用单独的参数<math>\textstyleb</math>来表示截距。
-
最后要说明的是,有一个等式我们以后会经常用到:如果选择<math>f(z) = 1/(1+\exp(-z))</math>,也就是sigmoid函数,那么它的导数就是<math>f'(z) = f(z) (1-f(z))</math>(如果选择tanh函数,那它的导数就是<math>f'(z) = 1- (f(z))^2</math>,你可以根据sigmoid(或tanh)函数的定义自行推导这个等式。
+
最后要说明的是,有一个等式我们以后会经常用到:如果选择<math>\textstylef(z) = 1/(1+\exp(-z))</math>,也就是sigmoid函数,那么它的导数就是<math>\textstylef'(z) = f(z) (1-f(z))</math>(如果选择tanh函数,那它的导数就是<math>\textstylef'(z) = 1- (f(z))^2</math>,你可以根据sigmoid(或tanh)函数的定义自行推导这个等式。
==神经网络模型==  
==神经网络模型==  
-
所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可能是另一个“神经元”的输入。例如,下图就是一个简单的神经网络:
+
所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。例如,下图就是一个简单的神经网络:
[[Image:Network331.png|400px|center]]
[[Image:Network331.png|400px|center]]
Line 40: Line 42:
如图,我们使用圆圈来表示神经网络的输入,标上“+1”的圆圈被称为'''偏置节点''',也就是截距项。神经网络最左边的一层叫做'''输入层''',最右的一层叫做'''输出层'''(本例中,输出层只有一个节点)。中间所有节点组成的一层叫做'''隐藏层''',因为我们不能在训练样本集中观测到它们的值。同时可以看到,以上神经网络的例子中有3个'''输入单元'''(偏置单元不计在内),3个'''隐藏单元'''及一个'''输出单元'''。
如图,我们使用圆圈来表示神经网络的输入,标上“+1”的圆圈被称为'''偏置节点''',也就是截距项。神经网络最左边的一层叫做'''输入层''',最右的一层叫做'''输出层'''(本例中,输出层只有一个节点)。中间所有节点组成的一层叫做'''隐藏层''',因为我们不能在训练样本集中观测到它们的值。同时可以看到,以上神经网络的例子中有3个'''输入单元'''(偏置单元不计在内),3个'''隐藏单元'''及一个'''输出单元'''。
-
我们用<math>{n}_{l}</math>表示网络的层数,本例中<math>{n}_{l}=3</math>,我们将第<math>l</math>层记为<math>L_l</math>,于是<math>L_l</math>是输入层,输出层是<math>L_{n_l}</math>。本例神经网络有参数<math>(W,b) = (W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)})</math>,其中<math>W^{(l)}_{ij}</math>第<math>l</math>层第<math>j</math>单元与第<math>l+1</math>层第<math>i</math>单元之间的联接参数(其实就是连接线上的权重,注意标号顺序),<math>b^{(l)}_i</math>是第<math>l+1</math>层第<math>i</math>单的偏置项。因此,本例中,<math>W^{(1)} \in \Re^{3\times 3}</math>,<math>W^{(2)} \in \Re^{1\times 3}</math>。注意,没有其他单元连向偏置单元(即偏置单元没有输入),因为它们总是输出+1。同时,我们用<math>s_l</math>表示第<math>l</math>层的节点数(偏置单元不计在内)。
+
我们用<math>\textstyle{n}_l</math>来表示网络的层数,本例中<math>\textstylen_l=3</math>,我们将第<math>\textstylel</math>层记为<math>\textstyleL_l</math>,于是<math>\textstyleL_l</math>是输入层,输出层是<math>\textstyleL_{n_l}</math>。本例神经网络有参数<math>\textstyle(W,b) = (W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)})</math>,其中<math>\textstyleW^{(l)}_{ij}</math>第<math>\textstylel</math>层第<math>\textstylej</math>单元与第<math>\textstylel+1</math>层第<math>\textstylei</math>单元之间的联接参数(其实就是连接线上的权重,注意标号顺序),<math>\textstyleb^{(l)}_i</math>是第<math>\textstylel+1</math>层第<math>\textstylei</math>单的偏置项。因此,本例中,<math>\textstyleW^{(1)} \in \Re^{3\times 3}</math>,<math>\textstyleW^{(2)} \in \Re^{1\times 3}</math>。注意,没有其他单元连向偏置单元(即偏置单元没有输入),因为它们总是输出+1。同时,我们用<math>\textstyles_l</math>表示第<math>\textstylel</math>层的节点数(偏置单元不计在内)。
-
我们用<math>a^{(l)}_i</math>表示第<math>l</math>层第<math>i</math>号单元的'''激活值'''(输出值)。当<math>l=1</math>时,<math>a^{(1)}_i = x_i</math>,也就是第<math>i</math>个输入值(输入值的第<math>i</math>个特征)。对于给定参数集合<math>W,b</math>,我们的神经网络就按照函数<math>h_{W,b}(x)</math>计算输出结果。本例神经网络的计算过程就由以下步骤表示:
+
我们用<math>\textstylea^{(l)}_i</math>表示第<math>\textstylel</math>层第<math>\textstylei</math>号单元的'''激活值'''(输出值)。当<math>\textstylel=1</math>时,<math>\textstylea^{(1)}_i = x_i</math>,也就是第<math>\textstylei</math>个输入值(输入值的第<math>\textstylei</math>个特征)。对于给定参数集合<math>\textstyleW,b</math>,我们的神经网络就按照函数<math>\textstyleh_{W,b}(x)</math>计算输出结果。本例神经网络的计算过程就由以下步骤表示:
-
:<math>
+
:<math>\textstyle
\begin{align}
\begin{align}
a_1^{(2)} &= f(W_{11}^{(1)}x_1 + W_{12}^{(1)} x_2 + W_{13}^{(1)} x_3 + b_1^{(1)})  \\
a_1^{(2)} &= f(W_{11}^{(1)}x_1 + W_{12}^{(1)} x_2 + W_{13}^{(1)} x_3 + b_1^{(1)})  \\
Line 52: Line 54:
</math>
</math>
-
我们用<math>z^{(l)}_i</math>表示第<math>l</math>层第<math>i</math>单元输入加权和(包括偏置单元),比如,<math>\textstyle z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i</math>,则<math>a^{(l)}_i = f(z^{(l)}_i)</math>。
+
我们用<math>\textstylez^{(l)}_i</math>表示第<math>\textstylel</math>层第<math>\textstylei</math>单元输入加权和(包括偏置单元),比如,<math>\textstyle z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i</math>,则<math>\textstylea^{(l)}_i = f(z^{(l)}_i)</math>。
-
这样我们就可以得到一种更简洁的表示法。这里我们将激活函数<math>f(\cdot)</math>扩展为用向量(分量的形式)来表示,即<math>f([z_1, z_2, z_3]) = [f(z_1), f(z_2), f(z_3)]</math>,那么,上面的等式可以更简洁地表示为:
+
这样我们就可以得到一种更简洁的表示法。这里我们将激活函数<math>\textstylef(\cdot)</math>扩展为用向量(分量的形式)来表示,即<math>\textstylef([z_1, z_2, z_3]) = [f(z_1), f(z_2), f(z_3)]</math>,那么,上面的等式可以更简洁地表示为:
-
:<math>\begin{align}
+
:<math>\textstyle\begin{align}
z^{(2)} &= W^{(1)} x + b^{(1)} \\
z^{(2)} &= W^{(1)} x + b^{(1)} \\
a^{(2)} &= f(z^{(2)}) \\
a^{(2)} &= f(z^{(2)}) \\
Line 62: Line 64:
\end{align}</math>
\end{align}</math>
-
我们将上面的计算步骤叫作'''正向传播'''。回想一下,之前我们用<math>a^{(1)} = x</math> 表示输入层的激活值,那么给定第<math>l</math>层的激活值<math>a^{(l)}</math>后,第<math>l+1</math>层的激活值<math>a^{(l+1)}</math>就可以按照下面步骤计算得到:
+
我们将上面的计算步骤叫作'''正向传播'''。回想一下,之前我们用<math>\textstylea^{(1)} = x</math> 表示输入层的激活值,那么给定第<math>\textstylel</math>层的激活值<math>\textstylea^{(l)}</math>后,第<math>\textstylel+1</math>层的激活值<math>\textstylea^{(l+1)}</math>就可以按照下面步骤计算得到:
-
:<math>\begin{align}
+
:<math>\textstyle\begin{align}
z^{(l+1)} &= W^{(l)} a^{(l)} + b^{(l)}  \\
z^{(l+1)} &= W^{(l)} a^{(l)} + b^{(l)}  \\
a^{(l+1)} &= f(z^{(l+1)})
a^{(l+1)} &= f(z^{(l+1)})
Line 73: Line 75:
目前为止,我们讨论了一种神经网络的例子,但我们也可以构建一个另一种'''结构'''的神经网络(这里结构指的是神经元之间的联接模式),包括具有多个隐藏层的神经网络。最常见的一个例子是<math>\textstyle n_l</math>层的神经网络,第<math>\textstyle 1</math>层是输入层,第<math>\textstyle n_l</math>层是输出层,中间的每个层<math>\textstyle l</math>与层<math>\textstyle l+1</math>紧密相联。这种模式下,要计算神经网络的输出结果,我们可以通过之前的等式描述的那样,按部就班,进行正向传播,逐一计算第<math>\textstyle L_2</math>层的所有激活值,再者是第<math>\textstyle L_3</math>层的激活值,以此类推,直到第<math>\textstyle L_{n_l}</math>层。这是一个'''前馈'''神经网络的样例,因为这种联接图并没有闭环或回路。
目前为止,我们讨论了一种神经网络的例子,但我们也可以构建一个另一种'''结构'''的神经网络(这里结构指的是神经元之间的联接模式),包括具有多个隐藏层的神经网络。最常见的一个例子是<math>\textstyle n_l</math>层的神经网络,第<math>\textstyle 1</math>层是输入层,第<math>\textstyle n_l</math>层是输出层,中间的每个层<math>\textstyle l</math>与层<math>\textstyle l+1</math>紧密相联。这种模式下,要计算神经网络的输出结果,我们可以通过之前的等式描述的那样,按部就班,进行正向传播,逐一计算第<math>\textstyle L_2</math>层的所有激活值,再者是第<math>\textstyle L_3</math>层的激活值,以此类推,直到第<math>\textstyle L_{n_l}</math>层。这是一个'''前馈'''神经网络的样例,因为这种联接图并没有闭环或回路。
-
神经网络也可以有多个输出单元。比如,以下神经网络有两层隐藏层:<math>L_2</math> 及<math>L_3</math>,并在<math>L_4</math>层中有两个输出单元。
+
神经网络也可以有多个输出单元。比如,以下神经网络有两层隐藏层:<math>\textstyleL_2</math> 及<math>\textstyleL_3</math>,并在<math>\textstyleL_4</math>层中有两个输出单元。
[[Image:Network3322.png|500px|center]]
[[Image:Network3322.png|500px|center]]
-
要求解这样的神经网络,需要样本集 <math>(x^{(i)}, y^{(i)})</math> ,其中<math>y^{(i)} \in \Re^2</math>。如果你想预测的输出是多个的,那这种神经网络是很适用的。(比如,在医疗诊断应用中,患者的体征指标就可以作为向量的输入值,而不同的输出值<math>y_i</math>可以表示不同的疾病存在与否。)
+
要求解这样的神经网络,需要样本集 <math>\textstyle(x^{(i)}, y^{(i)})</math> ,其中<math>\textstyley^{(i)} \in \Re^2</math>。如果你想预测的输出是多个的,那这种神经网络是很适用的。(比如,在医疗诊断应用中,患者的体征指标就可以作为向量的输入值,而不同的输出值<math>\textstyley_i</math>可以表示不同的疾病存在与否。)
 +
 
 +
==中英语对照==
-
中英语对照
 
neural networks 神经网络
neural networks 神经网络
 +
activation function. 激活函数
activation function. 激活函数
 +
hyperbolic tangent 双曲正切函数
hyperbolic tangent 双曲正切函数
 +
bias units 偏置项
bias units 偏置项
 +
activation激活值
activation激活值
 +
forward propagation 正向传播(这里为了与“反向传播”的翻译相对应,采用“正向传播”)
forward propagation 正向传播(这里为了与“反向传播”的翻译相对应,采用“正向传播”)
 +
feedforward neural network 前馈神经网络(参照Mitchell的《机器学习》的翻译)
feedforward neural network 前馈神经网络(参照Mitchell的《机器学习》的翻译)
 +

Revision as of 03:04, 14 March 2013

Personal tools