吴恩达《机器学习》课程学习笔记(六)—— 神经网络的表达

吴恩达《机器学习》课程学习笔记(六)—— 神经网络的表达

一、非线性假设(Non-linear Hypotheses)

假设你有一个包含3个特征量的训练集,现在你想要建立一个关于这个训练集的二次假设方程:

\[ \begin{align*}& g(\theta_0 + \theta_1x_1^2 + \theta_2x_1x_2 + \theta_3x_1x_3 \newline& + \theta_4x_2^2 + \theta_5x_2x_3 \newline& + \theta_6x_3^2 )\end{align*} \]

在这样的情况下,你需要两两配对各种情况,需要​\( \frac{(3 + 2 – 1)!}{(2!\cdot (3-1)!)} \)​ 个二次项。

进一步,如果你有一个包含100个特征量的训练集,那么你需要​\( \frac{(100 + 2 – 1)!}{(2\cdot (100-1)!)} = 5050 \)​个二次项。

我们继续推广,可以发现,二次项的空间复杂度为​\( \mathcal{O}(n^2/2) \)​ ;如果再进一步推广到三次项,那么空间复杂度为​\( \mathcal{O}(n^3) \)​ 。可以看到,这是一个非常陡峭的增长函数,如果我们需要处理大量特征量、高次假设方程,那么空间的增长将是巨大的。

因此,我们需要寻找一个替代的方法,优化如此巨大的复杂度。

二、神经元和大脑(Neurons and the Brain)

我们知道,目前大脑拥有最厉害的“机器学习”算法,那我们能否模仿它来实现更好的机器学习算法呢?神经网络可以在一定程度上模仿大脑的运作机制。这一领域早就已经有了很多概念,不过因为运算量大而难以进一步发展;近年来,随着计算机速率的提升,神经网络也得到了发展的动力,再次成为热点。

我们对于不同的数据处理需求可能会提出各种不同的算法,那么,有没有可能所有需求都由一个算法来实现,就像物理一样,人类追求一个大一统的“统一场论”呢?

科学家尝试做过这么一个实验:将大脑中听觉皮层与耳朵之间的神经连接切断,并且将听觉皮层与眼睛相连,结果发现听觉皮层可以“看到”东西。

这说明,统一的学习算法是可能实现的。

 

三、模型表示(Model Representation)

1、简单表达

接下来我们看看,如何用神经网络来描述一个假设方程。

下面是一个简单的例子,图中的神经元是一个基本的运算单元,它由电信号获取输入(树突),并且计算后给出输出(轴突)

我们的神经网络模型,便是模仿了这一过程。我们的输入是​\( x_1\cdots x_n \)​ ,输出是假设函数。额外的,我们需要添加​\( x_0=1 \)​,称作偏置单元(bias unit)

在神经网络的分类算法中,我们使用相同的逻辑函数​\( \frac{1}{1 + e^{-\theta^Tx}} \)​,有时候,我们称它为逻辑激活函数(Sigmoid/logistic activation function)。其中的激活函数(activation function)一般来说指“由……驱动的神经元计算函数g(z)”,像上例就是“由逻辑函数驱动的神经元计算函数g(z)”。

这里的参数θ也被称作权重(weight)。

在上面的模型中,红色的圆圈代表了一个神经元。在实际上,神经网络就是由不同的神经元连接组合而来的:

可以看到,我们的输入层(第一层)接收了数据的输入,计算后输出到输出层(第三层),但是这个模型中,中间还多了一层数据的处理,这一层是由输入层的数据加权组合后重新映射成的,称为隐藏层(Hidden Layer)。

一个简单的表达形式如下:

\[ \begin{bmatrix}x_0 \newline x_1 \newline x_2 \newline \end{bmatrix}\rightarrow\begin{bmatrix}\ \ \ \newline \end{bmatrix}\rightarrow h_\theta(x) \]

