原文: How To Improve Deep Learning Performance
作者: Jason Brownlee
翻译: KK4SBB
责编:何永灿,关注人工智能,投稿请联系heyc@csdn.net或微信号289416419
克服过拟合和提高泛化能力的20条技巧和诀窍
你是如何提升深度学习模型的效果?
这是我经常被问到的一个问题。
有时候也会换一种问法:
我该如何提高模型的准确率呢?
……或者反过来问:
如果我的网络模型效果不好,我该怎么办?
通常我的回答是“具体原因我不清楚,但我有一些想法可以试试”。
然后我会列举一些我认为能够提升性能的方法。
为了避免重复罗列这些内容,我打算在本文中把它们都写出来。
这些想法不仅可以用于深度学习,事实上可以用在任何机器学习的算法上。
如何提升深度学习的性能
Pedro Ribeiro Simoes拍摄
提升算法性能的想法
这个列表并不完整,却是很好的出发点。
我的目的是给大家抛出一些想法供大家尝试,或许有那么一两个有效的方法。
往往只需要尝试一个想法就能得到提升。
如果你用下面某一种想法取得了好效果,请在评论区给我留言!
如果你还有其它想法或是对这些想法有拓展,也请告诉大家,或许会对我们大家有帮助!
我把这个列表划分为四块:
- 从数据上提升性能
- 从算法上提升性能
- 从算法调优上提升性能
- 从模型融合上提升性能
性能提升的力度按上表的顺序从上到下依次递减。举个例子,新的建模方法或者更多的数据带来的效果提升往往好于调出最优的参数。但这并不是绝对的,只是大多数情况下如此。
我在文章中添加了不少博客教程和相关的经典神经网络问题。
其中有一些想法只是针对人工神经网络,但大多数想法都是通用性的。你可以将它们与其它技术结合起来使用。
我们开始吧。
1.从数据上提升性能
调整训练数据或是问题的抽象定义方法可能会带来巨大的效果改善。甚至是最显著的改善。
下面是概览:
- 收集更多的数据
- 产生更多的数据
- 对数据做缩放
- 对数据做变换
- 特征选择
- 重新定义问题
1)收集更多的数据
你还能收集到更多的训练数据吗?
你的模型的质量往往取决于你的训练数据的质量。你需要确保使用的数据是针对问题最有效的数据。
你还希望数据尽可能多。
深度学习和其它现代的非线性机器学习模型在大数据集上的效果更好,尤其是深度学习。这也是深度学习方法令人兴奋的主要原因之一。
请看下面的图片:
什么是深度学习?
幻灯片来自Andrew Ng
不总是数据阅读效果越好,多数情况下如此。如果让我选择,我会选择要更多的数据。
相关阅读:
2) 产生更多的数据
深度学习算法往往在数据量大的时候效果好。
我们在上一节已经提到过这一点。
如果由于某些原因你得不到更多的数据,也可以制造一些数据。
- 如果你的数据是数值型的向量,那么随机生成已有向量的变形向量。
- 如果你的数据是图像,用已有的图像随机生成相似图像。
- 如果你的数据是文本,做法你懂得……
这类做法通常被称为数据扩展或是数据生成。
你可以使用生成模型,也可以用一些简单的小技巧。
举个例子,若是用图像数据,简单地随机选择和平移已有的图像就能取得很大的提升。它能提升模型的泛化能力,如果新的数据中包含这类变换就能得到很好的处理。
有时候是往数据中增加噪声,这相当于是一种规则方法,避免过拟合训练数据。
相关阅读:
3) 对数据做缩放
此方法简单有效。
使用神经网络模型的一条经验法宝就是:
将数据缩放到激活函数的阈值范围。
如果你使用sigmoid激活函数,将数据缩放到0~1之间。如果选用tanh激活函数,将值域控制在-1~1之间。
输入、输出数据都经过同样的变换。比如,如果在输出层有一个sigmoid函数将输出值转换为二值数据,则将输出的y归一化为二进制。如果选用的是softmax函数,对y进行归一化还是有效的。
我还建议你将训练数据扩展生成多个不同的版本:
- 归一化到0 ~ 1
- 归一化到-1 ~ 1
- 标准化
然后在每个数据集上测试模型的性能,选用最好的一组生成数据。
如果更换了激活函数,最好重复做一次这个小实验。
在模型中不适合计算大的数值。此外,还有许多其它方法来压缩模型中的数据,比如对权重和激活值做归一化,我会在后面介绍这些技巧。
相关阅读: