深度学习经验指南

简单和复杂的技巧,帮助你提升深度学习的模型准确率

作者:Christopher Dossman

编译:ronghuaiyang

深度学习经验指南

简单和复杂的技巧,帮助你提升深度学习的模型准确率

我从新入行和有经验的机器学习工程师中那里得到的最多的问题就是”我如何得到更高的准确率?“

既然机器学习在商业领域最有价值的地方就是在于它的预测能力,那么从现有的系统中压榨更高的准确率是一个简单的获取更多价值的方法。

这个指南会分4个不同的部分,每个部分介绍一些不同的策略。

  • 数据优化
  • 算法调试
  • 超参数优化
  • 集成,集成,集成

不是所有的这些都能提高性能,你会发现,当你对同样的问题使用更多的这些方法的时候,会有一个性能的极限。尝试了这些之后仍然没什么进展?那么你需要重新思考一下你的具体的使用场景的核心解决方案。这篇文章只是一个速查表,我会给你每个部分的具体的信息的链接。

数据优化

均衡你的数据集

如果你的问题是分类的话,一个最简单的方法来提升模型的能力就是将你的数据集变的均衡。通常情况下,现实世界中的数据集是不均衡的,如果你需要你的深度学习系统学到的是如何基于特征来分辨不同的类别,而不是基于分布来分辨不同的类别的话,你需要将你的数据集变的均衡。

常用的方法包括:

  • 将采用多数的类:你可以通过对多数类进行降采样来平衡数据集的分布。
  • 过采样少数的类:重复采样可以用来增加你的少数类的比例。

关于这个问题,这里有个很好的文章:http://amsantac.co/blog/en/2016/09/20/balanced-image-classification-r.html

更多数据

深度学习经验指南

我们应该很熟悉这个图。这个图显示了数据量和深度学习以及传统机器学习在能力上的关系。如果你想你的模型具有更好的能力,你需要更多的数据。这取决于你的预算,你可以构造更多的具有标签的数据,或者收集更多的没有标注的数据,然后训练你的特征提取子模型。

开源的标注软件

  • 图像:https://github.com/Labelbox/Labelbox
  • 音频:http://www.fon.hum.uva.nl/praat/
  • 视频:http://www.anvil-software.org/

生成更多的数据

一个往往被忽视的提高准确率的方法是从你已有的数据中生成新的数据。以照片为例,工程师们常常会对照片进行旋转,平移等操作。这些操作同样也减少了过拟合的风险。

关于造更多的数据的问题:https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced

算法调试

使用论文的原始的代码

你正在做的工作是不是有许多人正在研究呢?你很走运,因为上百个工程师可能已经考虑过如何来得到这个问题的最佳准确率了。读一读相关主题的论文,注意一下他们所使用的不同的方法和得到的结果。他们甚至有github的代码给你总到嘴边。

Google Scholar是一个很好的搜索引擎,他们有很多的工具来帮助你找到相关的研究。

算法抽查

不要太自以为是,不可能知道哪一个机器学习的算法在你的问题上是最佳的。每次我遇到新的问题,而且没有经过长时间的研究的话,我会看看目前能用的方法,一个一个的试,深度学习和传统机器学习的方法都会试。

做完实验后,对所有的结果排个序,得到最佳的那个算法。

数据驱动的机器学习算法选择:https://machinelearningmastery.com/a-data-driven-approach-to-machine-learning/

超参数的优化

学习率

Adam优化器算法久经考验。在深度学习上常常能得到很好的结果。即使是这样好的性能,也不免让你陷入到局部最下的问题中。那么有一个算法既能有Adam的优点,又能避免陷入局部最小,这个方法是热重启SGD:https://medium.com/38th-street-studios/exploring-stochastic-gradient-descent-with-restarts-sgdr-fa206c38a74e。

关于学习率的文章:https://towardsdatascience.com/estimating-optimal-learning-rate-for-a-deep-neural-network-ce32f2556ce0

深度学习经验指南

Batch size和epochs的数量

标准的程序时使用大的batch size和大的epochs数量,但是平常的策略给你的也是平常的结果。需要对你的batch size和训练epochs数量做一点实验。

提前停止

这是一个减少泛化误差的非常好的方法。继续训练也许会提升你的训练集的准确率,但是到了某个点之后,验证集上的准确率开始下降。为了提升对真实数据的能力,试试提前停止的策略。

提前停止:https://stats.stackexchange.com/questions/231061/how-to-use-early-stopping-properly-for-training-deep-neural-network

网络结构

如果你想尝试点好玩的,你可以试试https://github.com/carpedm20/ENAS-pytorch,这算法构建了一个通用的网络设计,在你的数据集上最大化准确率,比标准的神经网络搜索方法如cloud ML用的那种更加有效。

正则化

防止过拟合的一个鲁棒的方法是使用正则化。使用正则化有好几个不同的方法,如果你还没有试过的话,建议你在你的项目中试试。

  • Dropout:随机的让一定比例的神经元在训练的时候关闭。Dropout可以帮助防止过拟合。
  • L1和L2的权值惩罚:权值出现尺度爆炸的话,会影响准确率。其中一个对抗的方法是对所有的权值加上衰减。权值衰减让所有的权值越小越好,除非是遇到大的梯度。使用权值衰减常常可以提高性能,也对让模型变得容易解释。

集成, 集成, 集成

选择最好的模型来用是不是很难?你可以组合来自不同模型的输出,得到更好的准确率。对于每个算法,有两个步骤:

  • 在原始的数据的子集上产生一个简单的机器学习的分布。
  • 将这些分布组合成一个“集成”模型

模型组合(bagging)

在这个方法中,你训练几个不同的模型,在某些地方有些差别,使用同样的数据,对最终的结果取平均值作为输出。Bagging是减少模型偏差的很好的方法。你可认为是不同的人,具有不同的背景,对通用的问题提出了不同角度的看法。就像一个团队一样,是一个得到正确答案的有效的方法。

级联(stacking)

和bagging很类似,区别在于并没有一个经验的公式来组合最终的结果。你创建的是基于输入数据的元素级别的学习器,你自己选择如何为不同的模型的答案设置不同的权重来得到最终的结果。

还有问题

重新考虑你的问题

休息一会儿,喝杯茶。这个方案是重新重头思考你的问题。坐下来进行一些头脑风暴,可以帮助你解决一些问题。可以问问自己一些简单的问题:

  • 我的分类问题可以变成一个回归问题吗?或者反过来?
  • 可以将你的问题分解成更小的问题吗?
  • 你的二值输出可以变成一个softmax吗?或者反过来?
  • 你看待问题的方式是最有效的吗?

重新思考你的问题是最困难的一个方法,也常常是最能得到最好的结果的。可以和一些有经验的人聊聊,也许会给你一些新的思路。

英文原文:https://towardsdatascience.com/deep-learning-performance-cheat-sheet-21374b9c4f45

本文为专栏文章,来自:AI公园,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/66227.html 。

(0)
AI公园的头像AI公园专栏
上一篇 2019-09-11 00:47
下一篇 2019-09-11 12:29

相关文章

关注我们
关注我们
分享本页
返回顶部