机器学习系列(10)_如何提高深度学习(和机器学习)的性能

原文地址: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. 获取更多数据
  2. 创造更多数据
  3. 重放缩你的数据
  4. 转换你的数据
  5. 特征选取
  6. 重架构你的问题
1) 获取更多数据

你能获取更多训练数据吗?
你的模型的质量通常受到你的训练数据质量的限制。为了得到最好的模型,你首先应该想办法获得最好的数据。你也想尽可能多的获得那些最好的数据

有更多的数据,深度学习和其他现代的非线性机器学习技术有更全的学习源,能学得更好,深度学习尤为如此。这也是机器学习对大家充满吸引力的很大一个原因(世界到处都是数据)。如下图所示:



为什么选择深度学习?
图片由Andrew Ng提供,版权所有

更多的数据并不是总是有用,但是确实有帮助。于我而言,如果可以,我会选择获取更多的数据

可以参见以下相关阅读

Datasets Over Algorithms

2) 创造更多数据

上一小节说到了有了更多数据,深度学习算法通常会变的更好。有些时候你可能无法合理地获取更多数据,那你可以试试创造更多数据。

  • 如果你的数据是数值型向量,可以随机构造已有向量的修改版本。
  • 如果你的数据是图片,可以随机构造已有图片的修改版本(平移、截取、旋转等)。
  • 如果你的数据是文本,类似的操作……

这通常被称作数据扩增(data augmentation)或者数据生成(data generation)。

你可以利用一个生成模型。你也可以用一些简单的技巧。例如,针对图片数据,你可以通过随机地平移或旋转已有图片获取性能的提升。如果新数据中包含了这种转换,则提升了模型的泛化能力。

这也与增加噪声是相关的,我们习惯称之为增加扰动。它起到了与正则化方法类似的作用,即抑制训练数据的过拟合。

以下是相关阅读:

3) 重缩放(rescale)你的数据

这是一个快速获得性能提升的方法。
当应用神经网络时,一个传统的经验法则是:重缩放(rescale)你的数据至激活函数的边界。

如果你在使用sigmoid激活函数,重缩放你的数据到0和1的区间里。如果你在使用双曲正切(tanh)激活函数,重缩放数据到-1和1的区间里。

这种方法可以被应用到输入数据(x)和输出数据(y)。例如,如果你在输出层使用sigmoid函数去预测二元分类的结果,应当标准化y值,使之成为二元的。如果你在使用softmax函数,你依旧可以通过标准化y值来获益。

这依旧是一个好的经验法则,但是我想更深入一点。我建议你可以参考下述方法来创造一些训练数据的不同的版本:

  • 归一化到0和1的区间。
  • 重放缩到-1和1的区间
  • 标准化(译者注:标准化数据使之成为零均值,单位标准差)

然后对每一种方法,评估你的模型的性能,选取最好的进行使用。如果你改变了你的激活函数,重复这一过程。

在神经网络中,大的数值累积效应(叠加叠乘)并不是好事,除上述方法之外,还有其他的方法来控制你的神经网络中数据的数值大小,譬如归一化激活函数和权重,我们会在以后讨论这些技术。

以下为相关阅读:

  • 24
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值