一般而言,我们把隐藏层的节点或者说中间节点,称作“激活单元”(activation units),并且有如下符号:

\[ \begin{align*}& a_i^{(j)} = \text{第j层的第i个激活单元} \newline& \Theta^{(j)} = \text{控制从第j层到j+1层的映射函数的权重矩阵}\end{align*} \]

如果我们有一个隐藏层,那么整个流程看起来是这样的:

\[ \begin{bmatrix}x_0 \newline x_1 \newline x_2 \newline x_3\end{bmatrix}\rightarrow\begin{bmatrix}a_1^{(2)} \newline a_2^{(2)} \newline a_3^{(2)} \newline \end{bmatrix}\rightarrow h_\theta(x) \]

其中每一个激活节点的值是这样计算的:

\[ \begin{align*} a_1^{(2)} = g(\Theta_{10}^{(1)}x_0 + \Theta_{11}^{(1)}x_1 + \Theta_{12}^{(1)}x_2 + \Theta_{13}^{(1)}x_3) \newline a_2^{(2)} = g(\Theta_{20}^{(1)}x_0 + \Theta_{21}^{(1)}x_1 + \Theta_{22}^{(1)}x_2 + \Theta_{23}^{(1)}x_3) \newline a_3^{(2)} = g(\Theta_{30}^{(1)}x_0 + \Theta_{31}^{(1)}x_1 + \Theta_{32}^{(1)}x_2 + \Theta_{33}^{(1)}x_3) \newline 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)}) \newline \end{align*} \]

也就是说,第j层的权重矩阵的每一行对应一个加权组合,然后通过g(z)函数映射到j+1层的节点。

由矩阵乘法可知:因此如果要从含有​\( s_j \)​个单元的第j层映射到含有\( s_{j+1} \)个单元的第j+1层,那么权重矩阵​\( \Theta^{(j)} \)​的尺寸为​\( s_{j+1}\times(s_j+1) \)​,其中的+1是因为要考虑偏置单元​\( x_0 \)​。

2、向量形式表达

我们用一个变量​\( z_k^{(j)} \)​来表达g(z)函数的参数。那么在之前的例子里,我们可以得到:

\[ \begin{align*}a_1^{(2)} = g(z_1^{(2)}) \newline a_2^{(2)} = g(z_2^{(2)}) \newline a_3^{(2)} = g(z_3^{(2)}) \newline \end{align*} \]

其中的z即为:

\[ z_k^{(2)} = \Theta_{k,0}^{(1)}x_0 + \Theta_{k,1}^{(1)}x_1 + \cdots + \Theta_{k,n}^{(1)}x_n \]

输入量x和中间量​\( z^j \)​的向量表达为:

\[ \begin{align*}x = \begin{bmatrix}x_0 \newline x_1 \newline\cdots \newline x_n\end{bmatrix} &z^{(j)} = \begin{bmatrix}z_1^{(j)} \newline z_2^{(j)} \newline\cdots \newline z_n^{(j)}\end{bmatrix}\end{align*} \]

进而,我们得到了参数z计算的表达式,计算第j-1层到第j层映射g(z)的参数z:

\[ z^{(j)} = \Theta^{(j-1)}a^{(j-1)}\space\space\space\space\space\space(3.1) \]

下一步,我们可以计算第j层的节点:

\[ a^{(j)} = g(z^{(j)})\space\space\space\space\space\space(3.2) \]

计算后,一定要记得添加偏置单元​\( a_0^{(j)} \)​。

接着,我们用同样的方法计算下一层的信息:

\[ z^{(j+1)} = \Theta^{(j)}a^{(j)} \]

如果j+1层是输入层,那么我们就得到了一个只有一行的输出:

\[ h_\Theta(x) = a^{(j+1)} = g(z^{(j+1)}) \space\space\space\space\space\space(3.3)\]

在计算过程中,一定不要用错下标。

3、例子

下面我们用一个神经元来表达“逻辑与”,进行​\( x_1 \)​和​\( x_2 \)​的与运算。

