深度学习调参技巧
1. 前言
我们在学习人工智能的时候,不管是机器学习还是深度学习都需要经历一个调参的过程,参数的好坏直接影响这模型效果的好坏。今天我们介绍下在深度学习中,调参的技巧主要分为哪些。
2. 深度学习中的主要参数
- 学习率(learning rate):学习率的取值一般是1、0.1、0.01、0.001等,我的建议是学习率从大到小,因为大的学习率运算的快,验证错误的速度快。并且我们的学习的过程一般通过Adam进行动态调整,基本问题不大。
- 网络层数:先从1层开始。
- 每层结点数:16,32,128,超过1000的情况比较少见。
- batch size: 128左右开始。batch取太大会陷入局部最小值,batch取太小会抖动厉害,因此要选择一个合适的batch size。
- 梯度裁剪: 限制最大梯度,如果梯度超过了阈值就进行截断。
- dropout:在训练的时候可以设置一定的dropout,提升网络的健壮性,也能提升网络的计算速度。
- 词向量embedding大小:embedding的大小一般是128和256。
- 正负样本比例: 这个是非常忽视,但是在很多分类问题上,又非常重要的参数。很多人往往习惯使用训练数据中默认的正负类别比例,当训练数据非常不平衡的时候,模型很有可能会偏向数目较大的类别,从而影响最终训练结果。除了尝试训练数据默认的正负类别比例之外,建议对数目较小的样本做过采样,例如进行复制。提高他们的比例,看看效果如何,这个对多分类问题同样适用。在使用mini-batch方法进行训练的时候,尽量让一个batch内,各类别的比例平衡,这个在图像识别等多分类任务上非常重要。
- 每层做BN操作,提高结果准确率
- 尽量对数据做shuffle
3. 自动调参
人工一直盯着实验,毕竟太累。自动调参当前也有不少研究。下面介绍几种比较实用的办法:
3.1 Gird Search
这个是最常见的。具体说,就是每种参数确定好几个要尝试的值,然后像一个网格一样,把所有参数值的组合遍历一下。优点是实现简单暴力,如果能全部遍历的话,结果比较可靠。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。
3.2 Random Search
Bengio在Random Search for Hyper-Parameter Optimization中指出,Random Search比Gird Search更有效。实际操作的时候,一般也是先用Gird Search的方法,得到所有候选参数,然后每次从中随机选择进行训练。
3.3 Bayesian Optimization
贝叶斯优化,考虑到了不同参数对应的实验结果值,因此更节省时间。和网络搜索相比简直就是老牛和跑车的区别。具体原理可以参考这个论文: Practical Bayesian Optimization of Machine Learning Algorithms ,这里同时推荐两个实现了贝叶斯调参的Python库,可以上手即用:
- jaberg/hyperopt, 比较简单。
- fmfn/BayesianOptimization, 比较复杂,支持并行调参。
4. 深度学习效果不好
- 选择合适的损失函数:平方损失,交叉熵损失
- 选择合适的Mini-batch size
- 选择合适的激活函数
- 选择合适的自适应学习率
4.1 过拟合处理办法
- earyly stoping
- dropout
- 正则化
- BN
- bagging
- 数据增强
5. 画图
画图是一个很好的习惯,一般是训练数据遍历一轮以后,就输出一下训练集和验证集准确率。同时画到一张图上。这样训练一段时间以后,如果模型一直没有收敛,那么就可以停止训练,尝试其他参数了,以节省时间。