机器学习技法 Lecture12: Neural Network
Motivation
首先用图示看一下对多个感知机模型进行aggregation之后得到的模型的样子:
每个g都对应了一个感知机函数,然后再通过加权求和再将它们aggregation起来。而这样的函数可以你和什么样的边界呢?
首先来看布尔运算对应的情况,假如有两个线性感知机
g
1
g_{1}
g1和
g
2
g_{2}
g2,它们本身的分类情况以及它们与运算之后结果如图:
我们发现aggregation之后的感知机可以很轻松的拟合and运算,对应系数如下:
而且对应的或运算和非运算也可以做到。这样aggregation之后得到的函数有很强大的拟合能力,甚至可以拟合一个圆形区域:
回忆当初讲解VC维的时候讲过凸集合的设定时,模型的VC维是无穷大的。而aggregation的感知机却可以拟合它,具有够强的拟合能力。
但是这样的函数却有一个很致命的缺陷,就是它居然无法拟合异或操作XOR。
这是个被证明的结论。那么既然aggregation形式的感知机模型无法拟合XOR,那么如何才能做到呢?
我们想到,既然XOR这种操作无法拟合是因为非线性可分的原因,那么是不是多进行一些数据的转换就可以做到?比如用多层的感知机,把XOR操作分解成and和or。
结果发现这样确实可以。
实际上这个多层感知机与人类神经元工作原理很像,但又不完全相同。
Neural Network Hypothesis
我们发现多层感知机的输出实际上就是一个多层线性模型的输出,而对于线性模型的使用并没有限制,因此我们学过的线性模型都有可能用上:
在感知机中我们发现,得到了线性分数s之后还进行了一步取符号的操作sign,这相当于是对数据进行了一次变换。我们仔细考虑这个变换使用的操作,发现假如是像linear regression一样做线性变换,那么整个多层感知机模型就还是线性的,那就和单层的效果一样了。而使用sign函数的话结果是离散的,会遇到优化上的难题。
而我们一般选择使用tanh作为这个变换操作,它更容易被优化计算,而且更接近神经元的效果。实际上tanh和我们之前学过的sigmoid函数也有简单的对应关系。
因此我们就得到了最终的神经网络的结构与计算过程:
首先输入x作为第0层,然后使用系数w得到分数s,对分数s进行transformation操作。transformation操作的结果作为下一层的输入,重复这个过程。直到第L层最后一层为止。最后一层transformation是个线性操作,因此这个网络可以用来做回归。
其中系数
w
i
j
(
l
)
w_{ij}^{(l)}
wij(l)的下标代表了其作用于第i层与第j层之间,对应的是第l个神经元。
这么做的物理解释可能在于,在计算的过程中,与系数W的方向相符的x能够得到比较大的结果。因此可能能够判断输入x是否具有某种pattern。这样神经网络就能够提取出x中存在的pattern。
Neural Network Learning
但是神经网络中模型如何更新权重呢?
学习权重w的目标是最小化错误
E
i
n
E_{in}
Ein,虽然每一层都是对感知机模型进行aggregation得到的结果,但是使用boosting进行一个个确定参数的方法行不通。因此可以直接进行梯度下降方法。
根据链式法则,我们写出每一层系数对应的梯度:
我们发现还需要计算一个中间变量
δ
\delta
δ的值,而这个值需要前一层中的s来以及后一层的
δ
\delta
δ来计算:
也就是说只要有了每一层的s值,那么对应的梯度只需要从后往前进行计算即可得到结果。
于是我们就有了backpropogation算法:
Optimization and Regularization
虽然我们使用了梯度下降方法来进行优化参数从而进行学习,但是实际上这个方法只能保证在凸函数中收敛到全局最优。而多层感知机的神经网络函数一般而言都是非凸函数。这也就意味着使用backprop算法无法收敛到全局最优而只能得到局部最优。
实际因为存在多个局部最优,因此系数的初始化可能会影响最终收敛到的位置。而且比较大的系数可能会带来saturate的问题,导致梯度更新变得很慢。一般来说初始化都是用随机的较小的值。
大致来说,神经网络模型的VD维是神经元个数与参数个数的乘积。
这样来说,神经网络模型的拟合能力一般都比较强,但是也会带来容易过拟合的问题。
为了防止神经网络过拟合,也有几种常见的方式。比如加正则项。
一般而言为了得到比较小的系数就使用L2正则,为了得到稀疏的参数从而减小VC维就使用L1正则。但是L2正则对不同大小的参数shrink的程度不同,而L1正则不利于优化。于是又有一种weight-elimination的正则,它能够让不同的系数减小同样大小,从而得到稀疏的系数。
还有一个简单的正则方式就是early stopping。这样做的原理在于,更新的次数越多,我们尝试的系数的组合数量就越多,也就是实际利用的VC维越大,于是更有可能导致过拟合。而较早停止训练就能够避免这种情况。而且以前讲过的
E
i
n
E_{in}
Ein与
E
o
u
t
E_{out}
Eout同VC维的关系图也显示了这一点。
而判断何时停止训练的方式就是通过交叉验证的方法。