机器学习基石
- 1 -- The Learning Problem
- 2 -- Learning to Answer Yes/No
- 3 -- Types of Learning
- 4 -- Feasibility of Learning
- 5 -- Training versus Testing
- 6 -- Theory of Generalization
- 7 -- The VC Dimension
- 8 -- Noise and Error
- 9 -- Linear Regression
- 10 -- Logistic Regression
- 11 -- Linear Models for Classification
- 12 -- Nonlinear Transformation
- 13 -- Hazard of Overfitting
- 14 -- Regularization
- 15 -- Validation
- 16 -- Three Learning Principles
机器学习技法
- 1 -- Linear Support Vector Machine
- 2 -- Dual Support Vector Machine
- 3 -- Kernel Support Vector Machine
- 4 -- Soft-Margin Support Vector Machine
- 5 -- Kernel Logistic Regression
- 6 -- Support Vector Regression
- 7 -- Blending and Bagging
- 8 -- Adaptive Boosting
- 9 -- Decision Tree
- 10 -- Random Forest
- 11 -- Gradient Boosted Decision Tree
- 12 -- Neural Network
- 13 -- Deep Learning
- 14 -- Radial Basis Function Network
- 15 -- Matrix Factorization
- 16(完结) -- Finale
12 -- Neural Network
红色石头的个人网站: redstonewill.com
上节课我们主要介绍了 Gradient Boosted Decision Tree。GBDT 通过使用 functional gradient 的方法得到一棵一棵不同的树,然后再使用 steepest descent 的方式给予每棵树不同的权重,最后可以用来处理任何而定 error measure。上节课介绍的 GBDT 是以 regression 为例进行介绍的,使用的是 squared error measure。本节课讲介绍一种出现时间较早,但当下又非常火的一种机器算法模型,就是神经网络(Neural Network)。
Motivation
在之前的机器学习基石课程中,我们就接触过 Perceptron 模型了,例如 PLA 算法。Perceptron 就是在矩外面加上一个 sign 函数,取值为{-1,+1}。现在,如果把许多 perceptrons 线性组合起来,得到的模型 G 就如下图所示:
将左边的输入与 T 个不同的权重相乘(每个是 d+1 维的),得到 T 个不同的 perceptrons 为。最后,每个给予不同的权重,线性组合得到 G。G 也是一个 perceptron 模型。
从结构上来说,上面这个模型包含了两层的权重,分别是和。同时也包含了两层的 sign 函数,分别是和 G。那么这样一个由许多感知机 linear aggregation 的模型能实现什么样的 boundary 呢?
举个简单的例子,如下图所示,和分别是平面上两个 perceptrons。其中,红色表示-1,蓝色表示+1。这两个 perceptrons 线性组合可能得到下图右侧的模型,这表示的是和进行与(AND)的操作,蓝色区域表示+1。
如何通过感知机模型来实现上述的逻辑操作呢?一种方法是令第二层中的。这样,G(x) 就可表示为:
和的取值是{-1,+1},当时,G(x)=0;当时,G(x)=0;当时,G(x)=0;当时,G(x)=1。感知机模型如下所示:
这个例子说明了一些简单的线性边界,如上面的和,在经过一层感知机模型,经线性组合后,可以得到一些非线性的复杂边界(AND 运算)G(x)。
除此之外,或(OR)运算和非(NOT)运算都可以由感知机建立相应的模型,非常简单。
所以说,linear aggregation of perceptrons 实际上是非常 powerful 的模型同时也是非常 complicated 模型。再看下面一个例子,如果二维平面上有个圆形区域,圆内表示+1,圆外表示-1。这样复杂的圆形边界是没有办法使用单一 perceptron 来解决的。如果使用 8 个 perceptrons,用刚才的方法线性组合起来,能够得到一个很接近圆形的边界(八边形)。如果使用 16 个 perceptrons,那么得到的边界更接近圆形(十六边形)。因此,使用的 perceptrons 越多,就能得到各种任意的 convex set,即凸多边形边界。之前我们在机器学习基石中介绍过,convex set 的 VC Dimension 趋向于无穷大()。这表示只要 perceptrons 够多,我们能得到任意可能的情况,可能的模型。但是,这样的坏处是模型复杂度可能会变得很大,从而造成过拟合(overfitting)。
总的来说,足够数目的 perceptrons 线性组合能够得到比较平滑的边界和稳定的模型,这也是 aggregation 的特点之一。
但是,也有单层 perceptrons 线性组合做不到的事情。例如刚才我们将的 AND、OR、NOT 三种逻辑运算都可以由单层 perceptrons 做到,而如果是异或(XOR)操作,就没有办法只用单层 perceptrons 实现。这是因为 XOR 得到的是非线性可分的区域,如下图所示,没有办法由和线性组合实现。所以说 linear aggregation of perceptrons 模型的复杂度还是有限制的。
那么,为了实现 XOR 操作,可以使用多层 perceptrons,也就是说一次 transform 不行,我们就用多层的 transform,这其实就是 Basic Neural Network 的基本原型。下面我们就尝试使用两层 perceptrons 来实现 XOR 的操作。
首先,根据布尔运算,异或 XOR 操作可以拆分成:
这种拆分实际上就包含了两层 transform。第一层仅有 AND 操作,第二层是 OR 操作。这种两层的感知机模型如下所示:
这样,从 AND 操作到 XOR 操作,从简单的 aggregation of perceptrons 到 multi-layer perceptrons,感知机层数在增加,模型的复杂度也在增加,使最后得到的 G 能更容易解决一些非线性的复杂问题。这就是基本神经网络的基本模型。
顺便提一下,这里所说的感知机模型实际上就是在模仿人类的神经元模型(这就是 Neural Network 名称的由来)。感知机模型每个节点的输入就对应神经元的树突 dendrite,感知机每个节点的输出就对应神经元的轴突 axon。
Neural Network Hypothesis
上一部分我们介绍的这种感知机模型其实就是 Neural Network。输入部分经过一层一层的运算,相当于一层一层的 transform,最后通过最后一层的权重,得到一个分数 score。即在 OUTPUT 层,输出的就是一个线性模型。得到 s 后,下一步再进行处理。
我们之前已经介绍过三种线性模型:linear classification,linear regression,logistic regression。那么,对于 OUTPUT 层的分数 s,根据具体问题,可以选择最合适的线性模型。如果是 binary classification 问题,可以选择 linear classification 模型;如果是 linear regression 问题,可以选择 linear regression 模型;如果是 soft classification 问题,则可以选择 logistic regression 模型。本节课接下来将以 linear regression 为例,选择 squared error 来进行衡量。
上面讲的是 OUTPUT 层,对于中间层,每个节点对应一个 perceptron,都有一个 transform 运算。上文我们已经介绍过的 transformation function 是阶梯函数 sign()。那除了 sign() 函数外,有没有其他的 transformation function 呢?
如果每个节点的 transformation function 都是线性运算(跟 OUTPUT 端一样),那么由每个节点的线性模型组合成的神经网络模型也必然是线性的。这跟直接使用一个线性模型在效果上并没有什么差异,模型能力不强,反而花费了更多不必要的力气。所以一般来说,中间节点不会选择线性模型。
如果每个节点的 transformation function 都是阶梯函数(即 sign() 函数)。这是一个非线性模型,但是由于阶梯函数是离散的,并不是处处可导,所以在优化计算时比较难处理。所以,一般也不选择阶梯函数作为 transformation function。
既然线性函数和阶梯函数都不太适合作为 transformation function,那么最常用的一种 transformation function 就是 tanh(s),其表达式如下:
tanh(s) 函数是一个平滑函数,类似“s”型。当|s|比较大的时候,tanh(s) 与阶梯函数相近;当|s|比较小的时候,tanh(s) 与线性函数比较接近。从数学上来说,由于处处连续可导,便于最优化计算。而且形状上类似阶梯函数,具有非线性的性质,可以得到比较复杂强大的模型。
顺便提一下,tanh(x) 函数与 sigmoid 函数存在下列关系:
其中,
那么,接下来我们就使用 tanh 函数作为神经网络中间层的 transformation function,所有的数学推导也基于此。实际应用中,可以选择其它的 transformation function,不同的 transformation function,则有不同的推导过程。
下面我们将仔细来看看 Neural Network Hypothesis 的结构。如下图所示,该神经网络左边是输入层,中间两层是隐藏层,右边是输出层。整体上来说,我们设定输入层为第 0 层,然后往右分别是第一层、第二层,输出层即为第 3 层。
Neural Network Hypothesis 中,分别表示神经网络的第几层,其中 L 为总层数。例如上图所示的是 3 层神经网络,L=3。我们先来看看每一层的权重,上标 l 满足,表示是位于哪一层。下标 i 满足,表示前一层输出的个数加上 bias 项(常数项)。下标 j 满足,表示该层节点的个数(不包括 bias 项)。
对于每层的分数 score,它的表达式为:
对于每层的 transformation function,它的表达式为:
因为是 regression 模型,所以在输出层(l=L)直接得到。
介绍完 Neural Network Hypothesis 的结构之后,我们来研究下这种算法结构到底有什么实际的物理意义。还是看上面的神经网络结构图,每一层输入到输出的运算过程,实际上都是一种 transformation,而转换的关键在于每个权重值。每层网络利用输入 x 和权重 w 的乘积,在经过 tanh 函数,得到该层的输出,从左到右,一层一层地进行。其中,很明显,x 和 w 的乘积越大,那么 tanh(wx) 就会越接近 1,表明这种 transformation 效果越好。再想一下,w 和 x 是两个向量,乘积越大,表明两个向量内积越大,越接近平行,则表明 w 和 x 有模式上的相似性。从而,更进一步说明了如果每一层的输入向量 x 和权重向量 w 具有模式上的相似性,比较接近平行,那么 transformation 的效果就比较好,就能得到表现良好的神经网络模型。也就是说,神经网络训练的核心就是 pattern extraction,即从数据中找到数据本身蕴含的模式和规律。通过一层一层找到这些模式,找到与输入向量 x 最契合的权重向量 w,最后再由 G 输出结果。
Neural Network Learning
我们已经介绍了 Neural Network Hypothesis 的结构和算法流程。确定网络结构其实就是确定各层的权重值。那如何根据已有的样本数据,找到最佳的权重使 error 最小化呢?下面我们将详细推导。
首先,我们的目标是找到最佳的让最小化。如果只有一层隐藏层,就相当于是 aggregation of perceptrons。可以使用我们上节课介绍的 gradient boosting 算法来一个一个确定隐藏层每个神经元的权重,输入层到隐藏层的权重可以通过 C&RT 算法计算的到。这不是神经网络常用的算法。如果隐藏层个数有两个或者更多,那么 aggregation of perceptrons 的方法就行不通了。就要考虑使用其它方法。
根据 error function 的思想,从输出层来看,我们可以得到每个样本神经网络预测值与实际值之间的 squared error:,这是单个样本点的 error。那么,我们只要能建立与每个权重的函数关系,就可以利用 GD 或 SGD 算法对求偏微分,不断迭代优化值,最终得到使最小时对应的。
为了建立与各层权重的函数关系,求出对的偏导数,我们先来看输出层如何计算。与的函数关系为:
计算对的偏导数,得到:
以上是输出层求偏导的结果。如果是其它层,即,偏导计算可以写成如下形式:
上述推导中,令与第 l 层第 j 个神经元的分数的偏导数记为。即:
当时,;当时,是未知的,下面我们将进行运算推导,看看不同层之间的是否有递推关系。
如上图所示,第 l 层第 j 个神经元的分数经过 tanh 函数,得到该层输出,再与下一层权重相乘,得到第 l+1 层的分数,直到最后的输出层。
那么,利用上面到这样的递推关系,我们可以对偏导数做一些中间变量替换处理,得到如下表达式:
值得一提的是,上式中有个求和项,其中 k 表示下一层即 l+1 层神经元的个数。表明 l 层的与 l+1 层的所有都有关系。因为参与到每个的运算中了。
这样,我们得到了与的递推关系。也就是说如果知道了的值,就能推导出的值。而最后一层,即输出层的,那么就能一层一层往前推导,得到每一层的,从而可以计算出对各个的偏导数。计算完偏微分之后,就可以使用 GD 或 SGD 算法进行权重的迭代优化,最终得到最优解。
神经网络中,这种从后往前的推导方法称为 Backpropagation Algorithm,即我们常常听到的 BP 神经网络算法。它的算法流程如下所示:
上面采用的是 SGD 的方法,即每次迭代更新时只取一个点,这种做法一般不够稳定。所以通常会采用 mini-batch 的方法,即每次选取一些数据,例如,来进行训练,最后求平均值更新权重 w。这种做法的实际效果会比较好一些。
Optimization and Regularization
经过以上的分析和推导,我们知道神经网络优化的目标就是让最小化。本节课我们采用 error measure 是 squared error,当然也可以采用其它的错误衡量方式,只要在推导上做稍稍修改就可以了,此处不再赘述。
下面我们将主要分析神经网络的优化问题。由于神经网络由输入层、多个隐藏层、输出层构成,结构是比较复杂的非线性模型,因此可能有许多局部最小值,是 non-convex 的,找到全局最小值(globalminimum)就会困难许多。而我们使用 GD 或 SGD 算法得到的很可能就是局部最小值(local minimum)。
基于这个问题,不同的初始值权重通常会得到不同的 local minimum。也就是说最终的输出 G 与初始权重有很大的关系。在选取上有个技巧,就是通常选择比较小的值,而且最好是随机 random 选择。这是因为,如果权重很大,那么根据 tanh 函数,得到的值会分布在两侧比较平缓的位置(类似于饱和 saturation),这时候梯度很小,每次迭代权重可能只有微弱的变化,很难在全局上快速得到最优解。而随机选择的原因是通常对权重如何选择没有先验经验,只能通过 random,从普遍概率上选择初始值,随机性避免了人为因素的干预,可以说更有可能经过迭代优化得到全局最优解。
下面从理论上看一下神经网络模型的 VC Dimension。对于 tanh 这样的 transfer function,其对应的整个模型的复杂度。其中 V 是神经网络中神经元的个数(不包括 bias 点),D 表示所有权值的数量。所以,如果 V 足够大的时候,VC Dimension 也会非常大,这样神经网络可以训练出非常复杂的模型。但同时也可能会造成过拟合 overfitting。所以,神经网络中神经元的数量 V 不能太大。
为了防止神经网络过拟合,一个常用的方法就是使用 regularization。之前我们就介绍过可以在 error function 中加入一个 regularizer,例如熟悉的 L2 regularizer :
但是,使用 L2 regularizer 有一个缺点,就是它使每个权重进行等比例缩小(shrink)。也就是说大的权重缩小程度较大,小的权重缩小程度较小。这会带来一个问题,就是等比例缩小很难得到值为零的权重。而我们恰恰希望某些权重,即权重的解是松散(sparse)的。因为这样能有效减少 VC Dimension,从而减小模型复杂度,防止过拟合发生。
那么为了得到 sparse 解,有什么方法呢?我们之前就介绍过可以使用 L1 regularizer:,但是这种做法存在一个缺点,就是包含绝对值不容易微分。除此之外,另外一种比较常用的方法就是使用 weight-elimination regularizer。weight-elimination regularizer 类似于 L2 regularizer,只不过是在 L2 regularizer 上做了尺度的缩小,这样能使 large weight 和 small weight 都能得到同等程度的缩小,从而让更多权重最终为零。weight-elimination regularizer 的表达式如下:
除了 weight-elimination regularizer 之外,还有另外一个很有效的 regularization 的方法,就是 Early Stopping。简而言之,就是神经网络训练的次数 t 不能太多。因为,t 太大的时候,相当于给模型寻找最优值更多的可能性,模型更复杂,VC Dimension 增大,可能会 overfitting。而 t 不太大时,能有效减少 VC Dimension,降低模型复杂度,从而起到 regularization 的效果。和随训练次数 t 的关系如下图右下角所示:
那么,如何选择最佳的训练次数 t 呢?可以使用 validation 进行验证选择。
总结
本节课主要介绍了 Neural Network 模型。首先,我们通过使用一层甚至多层的 perceptrons 来获得更复杂的非线性模型。神经网络的每个神经元都相当于一个 Neural Network Hypothesis,训练的本质就是在每一层网络上进行 pattern extraction,找到最合适的权重,最终得到最佳的 G。本课程以 regression 模型为例,最终的 G 是线性模型,而中间各层均采用 tanh 函数作为 transform function。计算权重的方法就是采用 GD 或者 SGD,通过 Backpropagation 算法,不断更新优化权重值,最终使得最小化,即完成了整个神经网络的训练过程。最后,我们提到了神经网络的可以使用一些 regularization 来防止模型过拟合。这些方法包括随机选择较小的权重初始值,使用 weight-elimination regularizer 或者 early stopping 等。
注明:
文章中所有的图片均来自台湾大学林轩田《机器学习技法》课程
更多 AI 资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论