原文地址:How To Improve Deep Learning Performance by Jason Brownlee
原文翻译:王昱森([email protected])
翻译与校对:寒小阳([email protected])
时间:2016年9月。
出处:http://blog.csdn.net/han_xiaoyang/article/details/52654879
声明:版权所有,转载请联系作者并注明出
20个你可以用来避免过拟合和得到更好的泛化的技巧
我经常被问到诸如如何从深度学习模型中得到更好的效果
的问题,类似的问题还有:
- 我如何提升准确度
- 如果我的神经网络模型性能不佳,我能够做什么?
对于这些问题,我经常这样回答,“我并不知道确切的答案,但是我有很多思路”,接着我会列出了我所能想到的所有或许能够给性能带来提升的思路,。
为避免一次次罗列出这样一个简单的列表,我决定把所有想法详细写在这篇博客里。
这些思路应该是通用的,不仅能在深度学习领域帮助你,还能适用于任何机器学习算法。
这篇博文略长,你可以将其加入书签(之后再看)。
如何提升深度学习性能
照片来源:Pedro Ribeiro Simões
提升算法性能的思路
这个列表里提到的思路并完全,但是一个好的开始。
我的目的是给出很多可以尝试的思路,希望其中的一或两个你之前没有想到。你经常只需要一个好的想法就能得到性能提升。
如果你能从其中一个思路中得到结果,请在评论区告诉我。我很高兴能得知这些好消息。
如果你有更多的想法,或者是所列思路的拓展,也请告诉我,我和其他读者都将受益!有时候仅仅是一个想法或许就能使他人得到突破。
我将此博文分为四个部分:
1. 通过数据提升性能
2. 通过算法提升性能
3. 通过算法调参提升性能
4. 通过嵌套模型提升性能
通常来讲,随着列表自上而下,性能的提升也将变小。例如,对问题进行新的架构或者获取更多的数据,通常比调整最优算法的参数能带来更好的效果。虽然并不总是这样,但是通常来讲是的。
我已经把相应的链接加入了博客的教程中,相应网站的问题中,以及经典的Neural Net FAQ中。
部分思路只适用于人工神经网络,但是大部分是通用的。通用到足够你用来配合其他技术来碰撞出提升模型性能的方法。
OK,现在让我们开始吧。
1. 通过数据提升性能
对你的训练数据和问题定义进行适当改变,你能得到很大的性能提升。或许是最大的性能提升。
以下是我将要提到的思路:
- 获取更多数据
- 创造更多数据
- 重放缩你的数据
- 转换你的数据
- 特征选取
- 重架构你的问题
1) 获取更多数据
你能获取更多训练数据吗?
你的模型的质量通常受到你的训练数据质量的限制。为了得到最好的模型,你首先应该想办法获得最好的数据。你也想尽可能多的获得那些最好的数据。
有更多的数据,深度学习和其他现代的非线性机器学习技术有更全的学习源,能学得更好,深度学习尤为如此。这也是机器学习对大家充满吸引力的很大一个原因(世界到处都是数据)。如下图所示:
为什么选择深度学习?
图片由Andrew Ng提供,版权所有
更多的数据并不是总是有用,但是确实有帮助。于我而言,如果可以,我会选择获取更多的数据
可以参见以下相关阅读:
2) 创造更多数据
上一小节说到了有了更多数据,深度学习算法通常会变的更好。有些时候你可能无法合理地获取更多数据,那你可以试试创造更多数据。
- 如果你的数据是数值型向量,可以随机构造已有向量的修改版本。
- 如果你的数据是图片,可以随机构造已有图片的修改版本(平移、截取、旋转等)。
- 如果你的数据是文本,类似的操作……
这通常被称作数据扩增(data augmentation)或者数据生成(data generation)。
你可以利用一个生成模型。你也可以用一些简单的技巧。例如,针对图片数据,你可以通过随机地平移或旋转已有图片获取性能的提升。如果新数据中包含了这种转换,则提升了模型的泛化能力。
这也与增加噪声是相关的,我们习惯称之为增加扰动。它起到了与正则化方法类似的作用,即抑制训练数据的过拟合。
以下是相关阅读:
3) 重缩放(rescale)你的数据
这是一个快速获得性能提升的方法。
当应用神经网络时,一个传统的经验法则是:重缩放(rescale)你的数据至激活函数的边界。
如果你在使用sigmoid激活函数,重缩放你的数据到0和1的区间里。如果你在使用双曲正切(tanh)激活函数,重缩放数据到-1和1的区间里。
这种方法可以被应用到输入数据(x)和输出数据(y)。例如,如果你在输出层使用sigmoid函数去预测二元分类的结果,应当标准化y值,使之成为二元的。如果你在使用softmax函数,你依旧可以通过标准化y值来获益。
这依旧是一个好的经验法则,但是我想更深入一点。我建议你可以参考下述方法来创造一些训练数据的不同的版本:
- 归一化到0和1的区间。
- 重放缩到-1和1的区间
- 标准化(译者注:标准化数据使之成为零均值,单位标准差)
然后对每一种方法,评估你的模型的性能,选取最好的进行使用。如果你改变了你的激活函数,重复这一过程。
在神经网络中,大的数值累积效应(叠加叠乘)并不是好事,除上述方法之外,还有其他的方法来控制你的神经网络中数据的数值大小,譬如归一化激活函数和权重,我们会在以后讨论这些技术。
以下为相关阅读: