7个在深度学习实用技巧

你可能不知道的7个深度学习实用技巧

原创 2018-02-09 专知内容组 专知

【导读】前几天,深度学习工程师George Seif发表了一篇博文,总结了7个深度学习的技巧,主要从提高深度学习模型的准确性和速度两个角度来分析这些小技巧。在使用深度学习的时候,我们不能仅仅把它看成一个黑盒子,因为网络设计、训练过程、数据处理等很多步骤都需要精心的设计。作者分别介绍了7个非常实用小技巧:数据量、优化器选择、处理不平衡数据、迁移学习、数据增强、多个模型集成、加快剪枝。相信掌握了这7个技巧,能让你在实际工作中事半功倍!

 

7 Practical Deep Learning Tips

7个实用的深度学习技巧

深度学习已经成为解决许多具有挑战性问题的方法。 在目标检测,语音识别和语言翻译方面,深度学习是迄今为止表现最好的方法。 许多人将深度神经网络(DNNs)视为神奇的黑盒子,我们输入一些数据,出来的就是我们的解决方案! 事实上,事情要复杂得多。

在设计和应用中,把DNN用到一个特定的问题上可能会遇到很多挑战。 为了达到实际应用所需的性能标准,数据处理、网络设计、训练和推断等各个阶段的正确设计和执行至关重要。 在这里,我将与大家分享7个实用技巧,让你的深度神经网络发挥最大作用。

1-数据,数据,数据




这不是什么大秘密,深度学习机需要大量的“燃料”, 那“燃料”就是数据。拥有的标签数据越多,模型的表现就越好。 更多数据产生能更好性能的想法,已经由谷歌的大规模数据集(有3亿图像)证明!为了感受数据带给深度学习模型的性能提升,在部署Deep Learning模型时,你应该不断地为其提供更多的数据和微调以继续提高其性能。 Feed the beast:如果你想提高你的模型的性能,就要提供更多的数据!

图显示数据量的增加会得到更好的性能

2-你应该选择哪一个优化器




多年来,已经开发了许多梯度下降优化算法,他们各有其优缺点。 一些最流行的方法如下:

  • 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 性能

3-如何处理不平衡数据




在很多情况下,都要处理不平衡的数据,特别是实际应用程序中。 一个简单而实际的例子如下:训练您的深度网络以预测视频流中是否有人持有致命武器。 但是在你的训练数据中,你只有50个拿着武器的人的视频和1000个没有武器的人的视频! 如果你只是用这些数据来训练你的网络,那么你的模型肯定会非常偏向于预测没有人有武器!

你可以做用以下的方法来解决它:

  • 在损失函数中使用类权重。 本质上就是,让实例不足的类在损失函数中获得较高的权重,因此任何对该类的错分都将导致损失函数中非常高的错误。
  • 过度采样:重复一些实例较少的训练样例,有助于平衡分配。 如果可用的数据很小,这个方法最好。
  • 欠采样:一些类的训练实例过多,可以简单地跳过一些实例。 如果可用数据非常大,这个方法最好。
  • 为少数类增加数据。可以为少数类创建更多的训练实例! 例如,在前面检测致命武器的例子中,你可以改变属于具有致命武器的类别的视频的颜色和光照等。

4-迁移学习




正如我们所看到的,深层网络需要大量的数据。遗憾的是,对于许多新的应用程序来说,这些数据可能很难得到并且开销很大。 如果我们希望模型表现良好,可能需要数万或数十万个新的训练样例来进行训练。 如果数据集不易获取,则必须全部手动收集并标记。

这就是迁移学习的起点。 通过迁移学习,我们不需要太多的数据! 这个想法是从一个在数百万图像上训练过的网络开始的,比如在ImageNet上预训练的ResNet。 然后,我们将“重新调整ResNet模型,只重新训练最后几层。

我们将ResNet从数百万图像中学到的信息(图像特征)进行微调,以便将其应用于不同的任务。 因为跨域的图像的特征信息经常是非常相似的所以这个方法是可行的,但是这些特征的分析根据应用而不同。

一个基本的迁移学习示例

5 – 用数据增强提高性能




前面已经说过:更多的数据=更好的表现。 除了迁移学习之外,另一种快速而简单提高模型的性能的方法是数据增强。 数据增强是使用原始类别标签的同时,改变数据集的原始图像以合成一些新的训练示例。例如,用于图像数据增强的常见方式包括:

  • 水平和/或垂直旋转翻转图像
  • 改变图像的亮度和颜色
  • 随机模糊图像
  • 随机从图像裁剪块

