斯坦福机器学习课程 第四周

(1) 神经网络

神经网络的表示Ⅰ

神经网络起源

神经网络是在模拟大脑中的神经元时发明的。神经元是大脑中的细胞,神经元有一个细胞主体(Cell body),有一定数量的输入神经,这些输入神经叫做树突(Dendrite)。可以把它们想象成输入电线,它们接收来自其他神经元的信息。神经元的输出神经叫做轴突(Axon),这些输出神经是用来给其他神经元传递信号或者传送信息的。

简而言之,神经元是一个计算单元,它从输入神经接受一定数目的信息,并做一些计算,然后将结果通过它的轴突传送到大脑中的其他神经元。

神经网络逻辑单元

在一个计算机的神经网络里,我们将使用一个非常简单的模型来模拟神经元的工作:

这里的$h_\theta(x)$通常值是
$$
h_\theta(x) = \frac{1}{1+e^{(-\theta^Tx)}}
$$
其中$x$和$\theta$指的是参数向量:
$$
x = \left[
\begin{array}{}
x_0 \
x_1 \
x_2 \
x_3
\end{array}{}\right] ~~
\theta = \left[
\begin{array}{}
\theta_0 \
\theta_1 \
\theta_2 \
\theta_3
\end{array}{}
\right]
$$
这就是一个简单的模拟神经元的模型。

当绘制神经网络时,有时会额外增加一个$x_0$的输入节点,这个$x_0$节点有时也被称作偏置单位(或偏置神经元)。但由于$x_0=1$,所以有时不会画出。

激励函数

在神经网络中,有时会听到“一个有Sigmoid函数或者Logistic函数作为激励函数(activation function)的人工神经元”这样的话。其实这里所指的激励函数(activation function)只是对类似非线性函数$g(z)$的另一个术语称呼。

在神经网络的文献里,模型的权重(weight)其实和模型的参数$\theta$是一个东西

解读神经网络

输入层,输出层,隐藏层

神经网络其实就是不同的神经元组合在一起的集合:

具体来说:

  • 上图中有三个输入单元:$x_1, x_2 和 x_3$,当然也可以加入值为1的$x_0$。
  • 中间有三个神经元:$a_1^{(2)}, a_2^{(2)}和a_3^{(2)}$,同理,你也可以加上值永远为1的偏执单元$a_0^{(2)}$。
  • 然后在最右层有第三层,第三层的这个节点输出了假设函数$h(x)$的计算结果$h_\Theta(x)$。

用神经网络的术语来说,第一层也别成为输入层,因为我们在这一层输入了特征项$x_1, x_2 和x_3$。

最后一层也被称为输出层,因为这一层的神经元会输出假设函数的最终计算结果$h_\Theta(x)$。

中间层,也被称为隐藏层,在监督学习中,你能看到输入和输出,而隐藏层的值在你的训练过程中是看不到的,它的值不是$x$也不是$y$,所以我们叫它隐藏层。神经网络可以有不止一个隐藏层。在神经网络中,任何一个非输入层且非输出层,就被称为隐藏层。

神经网络运行原理

接下来逐步分析上图所呈现的神经网络的计算步骤。

首先需要说明以下两个符号的含义:

  • $a_i^{(j)}$表示第j层的第i个神经元。

具体来说$a_1^2$表示的是第2层的第1个激励,即隐藏层的第一个激励。

所谓激励(activation)是指由一个具体神经元读入计算并输出的值。

  • $\Theta^{(j)}$表示层与层之间权重的参数矩阵(权重矩阵)

具体来说,$a_1^{(2)}$的值的计算是这样的:
$$
a_1{(2)} = g(\theta_{10}^1x_0 + \theta_{11}^1x_1 + \theta_{12}^1x_2 + \theta_{13}^1x_3)
$$

这里的$g$函数是S型函数(或者说是S激励函数,也叫做逻辑激励函数)。

我们可以把隐藏层的三个神经元的计算结果都写出来:
$$
a_1{(2)} = g(\theta_{10}^1x_0 + \theta_{11}^1x_1 + \theta_{12}^1x_2 + \theta_{13}^1x_3) \
a_2{(2)} = g(\theta_{20}^1x_0 + \theta_{21}^1x_1 + \theta_{22}^1x_2 + \theta_{23}^1x_3) \
a_3{(2)} = g(\theta_{30}^1x_0 + \theta_{31}^1x_1 + \theta_{32}^1x_2 + \theta_{33}^1x_3)
$$
这里我有三个输入单元和三个隐藏单元,这样以来,参数矩阵$\Theta^{(1)}$控制了来自三个输入单元到三个隐藏单元的映射。因此$\Theta^1$的维数是$R^{3\times4}$的矩阵(考虑$x_0$的情况下)。

更一般的,如果一个神经网络在第$j$层有$s_j$个单元,在$j+1$层有$s_{j+1}$个单元,那么第$j$层的参数矩阵$\Theta^{(j)}$的维数就是$s_{j+1} \times (s_j + 1)$。

以上我们讨论了三个隐藏单位是怎么计算它们的值的。最后,在输入层,我们还有一个单元,它用来计算$h_\Theta(x)$:
$$
h_\Theta(x) = a_1^{(3)} = g(\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)})
$$
以上就是从数学上对一个人工神经网络的定义。

