16个深度学习技巧实战,资深研究员的血泪教训

下面是一些有助于充分利用 DNN 的小技巧,说出你的故事:

1. 记得要 shuffle。不要让你的网络通过完全相同的 minibatch,如果框架允许,在每个 epoch 都 shuffle 一次。

2. 扩展数据集。DNN 需要大量的数据,而且模型在小的数据集上很容易过拟合。Nikolas Markou强烈建议你要扩展原始的数据集。如果你的是一个视觉任务,可以增加噪点、增白,减少像素,旋转或色移,模糊,等等可以扩展的一切。有一点不好的是,假如你扩展得太大,可能训练的数据大多数是相同的。Nikolas Markou创建了一个应用随机变换的层来解决这个问题,这样就不会有相同的样本。若果你用的是语音数据,可以进行移位和失真处理。

3. 在整个数据集上训练之前,先在非常小的子数据集上训练进行过拟合,这样你会知道你的网络可以收敛。这个 tip 来自 Karpathy。

4. 始终使用 dropout 将过拟合的几率最小化。在大小 > 256 (完全连接层或卷积层)之后就应该使用 dropout。关于这一点有一篇很好的论文:Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning [Gal Yarin & Zoubin Ghahramani,2015].

5. 避免 LRN 池化,MAX 池化会更快。

6. 避免 Sigmoid/TanH 的门,它们代价昂贵,容易饱和,而且可能会停止反向传播。实际上,你的网络越深,就越应该避免使用 Sigmoid 和 TanH。可以使用更便宜而且更有效的 ReLU 和 PreLU 的门,正如在 Yoshua Bengio 等人的论文 Deep Sparse Rectifier Neural Networks 中所提到的,这两者能够促进稀疏性,而且它们的反向传播更加鲁棒。

7. 在最大池化之前不要使用 ReLU 或 PreLU ,而是在保存计算之后使用它。

8. 不要使用 ReLU ,它们太旧了。虽然他们是非常有用的非线性函数,可以解决很多问题。但是,你可以试试用它微调一个新模型,由于 ReLU 阻碍反向传播,初始化不好,你没法得到任何微调效果。但是你应该用 PreLU 以及一个非常小的乘数,通常是0.1。使用 PreLU 的话收敛更快,而且不会像 ReLU 那样在初始阶段被卡住。ELU 也很好,但成本高。(实际中还是主要使用ReLU)

9. 经常使用批标准化。参考论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift[Sergey Ioffe & Christian Szegedy,2015]。这会很有效。批标准化允许更快的收敛(非常快)以及更小的数据集。这样你能够节省时间和资源。虽然大多数人喜欢删除平均值,不过Nikolas Markou不喜欢。Nikolas Markou喜欢压缩输入数据为[-1,+1]。这可以说是训练和部署方面的技巧,而不是针对提升性能的技巧。

10. 要能适用更小的模型。假如你是像Nikolas Markou这样部署深度学习模型,你很快就会体会到把千兆字节规模的模型推给用户或地球另一端的服务器的痛苦。哪怕要牺牲一些准确度,也应该小型化。

11. 假如你使用比较小的模型,可以试试 ensemble。通常 ensemble 5个网络能够提升准确度约3%。

12. 尽可能使用 xavier 初始化。你可以只在大的完全连接层上使用它,然后避免在 CNN 层上使用。有关这点的解释可以阅读这篇文章:An Explanation of Xavier Initialization(by Andy Jones)

13. 如果你的输入数据有空间参数,可以试试端到端的 CNN。可以阅读这篇论文:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size[Forrest N. Iandola et. al. 2016],它介绍了一种新的方法,而且性能非常好,你可以尝试应用上面提到的tips。修改你的模型,只要可能就使用 1x1 的 CNN 层,它的位置对提高性能很有帮助。

14. 假如没有高端的 GPU,就不要尝试训练任何东西了。

15. 假如你要利用模型或你自己的层来制作模板,记得把所有东西参数化,否则你得重建所有二进制文件。

16. 最后,要明白你在做什么。深度学习就像是机器学习里的中子弹,它不是任何任务、任何时候都有效的。了解你正在使用的结构以及你试图达成的目的,才不至于盲目地复制模型。

了解 DL 背后的数学,推荐阅读 Ian Goodfellow , Yoshua Bengio 和 Aaron Courville 合著的经典教材《深度学习》,这本书真的很好,讲解得很清楚。网上有免费的 pdf 版本,但买一本支持作者的贡献也无妨。

此外,如果想了解深度学习的历史和介绍,可以阅读邓力和俞栋合著的《深度学习:方法及应用》。

这是我本科的毕业论文,后来获校优秀论文证书,而这个证书大大的帮助了我研究生复试。分享出来,希望对大家有用。 摘要 在众多的UNIX系统中,Solaris一直以其强大的功能和健壮的稳定性深受企业用户的青睐。2005年,Sun公司公开了全部的Solaris内核源码,并提出极富挑战性的OpenSolaris项目。同时,Solaris还提供两款强大的内核跟踪工具:DTrace和MDB。 而随着现代操作系统的发展,虚拟内存技术融合了多种先进的技术,逐渐成为操作系统的核心。因此,设计并实现基于Solaris的虚拟内存实验,不仅对研究者,更是对未来的学习者,都将是一个充满挑战性、又极富创造性,既有很强的研究价值,又有重要的现实意义的课题。 本文创造性把DTrace和MDB工具的使用和对内核的跟踪查看结合在一起,把对内核的学习研究和实验的设计实现结合在一起,层层深入的设计和实现了虚拟内存的组织结构和实现、物理内存与虚拟内存的映射、页故障处理的机制与策略以及内存性能瓶颈分析四个实验,并在每个实验中从不同的角度设计并实现了多个方案。 通过这些实验,对Solaris虚拟内存技术做了一个较为全面而深入的研究与总结,从而细化、也深化了对操作系统原理本身的理解。 关键词:操作系统实验;虚拟内存;Solaris;DTrace;MDB 如果遇到任何问题,或者想转载,可以到我的主页留言:http://blog.sina.com.cn/gusui ,或者直接给我来邮件:ouyangj0@gmail.com 谢谢:)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值