为了得到一致假设而使假设变得过度复杂称为过拟合(overfitting),过拟合表现在训练好的模型在训练集上效果很好,但是在测试集上效果差。也就是说模型的泛化能力弱。在很多问题中,我们费心费力收集到的数据集并不能穷尽所有的状态,而且一般训练得到的模型被用来预测未知数据的结果,模型虽然在训练集上效果很好,但是在实际应用中效果差,就说明这个模型训练的并不是很成功,还需要改进。就譬如下方的图像中,左边黑色直线在一定程度拟合数据排列,而蓝紫色的曲线就是照顾到每一个样本点,曲线弯弯折折,属于过拟合;右边黑色的曲线就能把红蓝两种数据点进行很好的分类,过拟合的绿色虽然在此数据上能完美分开两类数据点,可是对于一个新的数据集,其适应能力远不如黑色的曲线。

过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施;然而必须认识到,过拟合是无法彻底避免的,我们所做的只是“缓解”,或者说减少其风险。那么如何解决过拟合?下面介绍几种方法。

1. 数据集扩增(Data Augmentation)

众所周知,更多的数据往往胜过一个更好的模型。就好比盲人摸象,不足够的数据让每个人对大象的认识都不同,学习太过片面。更多的数据能够让模型学习的更加全面,然而,在现实世界中,由于条件的限制,而不能够收集到更多的数据。所以,往往在这个时候,就需要采用一些计算的方式与策略在原有数据集上进行手脚,以获得更多的数据。数据集扩增就是要得到更多符合要求的数据。

在物体分类(object recognition)问题中,数据扩增已经成为一项特殊的有效的技术。物体在图像中的位置、姿态、尺度,整体图片敏感度等都不会影响分类结果,所以我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。或者在语音识别(speech recognition)中,加入噪音也被看做是一种数据扩增方式。

2. 改进模型

过拟合主要有两个原因造成的,数据太少和模型太复杂,数据扩增增加数据量,下面我们通过使用合适复杂度的模型来防止过拟合问题,让其能够学习到真正的规则。对于模型复杂,最简单暴力的做法就是减少网络的层数和神经元的个数,但是一般不是很提倡这种做法,是因为人为并不能很好掌控删减的程度,因此下面介绍几种高效的方法。

2.1 Early Stopping

如下图所示,在对模型训练的时候,模型在训练集上的训练误差(training error)随着时间会一直减少,然而模型在验证集上的验证误差会减少到一定程度后逐步上升,形成一个非对称的U型曲线。对模型进行训练的过程即是对模型的参数进行更新的过程,参数更新会用到一些优化算法,为了能够得到最低测试误差时的参数,Early Stopping的做法就是运行优化方法直到若干次在验证集上的验证误差没有提升时候停止。

一般做法是,在训练的过程中,记录到目前为止最好的验证正确率(validation accuracy),当连续10次Epoch,validation accuracy没有达到最佳Accuracy,则认为accuracy不再有所提升,此时就可以停止迭代了。

**2.2 正则化(regularization)**

损失函数分为经验风险损失函数和结构风险损失函数,结构风险损失函数就是经验损失函数+表示模型复杂度的正则化,正则项通常选择L1或者L2正则化。结构风险损失函数能够有效地防止过拟合。

  • L1正则化是指权值向量ω\omegaω中各个元素的绝对值之和,通常表示为∥ω∥1\left \| \omega \right \|_{1}∥ω∥1​,L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择,一定程度上,L1也可以抑制过拟合
  • L2化是指权值向量ω\omegaω中各个元素的平方和的平方,通常表示为∥ω∥2\left \| \omega \right \|_{2}∥ω∥2​,L2正则化可以防止模型过拟合

L1和L2正则化防止过拟合的原因

首先我们先明白稀疏参数和更小参数的好处。

  • 稀疏参数(L1):参数的稀疏,在一定程度实现了特征的选择。稀疏矩阵指有很多元素为0,少数参数为非零值。一般而言,只有少部分特征对模型有贡献,大部分特征对模型没有贡献或者贡献很小,稀疏参数的引入,使得一些特征对应的参数是0,所以就可以剔除可以将那些没有用的特征,从而实现特征选择。

  • 更小参数(L2):越复杂的模型,越是尝试对所有样本进行拟合,那么就会造成在较小的区间中产生较大的波动,这个较大的波动反映出在这个区间内的导数就越大。只有越大的参数才可能产生较大的导数。试想一下,参数大的模型,数据只要偏移一点点,就会对结果造成很大的影响,但是如果参数比较小,数据的偏移对结果的影响力就不会有什么影响,那么模型也就能够适应不同的数据集,也就是泛化能力强,所以一定程度上避免过拟合。

  1. L1L1L1正则化防止过拟合的原因
