深度学习性能提升的诀窍vip.docx
《深度学习性能提升的诀窍vip.docx》由会员分享,可在线阅读,更多相关《深度学习性能提升的诀窍vip.docx(12页珍藏版)》请在冰豆网上搜索。
深度学习性能提升的诀窍vip
深度学习性能提升的诀窍
PedroRibeiroSimoes拍摄
原文:
HowToImproveDeepLearningPerformance
作者:
JasonBrownlee
标题:
深度学习数据扩展方法
你是如何提升深度学习模型的效果?
这是我经常被问到的一个问题。
有时候也会换一种问法:
我该如何提高模型的准确率呢?
……或者反过来问:
如果我的网络模型效果不好,我该怎么办?
通常我的回答是“具体原因我不清楚,但我有一些想法可以试试”。
然后我会列举一些我认为能够提升性能的方法。
为了避免重复罗列这些内容,我打算在本文中把它们都写出来。
这些想法不仅可以用于深度学习,事实上可以用在任何机器学习的算法上。
那么如何提升深度学习的性能?
提升算法性能的想法
这个列表并不完整,却是很好的出发点。
我的目的是给大家抛出一些想法供大家尝试,或许有那么一两个有效的方法。
往往只需要尝试一个想法就能得到提升。
我把这个列表划分为四块:
·从数据上提升性能
·从算法上提升性能
·从算法调优上提升性能
·从模型融合上提升性能
性能提升的力度按上表的顺序从上到下依次递减。
举个例子,新的建模方法或者更多的数据带来的效果提升往往好于调出最优的参数。
但这并不是绝对的,只是大多数情况下如此。
我在文章中添加了不少博客教程和相关的经典神经网络问题。
其中有一些想法只是针对人工神经网络,但大多数想法都是通用性的。
你可以将它们与其它技术结合起来使用。
我们开始吧。
1.从数据上提升性能
调整训练数据或是问题的抽象定义方法可能会带来巨大的效果改善。
甚至是最显著的改善。
下面是概览:
1.收集更多的数据
2.产生更多的数据
3.对数据做缩放
4.对数据做变换
5.特征选择
6.重新定义问题
1)收集更多的数据
你还能收集到更多的训练数据吗?
你的模型的质量往往取决于你的训练数据的质量。
你需要确保使用的数据是针对问题最有效的数据。
你还希望数据尽可能多。
深度学习和其它现代的非线性机器学习模型在大数据集上的效果更好,尤其是深度学习。
这也是深度学习方法令人兴奋的主要原因之一。
请看下面的图片:
幻灯片来自AndrewNg
什么是深度学习?
不总是数据阅读效果越好,多数情况下如此。
如果让我选择,我会选择要更多的数据。
相关阅读:
数据集压倒算法
2)产生更多的数据
深度学习算法往往在数据量大的时候效果好。
我们在上一节已经提到过这一点。
如果由于某些原因你得不到更多的数据,也可以制造一些数据。
·如果你的数据是数值型的向量,那么随机生成已有向量的变形向量。
·如果你的数据是图像,用已有的图像随机生成相似图像。
·如果你的数据是文本,做法你懂得……
这类做法通常被称为数据扩展或是数据生成。
你可以使用生成模型,也可以用一些简单的小技巧。
举个例子,若是用图像数据,简单地随机选择和平移已有的图像就能取得很大的提升。
它能提升模型的泛化能力,如果新的数据中包含这类变换就能得到很好的处理。
有时候是往数据中增加噪声,这相当于是一种规则方法,避免过拟合训练数据。
相关阅读:
1)深度学习中的图像数据扩充 2)训练含有噪声的数据
3)对数据做缩放
此方法简单有效。
使用神经网络模型的一条经验法宝就是:
将数据缩放到激活函数的阈值范围。
如果你使用sigmoid激活函数,将数据缩放到0~1之间。
如果选用tanh激活函数,将值域控制在-1~1之间。
输入、输出数据都经过同样的变换。
比如,如果在输出层有一个sigmoid函数将输出值转换为二值数据,则将输出的y归一化为二进制。
如果选用的是softmax函数,对y进行归一化还是有效的。
我还建议你将训练数据扩展生成多个不同的版本:
·归一化到0~1
·归一化到-1~1
·标准化
然后在每个数据集上测试模型的性能,选用最好的一组生成数据。
如果更换了激活函数,最好重复做一次这个小实验。
在模型中不适合计算大的数值。
此外,还有许多其它方法来压缩模型中的数据,比如对权重和激活值做归一化,我会在后面介绍这些技巧。
相关阅读:
1)我需要对输入数据(列向量)做标准化吗?
2)如何用Scikit-Learn准备机器学习的输入数据
4)对数据做变换
与上一节的方法相关,但是需要更多的工作量。
你必须真正了解所用到的数据。
数据可视化,然后挑出异常值。
先猜测每一列数据的分布
·这一列数据是不是倾斜的高斯分布,若是如此,尝试用Box-Cox方法纠正倾斜
·这一列数据是不是指数分布,若是如此,则进行对数变换
·这一列数据是不是存在某些特性,但是难以直观地发现,尝试一下对数据平方或者开方
·是否可以将特征离散化,以便更好地强调一些特征
凭你的直觉,尝试几种方法
·是否可以用投影的方法对数据预处理,比如PCA?
·是否可以将多个属性合并为单个值?
·是否可以发掘某个新的属性,用布尔值表示?
·是否可以在时间尺度或是其它维度上有些新发现?
神经网络有特征学习的功能,它们能够完成这些事情。
不过你若是可以将问题的结构更好地呈现出来,网络模型学习的速度就会更快。
在训练集上快速尝试各种变换方法,看看哪些方法有些,而哪些不起作用。
相关阅读:
1)如何定义你的机器学习问题 2)特征挖掘工程,如何构造特征以及如何提升 3)如何用Scikit-Learn准备机器学习的输入数据
∙图像平移。
这种方法可以使得网络学习到平移不变的特征。
∙图像旋转。
学习旋转不变的特征。
有些任务里,目标可能有多种不同的姿态,旋转正好可以弥补样本中姿态较少的问题。
∙图像镜像。
和旋转的功能类似。
∙图像亮度变化。
甚至可以用直方图均衡化。
∙裁剪。
∙缩放。
∙图像模糊。
用不同的模板卷积产生模糊图像。
5)特征选择
神经网络受不相关数据的影响很小。
它们会对此赋予一个趋近于0的权重,几乎忽略此特征对预测值的贡献。
你是否可以移除训练数据的某些属性呢?
我们有许多的特征选择方法和特征重要性方法来鉴别哪些特征可以保留,哪些特征需要移除。
动手试一试,试一试所有的方法。
如果你的时间充裕,我还是建议在相同的神经网络模型上选择尝试多个方法,看看它们的效果分别如何。
·也许用更少的特征也能得到同样的、甚至更好的效果。
·也许所有的特征选择方法都选择抛弃同一部分特征属性。
那么就真应该好好审视这些无用的特征。
·也许选出的这部分特征给你带来了新的启发,构建出更多的新特征。
相关阅读:
1)特征选择入门介绍 2)基于Python的机器学习中的特征选择问题
6)问题重构
在回到你问题的定义上来。
你所收集到的这些观测数据是描述问题的唯一途径吗?
也许还有其它的途径。
也许其它途径能更清晰地将问题的结构暴露出来。
我自己非常喜欢这种练习,因为它强迫我们拓宽思路。
很难做好。
尤其是当你已经投入大量的时间、精力、金钱在现有的方法上。
即使你列举了3~5种不同的方式,至少你对最后所选用的方式有充足的信心。
·也许你可以将时间元素融入到一个窗口之中。
·也许你的分类问题可以转化为回归问题,反之亦然。
也许可以把二值类型的输出转化为softmax的输出
·也许你可以对子问题建模。
深入思考问题是一个好习惯,最好在选择工具下手之前先完成上述步骤,以减少无效的精力投入。
无论如何,如果你正束手无策,这个简单的连续能让你思如泉涌。
另外,你也不必抛弃前期的大量工作,详情可以参见后面的章节。
相关阅读:
1)如何定义机器学习问题
2.从算法上提升性能
机器学习总是与算法相关。
所有的理论和数学知识都在描述从数据中学习决策过程的不同方法(如果我们这里仅讨论预测模型)。
你选用深度学习来求解,它是不是最合适的技术呢?
在这一节中,我们会简单地聊一下算法的选择,后续内容会具体介绍如何提升深度学习的效果。
下面是概览:
1.算法的筛选
2.从文献中学习
3.重采样的方法
我们一条条展开。
1)算法的筛选
你事先不可能知道哪种算法对你的问题效果最好。
如果你已经知道,你可能也就不需要机器学习了。
你有哪些证据可以证明现在已经采用的方法是最佳选择呢?
我们来想想这个难题。
当在所有可能出现的问题上进行效果评测时,没有哪一项单独的算法效果会好于其它算法。
所有的算法都是平等的。
这就是天下没有免费的午餐理论的要点。
也许你选择的算法并不是最适合你的问题。
现在,我们不指望解决所有的问题,但当前的热门算法也许并不适合你的数据集。
我的建议是先收集证据,先假设有其它的合适算法适用于你的问题。
筛选一些常用的算法,挑出其中适用的几个。
·尝试一些线性算法,比如逻辑回归和线性判别分析
·尝试一些树模型,比如CART、随机森林和梯度提升
·尝试SVM和kNN等算法
·尝试其它的神经网络模型,比如LVQ、MLP、CNN、LSTM等等
采纳效果较好的几种方法,然后精细调解参数和数据来进一步提升效果。
将你所选用的深度学习方法与上述这些方法比较,看看是否能击败他们?
也许你可以放弃深度学习模型转而选择更简单模型,训练的速度也会更快,而且模型易于理解。
相关阅读:
1)一种数据驱动的机器学习方法 2)面对机器学习问题为何需要筛选算法 3)用scikit-learn筛选机器学习的分类算法
2)从文献中学习
从文献中“窃取”思路是一条捷径。
其它人是否已经做过和你类似的问题,他们使用的是什么方法。
阅读论文、书籍、问答网站、教程以及Google给你提供的一切信息。
记下所有的思路,然后沿着这些方向继续探索。
这并不是重复研究,这是帮助你发现新的思路。
优先选择已经发表的论文
已经有许许多多的聪明人写下了很多有意思的事情。
利用好这宝贵的资源吧。
相关阅读:
1)如何研究一种机器学习算法 2)Google学术
3)重采样的方法
你必须明白自己模型的效果如何。
你估计的模型效果是否可靠呢?
深度学习模型的训练速度很慢。
·这就意味着我们不能用标准的黄金法则来评判模型的效果,比如k折交叉验证。
·也许你只是简单地把数据分为训练集和测试集。
如果是这样,就需要保证切分后的数据分布保持不变。
单变量统计和数据可视化是不错的方法。
·也许你们可以扩展硬件来提升效果。
举个例子,如果你有一个集群或是AWS的账号,我们可以并行训练n个模型,然后选用它们的均值和方差来获取更稳定的效果。
·也许你可以选择一部分数据做交叉验证(对于earlystopping非常有效)。
·也许你可以完全独立地保留一部分数据用于模型的验证。
另一方面,也可以让数据集变得更小,采用更强的重采样方法。
·也许你会看到在采样后的数据集上训练得到的模型效果与在全体数据集上训练得到的效果有很强的相关性。
那么,你就可以用小数据集进行模型的选择,然后把最终选定的方法应用于全体数据集上。
·也许你可以任意限制数据集的规模,采样一部分数据,用它们完成所有的训练任务。
你必须对模型效果的预测有十足的把握。
相关阅读:
1)用Keras评估深度学习模型的效果 2)用重采样的方法评估机器学习算法的效果
3.从算法调优上提升性能
你通过算法筛选往往总能找出一到两个效果不错的算法。
但想要达到这些算法的最佳状态需要耗费数日、数周甚至数月。
下面是一些想法,在调参时能有助于提升算法的性能。
1)模型可诊断性
2)权重的初始化
3)学习率
4)激活函数
5)网络结构
6)batch和epoch
7)正则项
8)优化目标
9)提早结束训练
你可能需要指定参数来多次(3-10次甚至更多)训练模型,以得到预计效果最好的一组参数。
对每个参数都要不断的尝试。
有一篇关于超参数最优化的优质博客:
如何用Keras网格搜索深度学习模型的超参数
1)可诊断性
只有知道为何模型的性能不再有提升了,才能达到最好的效果。
是因为模型过拟合呢,还是欠拟合呢?
千万牢记这个问题。
千万。
模型总是处于这两