基本上,你可以进行任何改变,改变图像的外观但不改变整体内容,例如你可以使用蓝色狗的照片,但你仍然应该能够清楚地看到,这是一个狗的照片。

数据增强

6-通过集成提升模型!




在机器学习中,集成训练多个模型,然后将它们组合在一起以获得更高的性能。 这个想法是在相同的数据集上对同一任务训练多个深度网络模型。 然后,模型的结果可以通过投票进行组合,即具有最高票数的类胜出。

为了确保所有模型不同,可以使用随机权重初始化和随机数据增强。众所周知,由于使用了多个模型,因此集成通常比单个模型更精确,从而从不同角度完成任务。在实际应用中,尤其是竞赛中,几乎所有顶级模型都使用集合方式。

集成模型

7-加快剪枝




我们知道模型精度随深度而增加,但速度又如何呢? 更多的层意味着更多的参数,更多的参数意味着更多的计算,更多的内存消耗和更慢的速度。理想情况下,我们希望在提高速度的同时保持高精度。我们可以通过剪枝来做到这一点。

深度神经网络剪枝策略

这个想法是,网络中的许多参数是多余的,对输出没有太大贡献。 如果可以根据贡献值对网络中的神经元进行排名,那么就可以从网络中移除低排名的神经元,从而形成更小更快的网络。 可以根据神经元权重的L1 / L2均值(平均激活)、一些验证集上神经元不为零的次数以及其他方法来进行排序。 获得更快/更小的网络对于在移动设备上运行深度学习网络非常重要。

修剪网络的最基本的方法是简单地放弃某些卷积滤波器。 最近文章表明,这样做是相当成功的。 这项工作中的神经元排名相当简单:每个滤波器的权重按照L1规范排名。 在每个修剪迭代中,对所有的过滤器进行排序,在所有层中修剪m个排名最低的过滤器,重新训练和重复!

最近的另一篇分析残差网络结构的论文中提出了修剪“过滤器”的关键特点。 作者指出,在删除层的时候,具有残差快捷连接(例如ResNets)的网络比不使用任何快捷连接(例如VGG或AlexNet)的网络在保持良好的准确性方面更为稳健。这个有趣的发现具有重大的实际意义,因为它告诉我们,在修剪网络进行部署和应用时,网络设计至关重要(例如ResNets)。 所以使用最新最好的方法总是很好的!

That’s a wrap!

There you have it, your 7 practical tips for Deep Learning

参考链接:

https://towardsdatascience.com/7-practical-deep-learning-tips-97a9f514100e

-END-

专 · 知

人工智能领域主题知识资料查看获取【专知荟萃】人工智能领域26个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)

请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!

请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!

点击“阅读原文”,使用专知

阅读原文

微信扫一扫
关注该公众号

原文地址:https://www.cnblogs.com/Anita9002/p/8442176.html

时间: 2024-10-12 06:27:21

7个在深度学习实用技巧的相关文章

深度学习 Fine-tune 技巧总结

深度学习中需要大量的数据和计算资源(乞丐版都需要12G显存的GPU - -)且需花费大量时间来训练模型,但在实际中难以满足这些需求,而使用迁移学习则能有效 降低数据量.计算量和计算时间,并能定制在新场景的业务需求,可谓一大利器. 迁移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(Fine-tune).通过修改预训练网络模型结构(如修改样本类别输出个数),选择性载入预训练网络模型权重(通常是载入除最后的全连接层的之前所有层 ,也叫瓶颈层) 再用自己的数据集重新训练模型就是微调的基本

深度学习训练技巧---权重初始化

全零初始化 全零初始化即所有的变量均被初始化为0,这应该是最笨.最省事的随机化方法了.然而这种偷懒的初始化方法非常不适合深度学习,因为这种初始化方法没有打破神经元之间的对称性,将导致收敛速度很慢甚至训练失败. 常量初始化(constant) 把权值或者偏置初始化为一个常数,具体是什么常数,可以自己定义 高斯分布初始化(gaussian) 需要给定高斯函数的均值与标准差 positive_unitball初始化 让每一个神经元的输入的权值和为 1,例如:一个神经元有100个输入,让这100个输入的

干货!深度学习七个实用技巧

