GY123456 发表于 2019-1-21 17:32:37

如何快速提高机器学习模型的性能

前言
本篇文章主要介绍,如何针对机器学习模型的在训练集和开发集(验证集)上的评估指标来使用不同的技巧快速提高模型的评估性能。针对机器学习模型的性能优化我们有很多种方式,如增大数据集、增大模型的复杂度、使用更复杂的模型架构、修改激活函数、正则化等,面对不同情况只有选择正确的方法才能有效提高模型的性能,否则可能会造成时间的浪费,从而影响项目的开发进度。本篇文章的主要内容来至于deeplearning.ai视频教程。
注:由于编辑器实在不太好排版,如果大家对格式要求比较高,建议去看我的博客:https://blog.csdn.net/sinat_29957455/article/details/83932296

相关概念介绍
贝叶斯最优误差(Bayes optimal error):有时候也被称为贝叶斯误差,是指x映射到y的理论最优函数,永远也不可能被超越。
可避免偏差(aviodable bias):是指贝叶斯误差与训练误差之间的差值。

优化策略
为什么是人类表现?
我们经常看到很多新闻说,某个模型在图像识别、语音识别的表现水平已经超越人类,为什么大家都喜欢用模型与人类的表现水平做比较呢?主要有两个原因,第一是因为随着机器学习的发展,模型也越来越复杂,算法的表现也越来越好,在很多机器学习的应用领域可以发现算法的表现已经威胁到人类了。第二是我们使用算法构造系统的最终目的是为了代替人类的工作,让机器能够代替人类工作,所以拿算法和人类的表现比也就很正常了。

http://image.100badou.com/image/20181110233016490190.png
上图展示的是机器学习模型准确率时间的变化的表现,其中蓝色水平虚线表示的是人类的水平,绿色虚线表示的是贝叶斯最优误差即理论上模型能达到的最优表现。在模型的训练过程中我们发现,在模型开始训练阶段,要提升模型的准确率是比较容易的,而且提升的速度也是比较快的,当模型的性能接近或超过人类表现的时候,模型的性能就难以提升,而且提升速度也是比较慢的。
机器学习模型到后期提升速度变慢主要有两个原因,第一,在很多任务中如图像识别、语音识别等领域这些都是人类非常擅长的,所以人类的表现水平已经与贝叶斯的最优误差相当接近了,所以当超过人的表现之后模型性能也没有多大的提升空间了。第二,当模型的性能在人类水平以下的时候很多的技巧都非常有效,所以提升速度会比较快,当超过人类水平以后,这些技巧都不适用了从而导致模型的性能的提升速度变慢。

当模型表现水平低于人类的时候,通常有以下三种优化方式
增大数据集,给模型提供更多的数据
人工分析误差,当算法的表现比人类低的时候,就可以让人来观察模型标记错的,分析这些错误的例子为什么人的判断是正确的而机器是错误的。
分析模型的偏差和方差通过与人类的表现做比较来选择优化策略

前面介绍了,通过分析模型的偏差和方差可以用来提升模型的性能,这里我们介绍什么时候应该优化偏差什么时候应该优化方差,在这里我们用人类水平误差来估计贝叶斯误差。
http://image.100badou.com/image/20181110233123867575.png
上图展示的是一个在一个猫狗分类的系统中,人类的误差是1%,而系统在训练集上的误差是8%,在开发集(验证集)上的误差是10%。通过上面的数据可以发现我们的系统与人类水平还存在7%(可避免偏差)的差距,而训练集与开发集(验证集)只有2%(方差)的差距。可以发现,系统在可避免偏差上还存在较大的提升空间,说明模型在训练集上还没能很好的拟合,这时候应该考虑使用更复杂的模型,或者让模型在训练集上使用梯度下降在多迭代一段时间试试。如果系统中人类的误差不是1%而是7.5%,此时我们又该如何优化呢?有时候可能是因为图片本身就比较模糊,而导致人类水平的误差是7.5%。通过计算发现,可避免偏差只有0.5%,而方差有2%。这时候我们发现,模型在方差上还有较大的提升空间,应该考虑是正则化等手段来减少系统的误差。你可能一直想提升模型在训练集上的表现,直到系统在训练集上的表现接近贝叶斯误差甚至超过,理论上是不可能超过贝叶斯误差,除非你的模型过拟合。在本例中,从模型的提升空间考虑,我们应该先考虑减少模型的方差。人类水平误差通过人类水平误差来估计贝叶斯误差,从而来选择我们的优化策略中,那么我们究竟应该如何定义人类水平误差?
http://image.100badou.com/image/20181110233132826293.png
根据放射性图片来判断患者的病例,普通人类的错误率是3%,普通医生的错误率是1%,而经验丰富的医生错误率只有0.7%,对于一个优秀的医生团队而言,当他们打成共识时错误率只有0.5%。那么此时我们应该如何定义人类水平误差呢?在定义人类水平误差的时候,我们应该考虑的是,我们是想利用人类水平误差来估计贝叶斯误差。因为我们不知道,在这个行业中是否还存在经验更丰富的医生或者团队,也许他们的误差比0.5%还要低,所以贝叶斯最优误差不会高于0.5%。所以在这里,我们可以选择0.5%的误差作为贝叶斯最优误差,也就是人类水平误差。有时候也许我们根本不需要把目标定的这么高,对于商用水平可能达到普通医生的水平就可以了,对于不同的场景可以选择不同的人类误差水平。
建议
最后提供一些常用减少可避免偏差和方差的方法。
减少可避免偏差:使用规模更大的模型、使用更好的算法(RMSprop、Momentum、adam)、训练的更久、寻找更好的架构、寻找更好的参数、改变激活函数、改变隐藏层数等。
减少方差:增加更多的数据、正则化(L2、dropout)、数据增强、尝试不同的网络架构等。
了解更多干货文章,可以关注小程序八斗问答
页: [1]
查看完整版本: 如何快速提高机器学习模型的性能