深度学习中的调参经验

调参其实就是trial-and-error,没有其他捷径可以走。快速尝试, 快速纠错这是调参的关键。

目录

常用的调参经验:

自动调参方法:



这是一个很好的链接, 说明了如何从零开始不断的trial-and-error(其实这里面没遇到什么error):

Using convolutional neural nets to detect facial keypoints tutorial

 

常用的调参经验:


1.预处理

mean/std zero-center就够了,PCA、白化什么的都用不上。反正CNN能学习encoder,PCA用不用其实关系不大,大不了网络里面自己学习出来一个。

2.shuffle

3.理解网络的原理。比如 CNN的conv这块, 要明白sobel算子的边界检测。

4.Dropout

不仅可以防止过拟合,也相当于做人力成本最低的Ensemble。当然,训练起来会比没有Dropout的要慢一点,同时最好相应加一点网络参数。

5.CNN更加适合训练回答是否的问题,如果任务比较复杂,考虑先用分类任务训练一个模型再finetune。

6.用ReLU(CV领域).

7.用3x3(卷积核)。

8.用xavier。

9.LRN一类的,其实可以不用。不行可以再拿来试试看。

10.filter数量2^n。

11.多尺度的图片输入(或者网络内部利用多尺度下的结果)有很好的提升效果。

12.第一层的filter,数量不要太少。否则根本学不出来(底层特征很重要)。

13.sgd adam 这些选择上,看你个人选择.。一般对网络不是决定性的。反正我一般用sgd + momentum。

14.batch normalization我一直没用,虽然我知道这个很好,我不用仅仅是因为我懒。所以要鼓励使用batch normalization。

15.不要完全相信论文里面的东西。结构什么的觉得可能有效果,可以拿去试试。

16.你有95%概率不会使用超过40层的模型。

17.shortcut的联接是有作用的。

18.Google的inception论文,结构要好好看看。

19.一些传统的方法,要稍微了解了解。我自己的程序就用过1x14的手写filter,写过之后你看看inception里面的1x7、7x1 就会会心一笑...


自动调参方法:

(1)Grid Search:网格搜索,在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。

(2)Random Search:经验上,Random Search比Gird Search更有效。实际操作的时候,一般也是先用Gird Search的方法,得到所有候选参数,然后每次从中随机选择进行训练。另外Random Search往往会和由粗到细的调参策略结合使用,即在效果比较好的参数附近进行更加精细的搜索。

(3)Bayesian Optimization:贝叶斯优化,考虑到了不同参数对应的 实验结果值,因此更节省时间,贝叶斯调参比Grid Search迭代次数少, 速度快;而且其针对非凸问题依然稳健。


经验参数

这里给出一些参数的经验值,避免大家调参的时候,毫无头绪。

1.learning rate: 1、0.1、0.01、0.001。

一般从1开始尝试。很少见learning rate大于10的。学习率一般要随着训练进行衰减。衰减系数一般是0.5。衰减时机,可以是验证集准确率不再上升时,或固定训练多少个周期以后。
不过更建议使用自适应梯度的办法,例如adam、adadelta、rmsprop等,这些一般使用相关论文提供的默认值即可,可以避免再费劲调节学习率。

对RNN来说,有个经验,如果RNN要处理的序列比较长,或者RNN层数比较多,那么learning rate一般小一些比较好,否则有可能出现结果不收敛,甚至Nan等问题。

2.网络层数:先从1层开始。

3.每层结点数:16、32、128。超过1000的情况比较少见。超过1W的从来没有见过。

4.batch size: 128上下开始。

batch size值增加,的确能提高训练速度。但是有可能收敛结果变差。如果显存大小允许,可以考虑从一个比较大的值开始尝试。因为batch size太大,一般不会对结果有太大的影响,而batch size太小的话,结果有可能很差。

5.clip c(梯度裁剪):

限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值:5、10、15。

6.dropout:0.5。

7.L2正则:1.0,超过10的很少见。

8.词向量embedding大小:128、256。

9.正负样本比例:这个是非常忽视,但是在很多分类问题上,又非常重要的参数。

很多人往往习惯使用训练数据中默认的正负类别比例,当训练数据非常不平衡的时候,模型很有可能会偏向数目较大的类别,从而影响最终训练结果。除了尝试训练数据默认的正负类别比例之外,建议对数目较小的样本做过采样,例如进行复制。提高他们的比例,看看效果如何,这个对多分类问题同样适用。
在使用mini-batch方法进行训练的时候,尽量让一个batch内,各类别的比例平衡,这个在图像识别等多分类任务上非常重要。


参考资料:

https://www.zhihu.com/question/25097993

https://zhuanlan.zhihu.com/p/24720954

你可能感兴趣的:(深度学习之超参数调试)