深度学习已经成为解决许多具有挑战性的现实世界问题的方法.对目标检测,语音识别和语言翻译来说,这是迄今为止表现最好的方法.许多人将深度神经网络(DNNs)视为神奇的黑盒子,我们放进去一堆数据,出来的就是我们的解决方案!事实上,事情没那么简单.在设计和应用DNN到一个特定的问题上可能会遇到很多挑战.为了达到现实世界应用所需的性能标准,对数据准备,网络设计,训练和推断等各个阶段的正确设计和执行至关重要.在这里,我将与大家分享7个实用技巧,让您的深度神经网络发挥最大作用. 1 - 数据,数据,数据 这不

深度学习网络调参技巧

转自https://zhuanlan.zhihu.com/p/24720954?utm_source=zhihu&utm_medium=social 之前曾经写过一篇文章,讲了一些深度学习训练的技巧,其中包含了部分调参心得:深度学习训练心得.不过由于一般深度学习实验,相比普通机器学习任务,时间较长,因此调参技巧就显得尤为重要.同时个人实践中,又有一些新的调参心得,因此这里单独写一篇文章,谈一下自己对深度学习调参的理解,大家如果有其他技巧,也欢迎多多交流. 好的实验环境是成功的一半 由于深度学习实

提升深度学习模型的表现,你需要这20个技巧

提升深度学习模型的表现,你需要这20个技巧 标签: 深度学习 2016-09-24 21:28 6650人阅读 评论(0) 收藏 举报  分类: 深度学习(4)  选自machielearningmastery 机器之心编译 作者:Jason Brownlee 参与:杜夏德.陈晨.吴攀.Terrence.李亚洲 本文原文的作者 Jason Brownlee 是一位职业软件开发者,没有博士学位的他通过「从应用中学习」的方法自学了机器学习,他表示对帮助职业开发者应用机器学习来解决复杂问题很有热情,也

深度 | 提升深度学习模型的表现,你需要这20个技巧(附论文)

深度 | 提升深度学习模型的表现,你需要这20个技巧(附论文) 2018-04-15 19:53:45 JF_Ma 阅读数 296更多 分类专栏: 机器学习 深度 | 提升深度学习模型的表现,你需要这20个技巧(附论文) 2016-09-23 机器之心 选自machielearningmastery 机器之心编译 作者:Jason Brownlee 参与:杜夏德.陈晨.吴攀.Terrence.李亚洲 本文原文的作者 Jason Brownlee 是一位职业软件开发者,没有博士学位的他通过「从应用

深度学习网络训练技巧汇总

转载请注明:炼丹实验室新开了一个专栏,为什么叫炼丹实验室呢,因为以后会在这个专栏里分享一些关于深度学习相关的实战心得,而深度学习很多人称它为玄学,犹如炼丹一般.不过即使是炼丹也是可以摸索出一些经验规律的,希望和各位炼丹术士一起多多交流. 训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异.这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正. 参数初始化. 下面几种方式,随便选一个,结果基本都差不多.但是一定要做

搭建实用深度学习环境(Ubuntu16.10+Theano0.8.2+Tensorflow0.11.0rc1+Keras1.1.0)

在动手安装之前,首先要确定硬件,系统,准备安装软件的版本,确定这些软硬件之间是否相互支持或兼容.本文安装的主要环境和软件如下: Ubuntu16.10+CUDA8.0(cudnn5.1,CNMEM)+Theano0.8.2+Tensorflow0.11.0rc1+Keras1.1.0 显卡型号为Quadro K6000. 深度学习的另外一个比较常用的开发环境是CAFFE,由于之前的很多大牛基于CAFFE做了很多注明的模型,且已经发布到网上,故这套框架更适合于应用.但CAFFE安装起来异常复杂,需

深度学习-网络调参技巧

最近在做深度学习实验,跑一次实验轻则以小时计.重则以天计,实在没有那么多的时间可以等待,因此想想用尽可能少的实验次数,得到尽可能好的实验效果.这样的话,问题就可以归结为如何设计合适的网络结构.如何设计合适的训练策略,主要就是: 层数.每一层卷积核个数.卷积权重初始化方式.dropout ratio.BN.全连接层神经元个数.Relu等网络结构参数应该如何选? 学习率.decay等solver参数又该如何设置? 在参考炼丹实验室的基础上,并结合自己的体会,谈谈对调参的理解,大家如果有其他技巧,也欢