10分钟教你深度学习的调参
0.2072018-03-20 11:47打开App
两类需要调参的参数(parameters)
- 优化类的参数:学习率(learning rates)、mini batch、训练代数(epochs)
- 模型类的参数:隐含层数(hidden layers)、模型结构的参数(如RNN)
优化类的参数
学习率 Learning Rate
一个好的起点是从0.01尝试起
可选的几个常用值:
- 0.01
- 0.001
- 0.0001
- 0.00001
- 0.000001
判断依据是验证集的误差(validation error)
常用策略:
- 学习率衰减(learning rate)
- 如果选用了Adam和Adagrad的作为优化器(optimizer),则他们自带了可自适应的学习率(adaptive learning rate)
Mini Batch
可选的常用值:1,2,4,8,16,【32】,64,128,256
推荐32比较常用。32、64、128、256都比较合适
256比较大,一次性计算的多,速度会快,但因为矩阵计算量较大,内存可能超过
小的mini batch size可能因为收敛的抖动比较厉害反而不容易卡在局部最低点
但是mini batch也不能太大,反而准确率下降。
Training Iterations/Epochs
要选择合适的Epochs,就可以用early stopping的方法:
- 具体就是观察validation error上升时就early stop,但是别一看到上升就停,再观察一下,因为有可能只是暂时的现象,这时候停止反而训练会不充分
early stopping
模型类的参数
隐含层单元数Hidden Units
- 解决的问题的模型越复杂则用越多hidden units,但是要适度,因为太大的模型会导致过拟合
- 可以增加Hidden Units数量直到validation error变差
- 通常来说3层的隐含层比2层的好,但是4,5,6层再深就没什么明显效果了
,一个例外情况是CNN
RNN的调参
- RNN内参数
- 选择CELL类型,常用LSTM和GRU
- stack多少个layer,通常两层
- 用作RNN模型前端的word embedding层的embedding数量控制在 50-200之间
深度学习-超参数调整总结
在深度神经网络中,超参数的调整是一项必备技能,通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态,及时调整超参数以更科学地训练模型能够提高资源利用率。在本研究中使用了以下超参数,下面将分别介绍并总结了不同超参数的调整规则。
(1)学习率
学习率(learning rate或作lr)是指在优化算法中更新网络权重的幅度大小。学习率可以是恒定的、逐渐降低的,基于动量的或者是自适应的。不同的优化算法决定不同的学习率。当学习率过大则可能导致模型不收敛,损失loss不断上下震荡;学习率过小则导致模型收敛速度偏慢,需要更长的时间训练。通常lr取值为[0.01,0.001,0.0001]
(2)批次大小batch_size
批次大小是每一次训练神经网络送入模型的样本数,在卷积神经网络中,大批次通常可使网络更快收敛,但由于内存资源的限制,批次过大可能会导致内存不够用或程序内核崩溃。bath_size通常取值为[16,32,64,128]
(3)优化器optimizer
目前Adam是快速收敛且常被使用的优化器。随机梯度下降(SGD)虽然收敛偏慢,但是加入动量Momentum可加快收敛,同时带动量的随机梯度下降算法有更好的最优解,即模型收敛后会有更高的准确性。通常若追求速度则用Adam更多。
(4)迭代次数
迭代次数是指整个训练集输入到神经网络进行训练的次数,当测试错误率和训练错误率相差较小时,可认为当前迭代次数合适;当测试错误率先变小后变大时则说明迭代次数过大了,需要减小迭代次数,否则容易出现过拟合。
(5)激活函数
在神经网络中,激活函数不是真的去激活什么,而是用激活函数给神经网络加入一些非线性因素,使得网络可以更好地解决较为复杂的问题。比如有些问题是线性可分的,而现实场景中更多问题不是线性可分的,若不使用激活函数则难以拟合非线性问题,测试时会有低准确率。所以激活函数主要是非线性的,如sigmoid、tanh、relu。sigmoid函数通常用于二分类,但要防止梯度消失,故适合浅层神经网络且需要配备较小的初始化权重,tanh函数具有中心对称性,适合于有对称性的二分类。在深度学习中,relu是使用最多的激活函数,简单又避免了梯度消失。
非常相似的数据集 | 非常不同的数据集 | |
非常少的数据 | 在顶层调一层线性分类器 | 尝试在不同的层训练线性分类器 |
非常多的数据 | 可微调一些层 | 微调更多的层 |