深度学习调参技巧

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. 自动调参

人工一直盯着实验,毕竟太累。自动调参当前也有不少研究。下面介绍几种比较实用的办法:

这个是最常见的。具体说,就是每种参数确定好几个要尝试的值,然后像一个网格一样,把所有参数值的组合遍历一下。优点是实现简单暴力,如果能全部遍历的话,结果比较可靠。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。

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库,可以上手即用:

  1. jaberg/hyperopt, 比较简单。
  2. fmfn/BayesianOptimization, 比较复杂,支持并行调参。

4. 深度学习效果不好

  1. 选择合适的损失函数:平方损失,交叉熵损失
  2. 选择合适的Mini-batch size
  3. 选择合适的激活函数
  4. 选择合适的自适应学习率

4.1 过拟合处理办法

  1. earyly stoping
  2. dropout
  3. 正则化
  4. BN
  5. bagging
  6. 数据增强

5. 画图

画图是一个很好的习惯,一般是训练数据遍历一轮以后,就输出一下训练集和验证集准确率。同时画到一张图上。这样训练一段时间以后,如果模型一直没有收敛,那么就可以停止训练,尝试其他参数了,以节省时间。

posted @ 2018-12-12 21:48  hyc339408769  阅读(4773)  评论(0编辑  收藏  举报