前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习的调参经验

深度学习的调参经验

作者头像
狼啸风云
修改2022-09-02 21:25:13
1.4K0
修改2022-09-02 21:25:13
举报

(1)、获取数据

确保要有高质量的输入/输出数据集,这个数据集要足够大、具有代表性以及拥有相对清楚的标签。缺乏数据集是很难成功的。

(2)、预处理

将数据进行集中是非常重要的,也就是要使数据均值为0,从而使每个维度的每次变动为1。有时,当输入的维度随量级排序变化时,最好使用那个维度的log(1+x)。基本上,重要的是要找到一个0值的可信编码以及自然分界的维度。这样做可使学习工作得更好。如果x的均值很大(例如100),那么权值的更新将会非常大,并且是相互关联的,这使得学习变得低劣而缓慢。保持0均值和较小的方差是成功的关键因素。

(3)、验证集

使用验证集,可以知道什么时候开始降低学习率,和什么时候停止训练。

(4)、批处理

在如今的计算机上每次只执行一个训练样本是很低效的。反之如果进行的是128个例子的批处理,效率将大幅提高,因为其输出量是非常可观的。事实上使用数量级为1的批处理效果不错,这不仅可获得性能的提升同时可降低过度拟合;不过这有可能会被大型批处理超越。但不要使用过大的批处理,因为有可能导致低效和过多过度拟合。所以我的建议是:根据硬件配置选取适合的批处理规模,量力而为会更加高效。

梯度归一化:根据批处理的大小来拆分梯度。这是一个好主意,因为如果对批处理进行倍增(或倍减),无需改变学习率(无论如何,不要太多)。

(5)、权值初始化

uniform

W = np.random.uniform(low=-scale, high=scale, size=shape)

glorot_uniform

scale = np.sqrt(6. / (shape[0] + shape[1]))

np.random.uniform(low=-scale, high=scale, size=shape)

高斯初始化:

w = np.random.randn(n) / sqrt(n),n为参数数目

激活函数为relu的话,推荐

w = np.random.randn(n) * sqrt(2.0/n)

网络层数:

单层神经元数:

正则惩罚项:

(6)、学习率

从一个正常大小的学习率(LR)开始,朝着终点不断缩小。

LR的典型取值是0.1,令人惊讶的是,对于大量的神经网络问题来说,0.1是学习率的一个很好的值。通常学习率倾向于更小而非更大。

使用一个验证集:一个不进行训练的训练集子集,来决定何时降低学习率以及何时停止训练(例如当验证集的错误开始增多的时候)。

学习率计划的实践建议:若发现验证集遭遇瓶颈,不妨将LR除以2(或5),然后继续。最终,LR将会变得非常小,这也到了停止训练的时候了。这样做可以确保在验证性能受到损害的时候,你不会拟合(或过度拟合)训练数据。降低LR是很重要的,通过验证集来控制LR是个正确的做法。但最重要的是要关注学习率。一些研究人员(比如Alex Krizhevsky)使用的方法是,监视更新范数和权值范数之间的比率。比率取值大约为10¯³。如果取值过小,那么学习会变得非常慢;如果取值过大,那么学习将会非常不稳定甚至失败。

权值初始化。关注权值在学习开始时的随机初始化。

如果想偷懒,不妨试试0.02*randn(num_params)。这个范围的值在许多不同的问题上工作得很好。当然,更小(或更大)的值也值得一试。

如果它工作得不好(例如是一个非常规的和/或非常深的神经网络架构),那么需要使用init_scale/sqrt(layer_width)*randn来初始化每个权值矩阵。在这种情况下,init_scale应该设置为0.1或者1,或者类似的值。

对于深度且循环的网络,随机初始化是极其重要的。如果没有处理好,那么它看起来就像没有学习到任何东西。我们知道,一旦条件都设置好了,神经网络就会学习。

(7)、数值梯度检查

如果没有使用过Theano或者Torch,梯度实现只能亲力亲为了。在实现梯度的时候很容易出错,所以使用数值梯度检查是至关重要的。这样做会让你对自己的代码充满信心。调整超级参数(比如学习率和初始化)是非常有价值的,因此好刀要用在刀刃上。

数据增加(Data augmentation):使用算法来增加训练实例数量是个有创意的做法。如果是图像,那么应该转换和旋转它们;如果是音频,应该将清晰的部分和所有类型的杂音进行混合处理。数据添加是一门艺术(除非是在处理图像),这需要一定的常识。

(8)、Dropout

dropout提供了一个简单的方法来提升性能。记得要调整退出率,而在测试时不要忘记关闭dropout,然后对权值求乘积(也就是1-dropout率)。当然,要确保将网络训练得更久一点。不同于普通训练,在进入深入训练之后,验证错误通常会有所增加。dropout网络会随着时间推移而工作得越来越好,所以耐心是关键。dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd效果更好. dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329。

(9)、综合(Ensembling)

训练10个神经网络,然后对其预测数据进行平均。该做法虽然简单,但能获得更直接、更可观的性能提升。有人可能会困惑,为什么平均会这么有效?不妨用一个例子来说明:假如两个分类器的错误率为70%,如果其中一个的正确率保持较高,那么平均后的预测会更接近正确结果。这对于可信网络的效果会更加明显,当网络可信时结果是对的,不可信时结果是错的。

同样的参数,不同的初始化方式

不同的参数,通过cross-validation,选取最好的几组

同样的参数,模型训练的不同阶段

不同的模型,进行线性融合. 例如RNN和传统模型

(10)、自动调参

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

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

Random Search。Bengio在Random Search for Hyper-Parameter Optimization中指出,Random Search比Gird Search更有效。实际操作的时候,一般也是先用Gird Search的方法,得到所有候选参数,然后每次从中随机选择进行训练。

Bayesian Optimization. 贝叶斯优化,考虑到了不同参数对应的实验结果值,因此更节省时间。和网络搜索相比简直就是老牛和跑车的区别。具体原理可以参考这个论文: Practical Bayesian Optimization of Machine Learning Algorithms ,这里同时推荐两个实现了贝叶斯调参的Python库,可以上手即用:

jaberg/hyperopt, 比较简单。

fmfn/BayesianOptimization, 比较复杂,支持并行调参。

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

(11)、RNN和LSTM的调参

如果正在训练RNN或者LSTM,要对梯度(记得梯度已除以批量大小)范数使用一个硬约束。像15或者5这样的约束在我个人的实验中工作得很好。请将梯度除以批处理大小,再检查一下它的范数是否超过15(或5)。如果超过了,将它缩小到15(或5)。这个小窍门在RNN和LSTM的训练中发挥着巨大作用,不这样做的话,爆炸性的梯度将会导致学习失败,最后不得不使用像1e-6这样微小而无用的学习率。

如果正在使用LSTM同时想在具有大范围依赖的问题上训练它们,那么应该将LSTM遗忘关口的偏差初始化为较大的值。默认状态下,遗忘关口是S型的全部输入,当权值很小时,遗忘关口会被设置为0.5,这只能对部分问题有效。这是对LSTM初始化的一个警示。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (1)、获取数据
  • (2)、预处理
  • (3)、验证集
  • (4)、批处理
  • (5)、权值初始化
  • (6)、学习率
  • (7)、数值梯度检查
  • (8)、Dropout
  • (9)、综合(Ensembling)
  • (10)、自动调参
  • (11)、RNN和LSTM的调参
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档