假设带有L1正则化的损失函数为:$J = J_{0} + \alpha \sum_{\omega }\left | \omega \right |$,当我们在$J_{0}$后添加$L1$正则化项时,相当于对$J_{0}$做了一个约束。此时我们的任务就变成在$L1$正则化约束下求出$J_{0}$取最小值的解。考虑二维的情况,在有两个权值$\omega _{1}$和$\omega _{2}$的情况下,此时$L1$为$\left | \omega _{1 }\right | + \left | \omega _{2 }\right |$,对于梯度下降方法,求解$J_{0}$的过程用等值线表示,如下图所示。黑色方形是$L1$正则化的图形,五彩斑斓的等值线是$J_{0}$的等值线。在图中,$J_{0}$等值线与黑色方形首次相交的地方就是最优解。因为黑色方形棱角分明(二维情况下四个,多维情况下更多),$J_{0}$与这些棱角接触的几率要远大于其他部位接触的概率,而在这些棱角上,会有很多权值为0,这就是为什么$L1$正则化可以产生稀疏模型,进而可以用于特征选择。


2. L2L2L2正则化防止过拟合的原因

假设带有L2L2L2正则化的损失函数为:J=J0+α∑ωω2J = J_{0} + \alpha \sum_{\omega }\omega ^{2}J=J0​+α∑ω​ω2,类似地,可以得到下图在二维平面上的图形。因为二维L2L2L2正则化函数是个圆,与L1L1L1的方形相比,圆滑了好多,因此J0J_{0}J0​和L2L2L2相交于棱角的几率比较小,而是更多权值取值更小。

2.3 Dropout
在神经网络中,Dropout方法通过修改隐藏层神经元的个数来防止网络的过拟合,也就是通过修改深度网络本身。对于下图中左边的神经网络,在训练过程中按照给定的概率随机删除一些隐藏层的神经元,同时保证输入层和输出层的神经元不变。便能得到左边的神经网络,从而简化复杂的网络。

在每一批次数据被训练时,Dropout按照给定的概率P随机剔除一些神经元,只有没有被剔除也就是被保留下来的神经元的参数被更新。每一批次数据,由于随机性剔除神经元,使得网络具有一定的稀疏性,从而能减轻了不同特征之间的协同效应。而且由于每次被剔除的神经元不同,所以整个网络神经元的参数也只是部分被更新,消除减弱了神经元间的联合适应性,增强了神经网络的泛化能力和鲁棒性。Dropout只在训练时使用,作为一个超参数,然而在测试集时,并不能使用

当前Dropout被广泛应用于全连接网络,而在卷积层,因为卷积层本身的稀疏性和ReLU激活函数的使用,Dropout在卷积隐藏层中使用较少。

Dropout可以解决过拟合的原因

(1)取平均的作用: 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

(2)减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

(3)Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

Dropout为什么需要进行缩放呢

因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px。因此测试的时候把这个神经元的权重乘以p可以得到同样的期望。

2.4 多任务学习
深度学习中两种多任务学习模式:隐层参数的硬共享和软共享

硬共享机制是指在所有任务中共享隐藏层,同时保留几个特定任务的输出层来实现。硬共享机制降低了过拟合的风险。多个任务同时学习,模型就越能捕捉到多个任务的同一表示,从而导致模型在原始任务上的过拟合风险越小。

软共享机制是指每个任务有自己的模型,自己的参数。模型参数之间的距离是正则化的,以便保障参数相似性。