神经网络的表示Ⅱ

前向传播(forward propagation)的向量化实现

以这个神经网络为例:

如果你仔细观察表达式中红色方框内的区域:

这里其实是一个矩阵的乘法运算:
$$
\Theta^{(1)}x
$$
这样一来,我们就能将神经网络的计算向量化了。

具体而言,我们定义特征向量$x$:
$$
x = \left[
\begin{array}{}
x_0 \
x_1 \
x_2 \
x_3
\end{array}
\right]
$$

其中$x_0 = 1$

并定义$z^{(2)}$:
$$
z^{(2)} = \left[
\begin{array}{}
z_1^{(2)} \
z_2^{(2)} \
z_3^{(2)}
\end{array}
\right]
$$

注意,这里的$z^{(2)}$是一个三维向量。

我们只需要两个步骤就可以计算出$a^{(2)}$向量了“
$$
z^{(2)} = \Theta^{(1)}x \
a^{(2)} = g(z^{(2)})
$$

注意这里的$a^{(2)}$也是一个三维向量,这里的激励函数$g$将对$z^{(2)}$中的每个元素进行计算。

定义$a^{(1)} = x$,这样就有了向量$a^{(1)}$。

将向量$x$替换为向量$a^{(1)}$:
$$
z^{(2)} = \Theta^{(1)}a^{(1)}
$$
然后还需要加上偏执单元$a_0^{(2)}$,此时向量$a^{(2)}$的长度变成了4:
$$
a^{(2)} \in \mathbb{R}^4
$$
最后,为了计算实际输出值:
$$
h_\Theta(x) = a_1^{(3)} = g(\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)})
$$
我们计算出代表$\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)}$的$z^{(3)}$,并将其带入激励函数,最后就能得出$h(x)$的值了:
$$
z^{(3)} = \Theta^{(2)}a^{(2)} \
h_\Theta(x) = a^{(3)} = g(z^{(3)})
$$
这就是计算$h_\Theta(x)$的过程,也称为前向传播(forward propagation)

神经网络的架构

你还可以用其他类型的图来表示神经网络。神经网络中神经元相连接的方式,称为神经网络的架构(Architecture)

下面是另一个神经网络架构的例子:

(2) 神经网络应用实例

神经网络应用实例

问题引入

考虑下面的问题:

我们有二进制的输入特征$x_1$和$x_2$,它们的取值要么是0,要么是1。这个例子中,我们有一堆用×来表示的正样本和用圆圈来表示的负样本。

我们想要做到的就是有一个非线性的决策边界来区分正负样本:

下面使用这个二进制输入特征的例子来描述神经网络是怎样计算的。

具体来讲,我们要计算的目标函数:
$$
y = x_1 XNOR x_2
$$

求同或(都为真或都为假时,结果为真,否则结果为假)。

或者也可以写作:
$$
NOT(y = x_1 XOR x_2)
$$

求异或再取反。

AND, OR, NOT的实现

AND

为了解释神经网络模型如何来拟合这种训练集。我们先讲解一个稍微简单一些的神经网络,它拟合了“且运算”(AND)

假设我们有二进制输入$x_1$和$x_2$,目标函数是$y = x_1 AND x_2$,为了得到一个具有单个神经元的神经网络来计算逻辑与,我们需要画出偏执单元:

接下来给这个网络分配一些权重(参数):

所以我们的假设函数是:
$$
h_\Theta(x) = g(-30 + 20x_1 + 20x_2)
$$
这里$\Theta_{10}^{(1)}$就是-30,$\Theta_{11}^{(2)}$就是20,$\Theta_{12}^{(3)}$就是20。

接下来介绍这个小神经元是怎样计算的。

回忆一下激励函数$g(z)$看起来是这样的:

再来看看我们的假设在各种情况下的输出:

$x_1$ $x_2$ $h_\Theta(x)$
0 0 $g(-30) \approx 0$
0 1 $g(-10) \approx 0$
1 0 $g(-10) \approx 0$
1 1 $g(10)\approx 1$

OR

下面的神经网络使用同样的原理实现了“或”的功能:

假设函数为:
$$
h_\Theta(x) = g(-10 + 20x_1 + 20x_2)
$$

$x_1$ $x_2$ $h_\Theta(x)$
0 0 $g(-10) \approx 0$
0 1 $g(10) \approx 1$
1 0 $g(10) \approx 1$
1 1 $g(10)\approx 1$

NOT

下面的神经网络使用同样的原理实现了“非”的功能:

假设函数为:
$$
h_\Theta(x) = g(10 - 20x_1)
$$

$x_1$ $h_\Theta(x)$
0 $g(10) \approx 1$
1 $g(-10) \approx 0$

一个更复杂的例子

下面的神经网络使用同样的原理实现了$(NOTX_1)AND(NOTx_2)$的功能:

假设函数为:
$$
h_\Theta(x) = g(10 - 20x_1 - 20x_2)
$$

$x_1$ $x_2$ $h_\Theta(x)$
0 0 $g(10) \approx 1$
0 1 $g(-10) \approx 0$
1 0 $g(-10) \approx 0$
1 1 $g(-30)\approx 0$

求解XNOR

接下来我们使用上面求解的以下三个神经网络,就可以来运算$x_2XNORx_2$了: