深度学习11个实用技巧
深度学习工程师George Seif发表了一篇博文,总结了7个深度学习的技巧,本文增加了几个技巧,总结了11个深度学习的技巧,主要从提高深度学习模型的准确性和速度两个角度来分析这些小技巧。在使用深度学习的时候,我们不能仅仅把它看成一个黑盒子,因为网络设计、训练过程、数据处理等很多步骤都需要精心的设计。作者分别介绍了7个非常实用小技巧:数据量、优化器选择、处理不平衡数据、迁移学习、数据增强、多个模型集成、加快剪枝。相信掌握了这7个技巧,能让你在实际工作中事半功倍!
深度学习已经成为解决许多具有挑战性问题的方法。
在目标检测,语音识别和语言翻译方面,深度学习是迄今为止表现最好的方法。 许多人将深度神经网络(DNNs)视为神奇的黑盒子,我们输入一些数据,出来的就是我们的解决方案!
事实上,事情要复杂得多。
在设计和应用中,把DNN用到一个特定的问题上可能会遇到很多挑战。
为了达到实际应用所需的性能标准,数据处理、网络设计、训练和推断等各个阶段的正确设计和执行至关重要。
“欠拟合”常常在模型学习能力较弱,而数据复杂度较高的情况出现,此时模型由于学习能力不足,无法学习到数据集中的“一般规律”,因而导致泛化能力弱。与之相反,“过拟合”常常出现在模型学习
能力过强的情况,此时的模型学习能力太强,以至于将训练集单个样本自身的特点都能捕捉到,并将其认为是“一般规律”,同样这种情况也会导致模型泛化能力下降。过拟合与欠拟合的区别在于,欠拟合在训练集和测试集上的性能都较差,而过拟合往往能完美学习训练集数据的性质,而在测试集上的性能较差。
下图(a)与图(b)分别展示了对二维数据进行拟合时过拟合与欠拟合的情况。其中蓝色虚线代表数据的真实分布,橙色圆点为训练数据,黑色实线代表模型的拟合结果。图(a)使用简单的线性模型拟合,由于模型过于简单,没有能力捕捉模型的真实分布,产生了欠拟合。图(b)使用了高次多项式模型进行拟合,由于模型过于复杂,因此对每个测试数据都能精确预测,但模型拟合的结果没有抓住数据分布的本质特征,出现了过拟合。
这不是什么大秘密,深度学习机需要大量的“燃料”, 那“燃料”就是数据。拥有的标签数据越多,模型的表现就越好。 更多数据产生能更好性能的想法,已经由谷歌的大规模数据集(有3亿图像)证明!为了感受数据带给深度学习模型的性能提升,在部署Deep Learning模型时,你应该不断地为其提供更多的数据和微调以继续提高其性能。 Feed the beast:如果你想提高你的模型的性能,就要提供更多的数据!
上图显示数据量的增加会得到更好的性能
多年来,已经开发了许多梯度下降优化算法,他们各有其优缺点。
一些最流行的方法如下:
·
Stochastic Gradient Descent (SGD) with momentum
·
Adam
·
RMSprop
·
Adadelta
RMSprop,Adadelta和Adam被认为是自适应优化算法,因为它们会自动更新学习率。 使用SGD时,您必须手动选择学习率和动量参数,通常会随着时间的推移而降低学习率。
在实践中,自适应优化器倾向于比SGD更快地收敛, 然而,他们的最终表现通常稍差。 SGD通常会达到更好的minimum,从而获得更好的最终准确性。但这可能需要比某些优化程序长得多的时间。 它的性能也更依赖于强大的初始化和学习率衰减时间表,这在实践中可能非常困难。
因此,如果你需要一个优化器来快速得到结果,或者测试一个新的技术。
我发现Adam
很实用,因为它对学习率并不是很敏感。
如果您想要获得绝对最佳的表现,请使用SGD + Momentum,并调整学习率,衰减和动量值来使性能最优化。
两全其美的办法
最近已经证明,可以得到两全其美的结果:从 Adam 到SGD的高性能高速训练! 这个想法是,实际上由于在训练的早期阶段SGD对参数调整和初始化非常敏感。 因此,我们可以通过使用Adam来开始训练,这将节省相当长的时间,而不必担心初始化和参数调整。
那么,一旦Adam获得较好的参数,我们可以切换到SGD +动量优化,以达到最佳性能!
Adam vs SGD 性能
4 . Dropout
Dropout是一种随机断开神经元的技术,其具体内容前文已有介绍。Dropout控制过拟合的原理有两点。第一是在神经网络的局部构造集成学习模型,在处理测试集样本时,网络作出的推断实际上是不同神经元断开时的子网络所做出推断的平均。集成学习模型,如随机森林,梯度提升树等在控制过拟合上往往效果明显。
第二是减少神经元之间的耦合,由于Dropout每次断开的神经元都不相同,这就阻止了神经元耦合起来提取同一种特征的可能性,使得网络在缺失一些信息的情况下仍然能够做出正确推断。
EarlyStopping是一种在训练中使用的回调函数,其基本思想是在训练过程中监视神经网络在验证集上的性能,当验证集上的性能在连续的多轮训练中没有得到提高,则提前终止训练。EarlyStopping控制过拟合的原理是控制模型的拟合程度,在适当时机阻止模型继续学习而达到过拟合状态。当模型在验证集性能没有提升时,意味着训练集已经不能提供更多的提高模型泛化能力的信息了,若继续训练下去,模型会开始拟合训练集样本中的自身特点,从而进入过拟合。
BatchNormalization在前文已有介绍。通常而言,BatchNormalization的主要作用是加速网络的训练。但同时,它也具有一定的控制过拟合的能力。实验验证,使用BatchNormalization时可以不用或者以较低的断开率使用Dropout,或降低L2正则的系数。使用BatchNormalization控制过拟合的原理是,过拟合通常发生在数据边界,而BatchNormalization可以协助将初始化权重调整落入数据的内部,从而协助控制过拟合。
在很多情况下,都要处理不平衡的数据,特别是实际应用程序中。
一个简单而实际的例子如下:训练您的深度网络以预测视频流中是否有人持有致命武器。 但是在你的训练数据中,你只有50个拿着武器的人的视频和1000个没有武器的人的视频! 如果你只是用这些数据来训练你的网络,那么你的模型肯定会非常偏向于预测没有人有武器!
你可以做用以下的方法来解决它:
·
在损失函数中使用类权重。
本质上就是,让实例不足的类在损失函数中获得较高的权重,因此任何对该类的错分都将导致损失函数中非常高的错误。
·
过度采样:重复一些实例较少的训练样例,有助于平衡分配。 如果可用的数据很小,这个方法最好。
·
欠采样:一些类的训练实例过多,可以简单地跳过一些实例。 如果可用数据非常大,这个方法最好。
·
为少数类增加数据。可以为少数类创建更多的训练实例! 例如,在前面检测致命武器的例子中,你可以改变属于具有致命武器的类别的视频的颜色和光照等。
正如我们所看到的,深层网络需要大量的数据。遗憾的是,对于许多新的应用程序来说,这些数据可能很难得到并且开销很大。
如果我们希望模型表现良好,可能需要数万或数十万个新的训练样例来进行训练。 如果数据集不易获取,则必须全部手动收集并标记。
这就是迁移学习的起点。 通过迁移学习,我们不需要太多的数据! 这个想法是从一个在数百万图像上训练过的网络开始的,比如在ImageNet上预训练的ResNet。 然后,我们将“重新调整ResNet模型,只重新训练最后几层。
我们将ResNet从数百万图像中学到的信息(图像特征)进行微调,以便将其应用于不同的任务。
因为跨域的图像的特征信息经常是非常相似的所以这个方法是可行的,但是这些特征的分析根据应用而不同。
一个基本的迁移学习示例
前面已经说过:更多的数据=更好的表现。 除了迁移学习之外,另一种快速而简单提高模型的性能的方法是数据增强。 数据增强是使用原始类别标签的同时,改变数据集的原始图像以合成一些新的训练示例。例如,用于图像数据增强的常见方式包括:
·
水平和/或垂直旋转翻转图像
·
改变图像的亮度和颜色
·
随机模糊图像
·
随机从图像裁剪块
基本上,你可以进行任何改变,改变图像的外观但不改变整体内容。
在机器学习中,集成训练多个模型,然后将它们组合在一起以获得更高的性能。
这个想法是在相同的数据集上对同一任务训练多个深度网络模型。 然后,模型的结果可以通过投票进行组合,即具有最高票数的类胜出。
为了确保所有模型不同,可以使用随机权重初始化和随机数据增强。众所周知,由于使用了多个模型,因此集成通常比单个模型更精确,从而从不同角度完成任务。在实际应用中,尤其是竞赛中,几乎所有顶级模型都使用集合方式。
集成模型
我们知道模型精度随深度而增加,但速度又如何呢?
更多的层意味着更多的参数,更多的参数意味着更多的计算,更多的内存消耗和更慢的速度。理想情况下,我们希望在提高速度的同时保持高精度。我们可以通过剪枝来做到这一点。
深度神经网络剪枝策略
这个想法是,网络中的许多参数是多余的,对输出没有太大贡献。 如果可以根据贡献值对网络中的神经元进行排名,那么就可以从网络中移除低排名的神经元,从而形成更小更快的网络。
可以根据神经元权重的L1 / L2均值(平均激活)、一些验证集上神经元不为零的次数以及其他方法来进行排序。 获得更快/更小的网络对于在移动设备上运行深度学习网络非常重要。
修剪网络的最基本的方法是简单地放弃某些卷积滤波器。 最近文章表明,这样做是相当成功的。
这项工作中的神经元排名相当简单:每个滤波器的权重按照L1规范排名。 在每个修剪迭代中,对所有的过滤器进行排序,在所有层中修剪m个排名最低的过滤器,重新训练和重复!
最近的另一篇分析残差网络结构的论文中提出了修剪“过滤器”的关键特点。 作者指出,在删除层的时候,具有残差快捷连接(例如ResNets)的网络比不使用任何快捷连接(例如VGG或AlexNet)的网络在保持良好的准确性方面更为稳健。这个有趣的发现具有重大的实际意义,因为它告诉我们,在修剪网络进行部署和应用时,网络设计至关重要(例如ResNets)。 所以使用最新最好的方法总是很好的!