【强基固本】写给新手炼丹师:2021版调参上分手册
“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。
在日常调参的摸爬滚打中,参考了不少他人的调参经验,也积累了自己的一些有效调参方法,慢慢总结整理如下。希望对新晋算法工程师有所助力呀~
01
学习率是一个非常非常重要的超参数,这个参数呢,面对不同规模、不同batch-size、不同优化方式、不同数据集,其最合适的值都是不确定的,我们无法光凭经验来准确地确定lr的值,我们唯一可以做的,就是在训练中不断寻找最合适当前状态的学习率。比如下图利用fastai中的lr_find()函数寻找合适的学习率,根据下方的学习率-损失曲线得到此时合适的学习率为1e-2。
推荐一篇fastai首席设计师 「Sylvain Gugger」 的一篇博客:How Do You Find A Good Learning Rate[1]
以及相关的论文Cyclical Learning Rates for Training Neural Networks[2]。
learning-rate与batch-size的关系
一般来说,越大的batch-size使用越大的学习率。原理很简单,越大的batch-size意味着我们学习的时候,收敛方向的confidence越大,我们前进的方向更加坚定,而小的batch-size则显得比较杂乱,毫无规律性,因为相比批次大的时候,批次小的情况下无法照顾到更多的情况,所以需要小的学习率来保证不至于出错。可以看下图损失Loss与学习率Lr的关系:
在显存足够的条件下,最好采用较大的batch-size进行训练,找到合适的学习率后,可以加快收敛速度。
另外,较大的batch-size可以避免batch normalization出现的一些小问题,参考如下Pytorch库Issue[3]
02
权重初始化相比于其他的trick来说在平常使用并不是很频繁。因为大部分人使用的模型都是预训练模型,使用的权重都是在大型数据集上训练好的模型,当然不需要自己去初始化权重了。只有没有预训练模型的领域会自己初始化权重,或者在模型中去初始化神经网络最后那几个全连接层的权重。常用的权重初始化算法是 「kaiming_normal」 或者 「xavier_normal」。
相关论文:
Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification[4]
Understanding the difficulty of training deep feedforward neural networks[5]
Xavier初始化论文[6]
He初始化论文[7]
不初始化可能会减慢收敛速度,影响收敛效果。
uniform均匀分布初始化:
Xavier初始法,适用于普通激活函数(tanh, sigmoid):
He初始化,适用于ReLU:
normal高斯分布初始化, 其中stdev为高斯分布的标准差,均值设为0:
Xavier初始法,适用于普通激活函数 (tanh,sigmoid):
He初始化,适用于ReLU:
svd初始化:对RNN有比较好的效果。参考论文:https://arxiv.org/abs/1312.6120[8]
03
04
fastai中的图像增强技术为什么相对比较好[9]
05
06
同样的参数,不同的初始化方式 不同的参数,通过cross-validation,选取最好的几组 同样的参数,模型训练的不同阶段,即不同迭代次数的模型。 不同的模型,进行线性融合. 例如RNN和传统模型.
1. model1 probs + model2 probs + model3 probs ==> final label
2. model1 label , model2 label , model3 label ==> voting ==> final label
3. model1_1 probs + ... + model1_n probs ==> mode1 label, model2 label与model3获取的label方式与1相同 ==> voting ==> final label
07
08
09
10
11
12
adam,adadelta等, 在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。adam收敛虽快但是得到的解往往没有sgd+momentum得到的解更好,如果不考虑时间成本的话还是用sgd吧。
13
14
要做梯度归一化,即算出来的梯度除以minibatch size clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15 dropout对小数据防止过拟合有很好的效果,值一般设为0.5 小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329[15] 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。 输入0均值,sigmoid函数的输出不是0均值的。 rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整. batch size合适最重要,并不是越大越好. word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果. 尽量对数据做shuffle LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf16, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值. Batch Normalization据说可以提升效果,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift 如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: http://arxiv.org/abs/1505.00387[17] 来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。 在数据集很大的情况下,一上来就跑全量数据。建议先用 1/100、1/10 的数据跑一跑,对模型性能和训练时间有个底,外推一下全量数据到底需要跑多久。在没有足够的信心前不做大规模实验。 subword 总是会很稳定地涨点,只管用就对了。 GPU 上报错时尽量放在 CPU 上重跑,错误信息更友好。例如 GPU 报 "ERROR:tensorflow:Model diverged with loss = NaN" 其实很有可能是输入 ID 超出了 softmax 词表的范围。 在确定初始学习率的时候,从一个很小的值(例如 1e-7)开始,然后每一步指数增大学习率(例如扩大1.05 倍)进行训练。训练几百步应该能观察到损失函数随训练步数呈对勾形,选择损失下降最快那一段的学习率即可。 补充一个rnn trick,仍然是不考虑时间成本的情况下,batch size=1是一个很不错的regularizer, 起码在某些task上,这也有可能是很多人无法复现alex graves实验结果的原因之一,因为他总是把batch size设成1。 注意实验的可复现性和一致性,注意养成良好的实验记录习惯 ==> 不然如何分析出实验结论。 超参上,learning rate 最重要,推荐了解 cosine learning rate 和 cyclic learning rate,其次是 batchsize 和 weight decay。当你的模型还不错的时候,可以试着做数据增广和改损失函数锦上添花了。
关于训练神经网路的诸多技巧Tricks\(完全总结版\)[18] 你有哪些deep learning(rnn、cnn)调参的经验?[19] Bag of Tricks for Image Classification with Convolutional Neural Networks[20],trick 合集 1。 Must Know Tips/Tricks in Deep Neural Networks[21],trick 合集 2。 33条神经网络训练秘技[22],trick 合集 3。 26秒单GPU训练CIFAR10[23],工程实践。 Batch Normalization[24],虽然玄学,但是养活了很多炼丹师。 Searching for Activation Functions[25],swish 激活函数。
参考文献
[1].How Do You Find A Good Learning Rate: https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html
[2].Cyclical Learning Rates for Training Neural Networks: https://arxiv.org/abs/1506.01186
[3].Pytorch库Issue: https://github.com/pytorch/pytorch/issues/4534
[4].Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification: https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/He_Delving_Deep_into_ICCV_2015_paper.pdf
[5].Understanding the difficulty of training deep feedforward neural networks: http://proceedings.mlr.press/v9/glorot10a.html
[6].Xavier初始化论文: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
[7].He初始化论文: https://arxiv.org/abs/1502.01852
[8].https://arxiv.org/abs/1312.6120: https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1312.6120
[9].fastai中的图像增强技术为什么相对比较好: https://oldpan.me/archives/fastai-1-0-quick-study
[10].towardsdatascience.com/transfer-le…: https://towardsdatascience.com/transfer-learning-using-differential-learning-rates-638455797f00
[11].机器学习算法如何调参?这里有一份神经网络学习速率设置指南: https://zhuanlan.zhihu.com/p/34236769
[12].SGDR: Stochastic Gradient Descent with Warm Restarts: https://arxiv.org/abs/1608.03983
[13].The nuts and bolts of building applications using deep learning: https://www.youtube.com/watch?v=F1ka6a13S9I
[14].MaskedAdam: https://www.zhihu.com/question/265357659/answer/580469438
[15].http://arxiv.org/abs/1409.2329: https://link.zhihu.com/?target=http%3A//arxiv.org/abs/1409.2329
[16].http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf: https://link.zhihu.com/?target=http%3A//jmlr.org/proceedings/papers/v37/jozefowicz15.pdf
[17].http://arxiv.org/abs/1505.00387: https://link.zhihu.com/?target=http%3A//arxiv.org/abs/1505.00387
[18].关于训练神经网路的诸多技巧Tricks(完全总结版): https://juejin.im/post/5be5b0d7e51d4543b365da51
[19].你有哪些deep learning(rnn、cnn)调参的经验?: https://www.zhihu.com/question/41631631
[20].Bag of Tricks for Image Classification with Convolutional Neural Networks: https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1812.01187
[21].Must Know Tips/Tricks in Deep Neural Networks: https://link.zhihu.com/?target=http%3A//lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html
[22].33条神经网络训练秘技: https://zhuanlan.zhihu.com/p/63841572
[23].26秒单GPU训练CIFAR10: https://zhuanlan.zhihu.com/p/79020733
[24].Batch Normalization: https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1502.03167%3Fcontext%3Dcs
[25].Searching for Activation Functions: https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1710.05941
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“强基固本”历史文章
机器学习-嵌入Embedding
各种Normalization
VGG网络的Pytorch官方实现过程解读
卷积神经网络(CNN)反向传播算法推导
全连接神经网络中反向传播算法数学推导
损失函数之DIoU Loss和CIoU Loss
广义正则对偶平均(gRDA)算法简介
深度学习和神经网络:神经网络的训练和评估
一网打尽CNN前向和反向 — 池化、padding、dropout
神经网络、流形和拓扑
高维数据可视化:T-SNE
基础知识 | 对目标检测认识及理解
一步步用c++实现harris角点检测
深度学习与围棋:为围棋数据设计神经网络
更多强基固本专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!