在旷视两年的北大学子分享关于deep learning的调参经验

2019-10-21 16:07:29 浏览数 (1)

原文:https://www.zhihu.com/question/41631631/answer/859040970 编辑:AI算法与图像处理 已授权转载,如需转载请联系作者

总结一下在旷视实习两年来的炼丹经验,我主要做了一些 RL,图像质量,图像分类,GAN 相关的任务,日常大概占用 5 - 10 张卡。

『可复现性和一致性』

有的同学在打比赛的时候,从头到尾只维护若干份丹方(代码),每次载入前一次的训练参数,调一下代码继续训,俗称老丹。这样会有几个问题:某次引入一个 bug,过了很久才发现,然后不知道影响范围;炼出一个金丹,但是不知道它是怎么来的;忘了自己的 baseline,不知道改动是正面还是负面。

要尽可能确保每一个丹有可复现性,实践上建议代码不应该在炼丹后改动,炼新的丹时,把旧的丹方复制一遍。得到的实验结果要开个文档记下来以便日后总结,避免遗忘。

实验一致性上也要多做努力,理想状态是有合理的基准来测丹的性能,同一个丹方不应该由于超参的微小改动而有显著结果差异。出现这种情况可能是数据太少或基准设置不当。

『资源利用』

对于新入行的同学,不要试图在玩具级别的数据集或任务上做靠谱的研究,比如 MNIST。

不是每一个实验都要出一个金丹,实验是为了验证结论的。如果每个实验都要 8 张卡跑两个星期,人力物力都耗不起。尽力把实验控制在单卡一天以内,理想状态是半天得一次结论。理论上来说,水多加面面多加水(加数据加计算量)的做法无限涨点。建议先设一个目标,比如说就是在一天的训练时间下做对比实验。

我自己实践经验是,首先用小图小模型,比如 128 x 128 输入的 ResNet18;用 cProfile 来找性能瓶颈,比如我发现自己的某个丹,炼的时候有一大半时间耗费在等数据,数据处理中一大半时间在调用 numpy 的 round 函数,前期把精力集中在提高做实验的效率上。

『模型不 work』

先把锦上添花的东西去掉,比如数据增广,玄学学习率和超参,魔幻损失函数,异形模型。如果世界上有一个非要加旋转增广和 1.96e-4 学习率 42 batchsize,配上四种混合损失函数才能炼好的丹,它应该存在于灵能文明。可以先造一些尽量玩具的模型,验证代码正确性。

『需要进一步改进』

先确认影响模型性能的组件。感性认识就是,数据是否需要增加或增广。模型是大了还是小了,再根据速度和精度期望开始寻找合适的模型。能用全卷积的任务,少用全连接层。基本模型上 ResNet, Unet 结构还是主流。 当你的模型有 Batch Normalization,初始化通常不需要操心,激活函数默认 Relu 即可(某引用数万的大佬说的)。一般顺序是 Conv - BN - Relu。如果没有 BN(很多任务上,BN降低训练难度,但是影响最终性能 ),可能要做一些数据归一化。数据量比较小时才考虑 dropout。 虽然有至少十种激活函数,但在 Relu 外只推荐试一下 Swish。炼丹术只推荐 Momentum 和 Adam。在这些方面做尝试意义不大,如果性能提升反倒可能说明模型不成熟。不推荐做人肉模型设计,比如把某层卷积改大一点,或者微调一下通道数。除非有特别 insight,不要自己乱设计新组件。 超参上,learning rate 最重要,推荐了解 cosine learning rate 和 cyclic learning rate,其次是 batchsize 和 weight decay。

祝读到这里的各位模型涨点!

参考文献

Bag of Tricks for Image Classification with Convolutional Neural Networks,trick 合集 1。

Must Know Tips/Tricks in Deep Neural Networks,trick 合集 2。

33条神经网络训练秘技,trick 合集 3。

26秒单GPU训练CIFAR10,工程实践。

Batch Normalization,虽然玄学,但是养活了很多炼丹师。

Searching for Activation Functions,swish 激活函数。

0 人点赞