模型的函数流程如下:

\[ \begin{align*}\begin{bmatrix}x_0 \newline x_1 \newline x_2\end{bmatrix} \rightarrow\begin{bmatrix}g(z^{(2)})\end{bmatrix} \rightarrow h_\Theta(x)\end{align*} \]

我们把第一层的权重矩阵设置为:

\[ \Theta^{(1)} =\begin{bmatrix}-30 & 20 & 20\end{bmatrix} \]

那么可以得到假设函数,之后我们验算结果:

\[ \begin{align*}& h_\Theta(x) = g(-30 + 20x_1 + 20x_2) \newline \newline & x_1 = 0 \ \ and \ \ x_2 = 0 \ \ then \ \ g(-30) \approx 0 \newline & x_1 = 0 \ \ and \ \ x_2 = 1 \ \ then \ \ g(-10) \approx 0 \newline & x_1 = 1 \ \ and \ \ x_2 = 0 \ \ then \ \ g(-10) \approx 0 \newline & x_1 = 1 \ \ and \ \ x_2 = 1 \ \ then \ \ g(10) \approx 1\end{align*} \]

可以看到这个神经元成功表达了逻辑与运算。

实际运用中,就是这样不同的神经元层层连接,形成了用于复杂计算的神经网络(有点像电路中的运算元件)。

这里给出一组可以实现 与、或非、或的权重矩阵:

\[ \begin{align*}AND:\newline\Theta^{(1)} &=\begin{bmatrix}-30 & 20 & 20\end{bmatrix} \newline NOR:\newline\Theta^{(1)} &= \begin{bmatrix}10 & -20 & -20\end{bmatrix} \newline OR:\newline\Theta^{(1)} &= \begin{bmatrix}-10 & 20 & 20\end{bmatrix} \newline\end{align*} \]

四、多类型分类(Multiclass Classification)

我们上一章学过,要进行多类型分类,就需要对每一个类型拟合出一个假设函数:

\[ \begin{align*}\begin{bmatrix}x_0 \newline x_1 \newline x_2 \newline\cdots \newline x_n\end{bmatrix} \rightarrow\begin{bmatrix}a_0^{(2)} \newline a_1^{(2)} \newline a_2^{(2)} \newline\cdots\end{bmatrix} \rightarrow\begin{bmatrix}a_0^{(3)} \newline a_1^{(3)} \newline a_2^{(3)} \newline\cdots\end{bmatrix} \rightarrow \cdots \rightarrow\begin{bmatrix}h_\Theta(x)_1 \newline h_\Theta(x)_2 \newline h_\Theta(x)_3 \newline h_\Theta(x)_4 \newline\end{bmatrix} \rightarrow\end{align*} \]

那么整合后的输出,可以用向量的形式表达:

\[ h_\Theta(x) =\begin{bmatrix}0 \newline 0 \newline 1 \newline 0 \newline\end{bmatrix} \]

在上面的例子中,分类为类型3的概率是1,是类型1、2、4的概率是0。

实际计算中,如果不同的类型都有概率,那么我们取概率最大的一个类型:

\[ h_\Theta(x) =\begin{bmatrix}0.2 \newline 0.8 \newline 0.2 \newline 0 \newline\end{bmatrix} \]

上面的例子中,分类为类型1、2、3、4的概率分别是0.2、0.8、0.2、0,我们取最大的概率0.8,对应的是类型2。

 

五、第三次编程作业

这次的内容主要是多类型分类算法的实现,以及初步使用神经网络。

有一个要注意的地方是,寻找矩阵中每一行的最大元素的下标:

可以看到很方便啊。

传送门:https://github.com/YongyiZhou/Andrew-Ng/tree/master/ex3



2 Comments

加油坚持

Reply

ヾ(◍°∇°◍)ノ゙加油

Reply

Leave a Reply

Your email address will not be published.

*
*
*

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert