机器学习技法笔记 – Neural Network(神经网络)

Motivation

一言以概之,Neural Network(神经网络)是一种Non-Linear Aggregation,我们首先从一个Perceptron(感知机)的Linear Aggregation开始,对Neural Network的工作原理做一个简单的介绍。

原始问题我们设定为分类问题,假设我们已经训练出了\(d\)个Perceptrons,并对其做Linear Blending,其\(G(x)\)具有以下形式:

若以Neural Network的角度,进行图像化的描述,则\(G(x)\)具有以下形式:

这样的\(G(x)\)即是最基础最简单的Neural Network(神经网络)模型了,它具有输入层,一层隐含层,输出层。

通过这样的单层Neural Network,我们可以实现\(AND(x_1, x_2)\)这样的数学运算:

它的\(G(x)\)具有以下形式:

用图形化的描述,以上Neural Network具有以下形式:

显然,我们可以通过更多,甚至无穷多的\(g_t\)进行Linear Blending,这种通过线性超平面经过无穷多组合后,甚至可以表示非线性的超平面:

但是这样并不是无代价的,其代价就是\(d_{vc}→∞\),在机器学习基石课程中曾经提到了\(d_{vc}\),\(d_{vc}\)是成长函数的Break Point,越大的\(d_{vc}\)意味着更强大泛化能力,但是也可能带来Overfitting与复杂的Model Complexity:

同时,单一层的Neural Network模型具有局限性,这样的Neural Network甚至不可以用来运算\(XOR(x_1, x_2)\),但是通过使用多层(多个隐含层),即可用来运算\(XOR(x_1, x_2)\),这某种意义上也是一种Feature Transform:

Neural Network Hypothesis

接下来为了后续问题的讨论,我们将用一些符号对Neural Network的一些基本概念做一些抽象化的定义。

对于一个如下形式的Neural Network:

其中,最左侧的\(x_0, x_1, x_2, … , x_d\)被称之为输入层,即输入的数据集。

而图中每一个节点被称之为一个神经元。

中间的两层被称之为隐含层,隐含层将其上层的输出\(s^{(l)}_j\)经过\(tanh(x)\)运算后作为下层的输入,其中\(s^{(l)}_j\)的计算公式如下:

$$s^{(l)}_j = \sum^{d^{(l-1)}}_{i=0} w^{(l)}_{ij}x^{(l-1)}_i$$

其中\(l\)是第\(l\)层,\(j\)是第\(j\)个神经元。

所以第\(l\)层的第\(j\)个神经元的输入计算公式如下:

$$x^{(l)}_j = \begin{cases}tanh(s^{(l)}_j) & \text{if l < L}\\ s^{(l)}_j & \text{if l = L} \end{cases}$$

其中\(tanh(x)\)的函数图像与解析式如下:

$$tanh(s) = \frac{exp(s)-exp(-s)}{exp(s)+exp(-s)} = 2\theta(2s)-1$$

\(tanh(x)\)在Neural Network模型中是一种流行的选择,因为它兼具线性函数与符号函数的特性。

夹在每一层中的\(w^{(l)}_{ij}\)被称之为权重,这也是我们后续需要优化的对象。

而最右侧层称之为输出层,即最终的结果。

梳理上述符号如下图:

对于每一层所有的神经元,他们的输入可以又以下矩阵表示:

Neural Network Learning

在Neural Network中,我们的目标是训练出每一层的所有\(w^{(l)}_{ij}\),使得最后的\(G(x)\)的\(E_{in}\)最小,我们定义Neural Network的Error Function如下:

$$e_n = (y_n – NNet(x_n))^2$$

接下来我们将介绍一种被称之为BackPropagation的算法来最小化\(e_n\):

我们首先考虑一个只有一个输出神经元的Neural Network,然后在输出层将\(e_n\)展开:

$$\begin{align} e_n & = (y_n – NNet(x_n))^2 = (y_n – s^{(L)}_1)^2 \\ & = (y_n – \sum^{d^{(L-1)}}_{i=0} w^{(L-1)}_{i1}x^{(L-1)}_i)^2 \end{align}$$

为了最小化\(L-1\)层权重\(w^{(L-1)}_{i1}\),我们对上式求偏微分,注意:

$$s^{(L)}_1 = \sum^{d^{(L-1)}}_{i=0} w^{(L)}_{i1}x^{(L-1)}_i$$

则原始关于\(w^{(L-1)}_{i1}\)偏微分具有如下形式:

$$\begin{align} \frac{\partial{e_n}}{\partial{w^{(L)}_{i1}}} & =\frac{\partial{e_n}}{\partial{s^{(L)}_{1}}} · \frac{\partial{s^{(L)}_1}}{\partial{w^{(L)}_{i1}}} \\ & =-2(y_n – s^{(L)}_1) · (x^{(L-1)}_{i}) \end{align}$$

然后我们可以通过Gradient Descent或者Stochastic Gradient Descent训练出一个最优的\(w^{(L)}_{i1}\),使得\(e_{n}\)最小,注意上式的\(w^{(L)}_{i1}\)隐含在\(s^{(L)}_1\)中。

我们令:

$$\delta^{(L)}_{1} = -2 (y_n – s^{(L)}_{1})$$

