雷锋网(公众号:雷锋网)按:本文做者 qqfly,上海交通大学机器人所博士生,本科毕业于清华大学机械工程系,主要研究方向机器视觉与运动规划,会写一些好玩的内容在微信公众号:Nao(ID:qRobotics)。本文整理自知乎回答:机器学习中用来防止过拟合的方法有哪些?html
给《机器视觉与应用》课程出大做业的时候,正好涉及到这方面内容,因此简单整理了一下(参考 Hinton 的课程)。按照以前的套路写:算法
是什么数据库
过拟合(overfitting)是指在模型参数拟合过程当中的问题,因为训练数据包含抽样偏差,训练时,复杂的模型将抽样偏差也考虑在内,将抽样偏差也进行了很好的拟合。微信
具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。网络
为何dom
为何要解决过拟合现象?这是由于咱们拟合的模型通常是用来预测未知的结果(不在训练集内),过拟合虽然在训练集上效果好,可是在实际使用时(测试集)效果差。同时,在不少问题上,咱们没法穷尽全部状态,不可能将全部状况都包含在训练集上。因此,必需要解决过拟合问题。iphone
为何在机器学习中比较常见?这是由于机器学习算法为了知足尽量复杂的任务,其模型的拟合能力通常远远高于问题复杂度,也就是说,机器学习算法有「拟合出正确规则的前提下,进一步拟合噪声」的能力。机器学习
而传统的函数拟合问题(如机器人系统辨识),通常都是经过经验、物理、数学等推导出一个含参模型,模型复杂度肯定了,只须要调整个别参数便可。模型「无多余能力」拟合噪声。函数
怎么样性能
既然过拟合这么讨厌,咱们应该怎么防止过拟合呢?最近深度学习比较火,我就以神经网络为例吧:
1. 获取更多数据
这是解决过拟合最有效的方法,只要给足够多的数据,让模型「看见」尽量多的「例外状况」,它就会不断修正本身,从而获得更好的结果:
如何获取更多数据,能够有如下几个方法:
从数据源头获取更多数据:这个是容易想到的,例如物体分类,我就再多拍几张照片好了;可是,在不少状况下,大幅增长数据自己就不容易;另外,咱们不清楚获取多少数据才算够;
根据当前数据集估计数据分布参数,使用该分布产生更多数据:这个通常不用,由于估计分布参数的过程也会代入抽样偏差。
数据加强(Data Augmentation):经过必定规则扩充数据。如在物体分类问题里,物体在图像中的位置、姿态、尺度,总体图片明暗度等都不会影响分类结果。咱们就能够经过图像平移、翻转、缩放、切割等手段将数据库成倍扩充;
2. 使用合适的模型
前面说了,过拟合主要是有两个缘由形成的:数据太少 + 模型太复杂。因此,咱们能够经过使用合适复杂度的模型来防止过拟合问题,让其足够拟合真正的规则,同时又不至于拟合太多抽样偏差。
(PS:若是能经过物理、数学建模,肯定模型复杂度,这是最好的方法,这也就是为何深度学习这么火的如今,我还坚持说初学者要学掌握传统的建模方法。)
对于神经网络而言,咱们能够从如下四个方面来限制网络能力:
2.1 网络结构 Architecture
这个很好理解,减小网络的层数、神经元个数等都可以限制网络的拟合能力;
2.2 训练时间 Early stopping
对于每一个神经元而言,其激活函数在不一样区间的性能是不一样的:
当网络权值较小时,神经元的激活函数工做在线性区,此时神经元的拟合能力较弱(相似线性神经元)。
有了上述共识以后,咱们就能够解释为何限制训练时间(early stopping)有用:由于咱们在初始化网络的时候通常都是初始为较小的权值。训练时间越长,部分网络权值可能越大。若是咱们在合适时间中止训练,就能够将网络的能力限制在必定范围内。
2.3 限制权值 Weight-decay,也叫正则化(regularization)
原理同上,可是这类方法直接将权值的大小加入到 Cost 里,在训练的时候限制权值变大。以 L2 regularization 为例:
训练过程须要下降总体的 Cost,这时候,一方面能下降实际输出与样本之间的偏差C0,也能下降权值大小。
2.4 增长噪声 Noise
给网络加噪声也有不少方法:
2.4.1 在输入中加噪声:
噪声会随着网络传播,按照权值的平方放大,并传播到输出层,对偏差 Cost 产生影响。推导直接看 Hinton 的 PPT 吧:
在输入中加高斯噪声,会在输出中生成的干扰项。训练时,减少偏差,同时也会对噪声产生的干扰项进行惩罚,达到减少权值的平方的目的,达到与 L2 regularization 相似的效果(对比公式)。
2.4.2 在权值上加噪声
在初始化网络的时候,用 0 均值的高斯分布做为初始化。Alex Graves 的手写识别 RNN 就是用了这个方法
Graves, Alex, et al. "A novel connectionist system for unconstrained handwriting recognition." IEEE transactions on pattern analysis and machine intelligence 31.5 (2009): 855-868.
- It may work better, especially in recurrent networks (Hinton)
2.4.3 对网络的响应加噪声
如在前向传播过程当中,让默写神经元的输出变为 binary 或 random。显然,这种有点乱来的作法会打乱网络的训练过程,让训练更慢,但据 Hinton 说,在测试集上效果会有显著提高 (But it does significantly better on the test set!)。
3. 结合多种模型
简而言之,训练多个模型,以每一个模型的平均输出做为结果。
从 N 个模型里随机选择一个做为输出的指望偏差,会比全部模型的平均输出的偏差
大(我不知道公式里的圆括号为何显示不了):
大概基于这个原理,就能够有不少方法了:
3.1 Bagging
简单理解,就是分段函数的概念:用不一样的模型拟合不一样部分的训练集。以随机森林(Rand Forests)为例,就是训练了一堆互不关联的决策树。但因为训练神经网络自己就须要耗费较多自由,因此通常不单独使用神经网络作 Bagging。
3.2 Boosting
既然训练复杂神经网络比较慢,那咱们就能够只使用简单的神经网络(层数、神经元数限制等)。经过训练一系列简单的神经网络,加权平均其输出。
3.3 Dropout
这是一个很高效的方法。
在训练时,每次随机(如 50% 几率)忽略隐层的某些节点;这样,咱们至关于随机从 2^H 个模型中采样选择模型;同时,因为每一个网络只见过一个训练数据(每次都是随机的新网络),因此相似 bagging 的作法,这就是我为何将它分类到「结合多种模型」中;
此外,而不一样模型之间权值共享(共同使用这 H 个神经元的链接权值),至关于一种权值正则方法,实际效果比 L2 regularization 更好。
4. 贝叶斯方法
这部分我尚未想好怎么才能讲得清楚,为了避免误导初学者,我就先空着,之后若是想清楚了再更新。固然,这也是防止过拟合的一类重要方法。
综上:
“TensorFlow & 神经网络算法高级应用班”开课了!
ThoughtWorks大牛教你玩转TensorFlow !
课程连接:http://www.leiphone.com/special/custom/mooc04.html
雷锋网版权文章,未经受权禁止转载。详情见转载须知。