缓解过拟合(overfitting)的方法相关推荐

  1. 如何防止过拟合(overfitting)

    为了得到一致假设而使假设变得过度复杂称为过拟合(overfitting),过拟合表现在训练好的模型在训练集上效果很好,但是在测试集上效果差.也就是说模型的泛化能力弱.在很多问题中,我们费心费力收集到的 ...

  2. 深度学习机器学习理论知识:范数、稀疏与过拟合合集(5)Dropout原理,操作实现,为什么可以缓解过拟合,使用中的技巧

    范数.稀疏与过拟合合集(1)范数的定义与常用范数介绍 范数.稀疏与过拟合合集(2)有监督模型下的过拟合与正则化加入后缓解过拟合的原理 范数.稀疏与过拟合合集(3)范数与稀疏化的原理.L0L1L2范数的 ...

  3. L2正则化缓解过拟合实例

    正则化(Regularization) 是机器学习中对原始损失函数引入额外信息,以便防止过拟合和提高模型泛化性能的一类方法的统称.也就是目标函数变成了原始损失函数+额外项,常用的额外项一般有两种,英文 ...

  4. 防止模型过拟合的必备方法!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Mahitha,来源:机器之心 正如巴菲特所言:「近似的正确好过精 ...

  5. 机器学习中防止过拟合的处理方法

    原文地址:一只鸟的天空,http://blog.csdn.net/heyongluoyao8/article/details/49429629 防止过拟合的处理方法 过拟合   我们都知道,在进行数据 ...

  6. 防止过拟合的处理方法

    原文地址:一只鸟的天空,http://blog.csdn.net/heyongluoyao8/article/details/49429629 防止过拟合的处理方法 过拟合   我们都知道,在进行数据 ...

  7. 机器学习(五)——缓解过拟合

    看图理解过拟合与欠拟合 欠拟合解决方法 增加输入特征项 增加网络参数 减少正则化参数 过拟合解决方法 数据清洗 增大训练集 采用正则化 增大正则化参数 案例 import tensorflow as ...

  8. 过拟合(overfitting)和欠拟合(underfitting)出现原因及如何避免方案

    文章目录 欠拟合 一.什么是欠拟合? 二.欠拟合出现原因 三.解决欠拟合(高偏差)的方法 过拟合 一.什么是过拟合? 二.过拟合出现原因 三.解决过拟合(高方差)的方法 欠拟合 一.什么是欠拟合? 欠 ...

  9. 【TensorFlow自学2】基础语句+激活函数+损失函数+正则化缓解过拟合+优化器(SGD、Adam等)

    2.1预备知识 tf.where()–条件语句真的话返回A,假的话返回B tf.where(条件语句,A(真-返回),B(假-返回)) import tensorflow as tfa=tf.cons ...

  10. 深度学习机器学习理论知识:范数、稀疏与过拟合合集(2)有监督模型下的过拟合与正则化加入后缓解过拟合的原理

    范数.稀疏与过拟合合集(1)范数的定义与常用范数介绍 范数.稀疏与过拟合合集(2)有监督模型下的过拟合与正则化加入后缓解过拟合的原理 范数.稀疏与过拟合合集(3)范数与稀疏化的原理.L0L1L2范数的 ...

最新文章

  1. 【深度学习理论】(4) 权重初始化,Batch Normalization
  2. linux c 进程间通信
  3. $$和$BASHPID区别
  4. MySQL数据库学习笔记(三)----基本的SQL语句
  5. RabbitMQ和Kafka的显著差异(3)
  6. JavaScript:Date 对象
  7. 2014-08-06 小代码,大道理
  8. 基于DEAP库的python进化算法--遗传算法实践--背包问题
  9. 为什么说 80% 的程序员都缺乏基本功?
  10. (转)密码学研究与区块链实践应该打破隔空喊话
  11. oracle月份相减函数,Oracle 日期函数的加减
  12. 微信公众号开发者模式入门
  13. python实现根据前序序列和中序序列求二叉树的后序序列
  14. Android动态更换图标
  15. 常用的20个js简洁代码
  16. ODM操作MongoDB
  17. 【问题记录】labelImg:一款实用图片标注工具的安装和使用
  18. 记一次Android第三方日历控件CalendarView的使用
  19. 详细指南!手把手教你上手Tableau软件!
  20. TCP、IP、链路层报文l结构

热门文章

  1. Kotlin 正则表达式
  2. 《京东话费充值系统架构演进实践》阅读笔记
  3. 谷粒商城 - 项目环境搭建
  4. windows配置本地的虚拟主机
  5. 生活随记 - 火星梦
  6. shiny导出html,将R Shiny页面导出为PDF
  7. java分数计算_分数计算java
  8. python表示倍数_倍数 python
  9. SMILES:化学结构的线性表示方法
  10. A Game of Thrones(105)