本文是周志华老师《机器学习》第五章神经网络的学习笔记。  

首先什么是神经网络,最广泛的一种定义是:

神经网络是由具有适应性的简单单元组成的广泛并行连接的网络,它的组织能够模拟生物神经网络系统对真实世界物体所作出的交互反应。

其中,神经网络最基本的成分是神经元模型(neuron)。在生物神经网络中,当神经元内的电位超过某个阈值,则会被激活,兴奋起来向其他神经元发送化学物质。
最早将这一神经元模型抽象起来的是1943年提出的M-P神经元,该神经元将接受$n$个来自其他神经元的信号,并将其带权组合并与阈值比较,并通过激活函数处理。(关于激活函数可以看这里的介绍

感知机与多层网络

感知机(Perceptron)由两层神经元组成,输出层为M-P神经元,形式化地表示为:$y=f(\sum_iw_ix_i-\theta)$。

其中的权重$w$通过“奖罚”策略来学习得到,具体由下式可得:

可以看出,当预测正确时,权重不变,当错误时,则根据错误程度进行修正。 事实上,只要数据是线性可分的,感知机就能在有限步中收敛。同时,不同的随机初始化权值可能会导致不同的解,也就是说感知机算法并不是单值的。
同时,需要注意的是,感知机算法不仅是一个学习模型,还是一种参数估计 的方法,即它和梯度下降,牛顿法的作用类似(Richard.O.Duda的模式分类就把这几者排在一起)。

但是感知机算法无法处理线性不可分的情况,最广为人知的一个例子就是感知机算法无法解决异或问题。为了解决这个问题,需要使用多层功能神经元,即在之前输入层和输出层之间加入一层或多层神经元,这中间的神经元被称为隐层(hidden layer)。当神经元之间不存在同层的连接,并且不存在跨层连接时,该神经网络被称为多层前馈神经网络(multi-layer feedforward neural networks),如下图所示:

误差逆传播算法

误差逆传播算法,又称反向传播算法(BackPropagation,BP算法)是用来训练多层神经网络的算法中最成功也最通用的。
给定训练集$D={(x,y)….}$,其中输入$x$有$d$个属性而输出$y$有$l$个属性。假设我们这里是一个简单的双层网络,中间隐层有$q$个神经元。
那么我们需要学习的参数有四种:

  1. 输出层第$j$个神经元的阈值$\theta_j$
  2. 隐层的第$h$个神经元阈值$\gamma_h$
  3. 输入层第$i$个神经元到隐层第$h$个神经元的权重$v_{ih}$
  4. 隐层第$h$个神经元到输出层第$j$个神经元的权重$w_{hj}$

下图更形象的展示了这些变量的关系:

我们这里以sigmoid函数$f$为例作为激活函数,输出则为:

那么在$(x,y)$样本上均方误差为:

这里BP使用迭代算法,更新参数的方法类似于多层感知机,并且基于梯度下降策略,参数的调整以目标的负梯度为方向,以参数$w_{hj}$为例:

通过链式法则,我们有:

接着按项求导,最后容易得出更新公式:

其中:

其他参数的更新公式也同理,就不赘述,最终BP算法的整个过程如下图:

研究证明,只需要一个包含足够多神经元的隐层,多层反馈网络就能以任意精度逼近任意复杂度的连续函数,但是隐层神经元个数的设置至今仍是一门玄学,只能试错调整。由于BP的强大表达能力,神经网络往往遭遇过拟合,有以下两种策略可以缓解这种过拟合:

  • 早停 (early stopping),即将数据分为训练集和验证集,当验证集误差不再降低时就停止训练
  • 正则化 (regularization),即在误差目标函数中加入一个用以描述网络复杂度的部分,例如常用的L2正则项会将误差目标函数改变为:

其中,后一项即为正则项,这样能够适当减少权重的值减轻过拟合。$\lambda$用来对经验误差和网络复杂度进行折中,常用交叉验证来估计。

常见神经网络

RBF网络

RBF(Radial Basis Function,径向基函数)网络使用RBF作为隐层的激活函数,假设输入为$\mathbf{x}$,则似乎用高斯核的RBF网络可以表示为:

其中$\mathbf{c_i},w_i$分别表示第$i$个隐层所对应的中心和权重。
通常训练分为两步:

  1. 通过随机采样/聚类等方法确定神经元中心$\mathbf{c_i}$
  2. 通过BP算法确定其他参数

直观上理解,这里RBF的神经元的激活条件和离中心点的距离有关,数据点离中心点的距离越近越容易被激活。如此,通过预设神经元中心$\mathbf{c_i}$,可以方便地引入一些领域知识。例如,在98年LeCun那篇CNN的论文中,为了解决数字手写识别中相似字符的问题(例如数字零和字母O),在最后一层就引入了RBF层。

ART网络

竞争型学习(competitive learning)是一个常用的无监督学习策略。使用该策略时,网络的输出神经元相互竞争,并且每一个时刻只有一个获胜神经元被激活,其他神经元都被抑制,这种机制也叫“胜者通吃(winner-take-all)”。

ART网络是其中的代表,这里介绍一下其中的竞争方法。识别层神经元所对应的向量会和输入向量进行距离的计算,距离最小的取胜;接着获胜的神经元将向其他神经元发送信号抑制其激活。

SOM网络

SOM(Self-Organizing Map,自组织映射)是一种竞争学习的无监督网络。它是一种竞争学习型的无监督神经网络,它能将高维输入映射到低维空间,同时保持数据在高维空间的拓扑结构,即高维空间中相似的样本点映射到网络输出层中的临近神经元。
从推断方面来看,对于输入,网络在输出层会确定一个获胜神经元,该神经元的权值向量和输入结合决定了输入向量的低维表示。那么SOM的训练中,我们就需要找到每个输出层神经元的权向量。
训练上,在接收到训练样本后,每个输出层神经元会计算自身权向量和样本的距离,距离最近的神经元获胜称作最佳匹配单元,然后最近匹配单及其邻近神经元的权向量会被调整,使这些权向量和当前输入样本的距离缩小。这个过程会不断迭代直到收敛。

级联相关网络

一般的神经网络都是固定好网络结构的,但是有一类神经网络希望将网络结构也作为学习的目标,称作结构自适应网络。级联相关网络是其中的代表。

级联: 指建立层次连接的层级结构。训练中,新的隐层神经元被加入。当新的隐层神经元加入时,他们的权值是被冻住的。
相关: 指通过最大化新神经元的输出和网络误差之间的相关性来训练相关参数。

级联相关网络不同设置网络层数和隐层神经元个数,而且训练速度快,但是数据较小时容易陷入过拟合。

Elman网络

和之前的前馈神经网络不同,有一类网络允许出现环形结构,又称作循环神经网络(recursive neural network)。Elman是其中的代表。

Boltzmann机

NN中有一类模型为网络状态定义一个能量,能量最小化时网络达到理想状态。网络的训练就是在最小化这个能量函数。

Boltzmann机就是其中的代表:

如上图所示,神经元被分为隐层和显层,显层是数据的输入输出,隐层则是数据的内在表示。该模型中所有神经元都是布尔值,1-激活,0-抑制。令向量$s\in{0,1}^n$表示n个神经元的状态,$w_{ij}$表示两个神经元之间的连接权值,$\theta$表示神经元的阈值,则状态向量$s$表示的Boltzmann机的能量则定义为:

直观来看,这种能量即为网络中所有激活的边(边的两个顶点神经元均被激活)的权值和加上激活神经元的阈值和,然后取负。
当网络最终达到Boltzmann分布(亦称平衡分布),此时状态向量出现的概率将有其能量和所有可能状态向量的能量确定:

上式也叫做Boltzmann’s law。

训练上,Boltzmann机的训练过程就是将每个训练样本是做一个状态向量,并使其出现的概率尽可能大。标准的Boltzmann机是一个全连接的图,但是这样复杂度会极高,因此,实际中常常采用受限Boltzmann机(Restricted Boltzmann Machine, RBM),即仅保留显层和隐层之间的连接,从而将Boltzman机结构简化为一个二部图。 RBM常常采用对比散度(Contrastive Divergence, CD)算法来训练。

深度学习

随着大数据时代到来,我们可以使用的数据增加了,因此为了提高模型的容量,深度学习开始兴起。其中深度神经网络是其典型代表,但是当层数加深,训练时往往会无法收敛。
无监督逐层训练是解决该问题的有效方法,训练将被分为预训练(pre-training)和微调(fine-tuning)。
权值共享是另一种常用手段,其在卷积神经网络(Convolutional Neural Network,CNN)中有重要的作用。

习题及参考答案

1. 试述将线性函数$f(x)=w^Tx$用作神经元激活函数的缺陷。

首先我们回想激活函数的功效是将神经元的输出值做进一步处理以区分出激活和抑制两种状态。
那么线性函数显然是能够做出这种区分的,而且还有这连续光滑的优点,其缺陷在于:

  • 变化范围太大(激活函数最早也叫挤压函数,即将输出至映射到一个可控的范围)
  • 抑制部分没有起到很好的抑制作用,即使神经元被抑制了,更新时,它的梯度仍然是和被激活的神经元一样,只不过更新的方向不同。
  • 没有引入非线性,也是最大的缺陷。很容易理解,题目中的$x$,在神经元本身的计算部分通常也是做一个线性运算,两个线性运算叠加,其实可以视作为一个线性运算,因此当数据中存在非线性时,仅使用线性函数作为激活函数无异于缘木求鱼了。

更多关于激活函数的讨论参见激活函数二三事

2. 试述使用图5.2(b)激活函数(sigmoid函数)的神经元与对率回归的联系。

使用sigmoid激活函数的单层神经网络在做二分类时等价于对率回归。

3. 对于图5.7中的$v_{ih}$,试推导出BP算法中的更新公式。

4. 试述学习率的取值对神经网络训练的影响。

学习率是神经网络中最重要的超参数,其设置颇有讲究。一般来说,更大的学习率会收敛得更快,但是容易出现震荡而无法收敛,更小的学习率需要模型更多次的迭代。更多讨论可以参考这里

5. 试编程实现标准BP算法和累计BP算法,在西瓜数据集3.0上分别用这两个算法训练一个单隐层网络,并进行比较。

单层网络实现见这里, 比较代码及结果见这里

在同样的超参数设置下,将标准BP算法和累计BP算法在西瓜数据集上同样运行25次,取收敛轮数的平均值。
标准BP算法需要 10732.64 epoch收敛,耗时23.81秒。
累计BP算法需要 10164.28 epoch收敛,耗时2.51秒。

可以看出,二者收敛需要的epoch轮次差不多,但是累计BP耗时会少很多。这是因为标准BP每过一个样本就会更新一次,因此每轮epoch需要更新M(M为样本数)次,而累计BP则只更新一次。而且标准BP一轮epoch的更新中还有可能出现相互抵消。

但是当M非常大时,标准BP可能就比累计BP高效了,因为累计BP需要计算完整个数据集的梯度才会更新一次。
另一种常见的做法是设一个中间值,例如每100个样本更新一次参数,这些样本称之为mini-batch,个数称之为batch size。

6. 试设计一个BP改进算法,能通过动态调整学习率显著提升收敛速度,编程实现该算法,并选择两个UCI数据集与标准BP算法进行实验比较。
可以参考这里AdagradAdadelta算法。

7. 根据5.18式和5.19式,试构造一个能解决异或问题的单层RBF神经网络。

传统单层神经网络不能解决线性不可分的异或问题,但是RBF网络本身就是非线性的,因此单层RBF网络也可以解决异或问题。

举例而言,我们令单隐层神经元个数为2,选择$c_1=(0,1)$,$c_2=(0,1)$,权值$w_1=w_2=1$,$\beta_1=\beta_2=-1$。
那么可以算出,对于(0,1)和(1,0),$\varphi(x)=1+e^2\approx 8.39$,而对于(0,0)和(1,1),$\varphi(x)=2e\approx 5.45$,那么我们去一个介于二者之间的值作为阈值(例如7),既可以将它们分开从而解决异或问题了。

8. 从网上下载或者自己编程实现SOM网络,并观察其在西瓜数据集3.0a上产生的结果。
略略略。

9. 试推导用于Elman网络的BP算法。
略略略。

10. 从网上下载或自己变成实现一个卷积神经网络,并在手写字符识别数据MNIST上进行实验测试。
略略略。