更一般地,对于任意层\(l\),其权重\(w^{(l)}_{ij}\)与\(e_n\)的偏微分关系如下:

$$\frac{\partial{e_n}}{\partial{w^{(l)}_{ij}}} =\frac{\partial{e_n}}{\partial{s^{(l)}_{j}}} ·\frac{\partial{s^{(l)}_{j}}}{\partial{w^{(l)}_{ij}}} =\delta^{(l)}_{j} · (x^{(l-1)}_i)$$

我们首先观察第\(l\)层第\(j\)个节点的\(\delta^{(l)}_{j}\)与\(e_n\)的关系:

$$s^{(l)}_{j} \stackrel{tanh}\Rightarrow x^{(l)}_{j} \stackrel{w^{(l+1)}_{jk}}\Rightarrow \begin{bmatrix}s^{(l+1)}_{1} \\ ··· \\ s^{(l+1)}_{k} \\ ··· \end{bmatrix}\Rightarrow ···\Rightarrow e_n$$

所以第\(l\)层第\(j\)个节点的\(\delta^{(l)}_{j}\)的计算公式如下:

$$\begin{align} \delta^{(l)}_{j} & =\frac{\partial{e_n}}{\partial{s^{(l)}_{j}}} \\ & = \sum^{d^{(l+1)}}_{k=1} \frac{\partial{e_n}}{\partial{s^{(l+1)}_{k}}} · \frac{\partial{s^{(l+1)}_{k}}}{\partial{x^{(l)}_{j}}} · \frac{\partial{x^{(l)}_{j}}}{\partial{s^{(l)}_{j}}} \\ & = \sum_{k} (\delta^{(l+1)}_{k}) (w^{(l+1)}_{jk}) (tanh'(s^{(l)}_{j})) \end{align}$$

通过计算上式,我们可以发现一个重要的事实:

即第\(l\)层的第\(j\)个节点的\(\delta^{(l)}_{j}\)可以通过第\(l+1\)层的\(k\)个\(\delta^{(l+1)}_{k}\)来表示。

如果假设本问题中的Neural Network只有一个输出节点,而我们已知:

$$\delta^{(L)}_{1} = -2 (y_n – s^{(L)}_{1})$$

然后,我们正向逐层计算\(x^{(l)}_{i}\),然后反向逐层计算所有\(\delta^{(l)}_{j}\),然后根据\(x^{(l)}_{i}\)与\(\delta^{(l)}_{j}\)更新梯度,从而最小化所有\(w^{(l)}_{ij}\),从而达到最小化\(e_n\)的目的。

这种算法被称之为BackPropagation Algorithm(反向传播算法),它的基本步骤如下:

通常步骤1到3会分多次,分多批并行进行,这种方式我们称之为mini-batch:

Optimization and Regularization

对于Neural Network的\(E_{in}\):

$$E_{in}(w) = \frac{1}{N}\sum^{N}_{n=1} err(( tanh(\sum_{i} w^{(l)}_{ij}x_{n, j})), y_n)$$

但是遗憾的是,多数情况下,Neural Network模型对应的\(E_{in}\)很可能不是凸函数(non-convex),所以多数情况下,我们可能无法找到所有的全局最优\(w^{(l)}_{jk}\),所以更多的情况我们可能会使用GD/SGD通过BackPropagation得到局部的最优。

通常情况下,不同的\(w^{(l)}_{jk}\)初始值决定了最后的局部最优解:

在下一节,我们将会介绍一种被称之为auto-encoder的方法,用于初始化\(w^{(l)}_{jk}\)。

接下来我们从VC Dimension的角度考察一下Neural Network,Neural Network的\(d_{vc} = O(V · D)\),其中\(V\)是神经元的数量,而\(D\)是各个神经元的权重。

我们可以看出,通过合理控制\(V\),我们可以得到Model Complexity与\(E_{in}和\)latex E_{out}$分别都在容忍范围的结果。

那么如何做Regularization呢?

一个基础的选择即是使用Weight-Decay L2的Regularizer:

$$\Omega(w) = \sum(w^{(l)}_{ij})^2$$

但是L2 Regularizer通常情况下带来的解释稠密的,为了避免这个问题,在Neural Network问题中一个更流行的Weight-Elimination Regularizer具有如下形式:

$$\sum \frac{(w^{(l)}_{jk})^2}{1+(w^{(l)}_{jk})^2}$$

这样的Regularizer具有L2 Regularizer的特性,同时等比缩放了每一个权重,一定程度避免了局部存在的较大权重带来的Overfitting。

同时,Early Stopping也是在Neural Network中常用的Regularization方法。

Early Stopping顾名思义即是提早停止,即在使用GD/SGD训练Neural Network时按适当的时机多次停止,并使用Validation验证Neural Network,并分别考察数次停止训练出的\(NNet(x)\),从而起到Regularization的效果。

为什么这样做可以起到Regularization呢?因为VC Dimension:

在机器学习基石的课程中我们曾有过结论,适当的\(d_{vc}\)通常是我们的最佳选择,而不是\(E_{in}=0\)的\(d_{vc}\)。

以上是对Neural Network在台湾大学机器学习技法课程的笔记总结。

在下一篇文章中,将会讨论Deep Learning。