调参其实就是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