调参初步总结

超参数

什么是超参数,参数和超参数的区别

区分两者最大的一点就是是否通过数据来进行调整,模型参数通常是有数据来驱动调整,超参数则不需要数据来驱动,而是在训练前或者训练中人为的进行调整的参数。例如卷积核的具体核参数就是指模型参数,这是有数据驱动的。而学习率则是人为来进行调整的超参数。这里需要注意的是,通常情况下卷积核数量、卷积核尺寸这些也是超参数,注意与卷积核的核参数区分。

神经网络中包含哪些超参数?

  • 用于训练的超参数
    学习率(learning rate)
    批次大小(batch_size)
  • 用于模型设计的超参数
    优化器(hyp)
    网络的层数和层宽

学习率

学习率概念

学习率是一个正的标量,即学习率是一个正数,它决定了随机梯度优化器的步长

分类

  • 固定学习率(fixed LR)
  • 可变学习率(varied LR)
  • 自适应学习率(adaptive LR)
  • 其中可变学习率包括自适应学习了
固定学习率

如果一个适当的LR常数,网络可以被训练到一个过得去,但是不能令人满意的精度。通常不使用这种方法

自适应学习率方法
  • 基本线性衰减
    在这里插入图片描述
    虽然多了两个参数,但是深度学习模型对lr0和k的敏感性较低,t经常取周期。
    其中lr0和k是线性学习衰减的超参数,表示初始LR和衰减率。t的经常选择可以的是训练时间或自迭代次数。如果t为训练时间,则LR的调度是连续变化的,如图1所示。如果t代表迭代的次数,那么LR每隔几次就会下降一次。典型的选择是每10个epoch降低LR一半(Lau, 2017),每20个epoch降低0.1 (Li et al., 2015)。
  • 指数衰减
    在这里插入图片描述
    其中lr0和k是指数学习衰减的超参数。与线性衰减相似,t可以是自迭代或周期的数量。

学习率通常高于前 100 次迭代后产生最佳性能的学习率。监视前几次迭代,选择一个比表现最好的学习率更高的学习率,同时注意避免不稳定的情况。如果学习率太高,我们的损失函数将开始在某点来回震荡,不会收敛。如果学习率太小,模型将花费太长时间来收敛,如图2所述。
在这里插入图片描述

学习率的设置
  1. 确定LR的初始值,LR的初始值可以比较大,因为它在训练的过程中可能会衰减,因此前期较大的LR可以加快收敛
  2. 使用log规模更新LR。因此,指数衰减可能是一个更好的选择。指数方案可以适用于许多其他超参数调整,如动量和重量衰减。

批次大小

batch_size可以理解为批处理参数,它的极限值为训练集样本总数。
如果数据集比较小,完全可以采用全数据集 ( Full Batch Learning )的形式,这样做至少有 2 个好处:其一,由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。其二,由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。

对于更大的数据集,以上 2 个好处又变成了 2 个坏处:其一,随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。其二,以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来 RMSProp 的妥协方案。

另一个极端,就是每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。如图所示:

在这里插入图片描述
由此可见一个合适的batch_size尤为重要
在合理范围内,增大 Batch_Size 有何好处?

  • 内存利用率提高了,大矩阵乘法的并行化效率提高。
  • 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
  • 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

盲目增大 Batch_Size 有何坏处?

  • 内存利用率提高了,但是内存容量可能撑不住了。
  • 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
  • Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

优化器

1.Batch Gradient Descent (BGD)

BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:
在这里插入图片描述
缺点:

由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。

2.Stochastic Gradient Descent (SGD)

和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
在这里插入图片描述
随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况,那么可能只用其中部分的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。缺点是SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。所以虽然训练速度快,但是准确度下降,并不是全局最优。虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。
缺点:

SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。

BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。

当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。

3.Mini-Batch Gradient Descent (MBGD)

MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
在这里插入图片描述
和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的批次。
缺点:(两大缺点)

  1. 不过 Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)
  2. SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。

4.Momentum

SGD 在 ravines 的情况下容易被困住, ravines 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:
在这里插入图片描述
Momentum 通过加入 γv_t−1 ,可以加速 SGD, 并且抑制震荡
在这里插入图片描述
当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。
加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

超参数设定值: 一般 γ 取值 0.9 左右。
缺点:

这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好。

5.Nesterov Accelerated Gradient

用 θ−γv_t−1 来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是未来的位置上
在这里插入图片描述超参数设定值: 一般 γ 仍取值 0.9 左右。

效果比较:

在这里插入图片描述
蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。
而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。

NAG 可以使 RNN 在很多任务上有更好的表现。

目前为止,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进行加速。

6.Adagrad (Adaptive gradient algorithm)

这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。
在这里插入图片描述
其中 g 为:t 时刻参数 θ_i 的梯度
在这里插入图片描述
如果是普通的 SGD, 那么 θ_i 在每一时刻的梯度更新公式为:
在这里插入图片描述
但这里的 learning rate η 也随 t 和 i 而变:
在这里插入图片描述
其中 G_t 是个对角矩阵, (i,i) 元素就是 t 时刻参数 θ_i 的梯度平方和。

Adagrad 的优点是减少了学习率的手动调节

超参数设定值:一般η选取0.01

缺点:

它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。

7.Adadelta

这个算法是对 Adagrad 的改进,

和 Adagrad 相比,就是分母的 G 换成了过去的梯度平方的衰减平均值,指数衰减平均值
在这里插入图片描述
这个分母相当于梯度的均方根 root mean squared (RMS),在数据统计分析中,将所有值平方求和,求其均值,再开平方,就得到均方根值 ,所以可以用 RMS 简写:
在这里插入图片描述
其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度:
在这里插入图片描述
此外,还将学习率 η 换成了 RMS[Δθ],这样的话,我们甚至都不需要提前设定学习率了:
在这里插入图片描述
超参数设定值: γ 一般设定为 0.9

8.RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。

RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,

梯度更新规则:

RMSprop 与 Adadelta 的第一种形式相同:(使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η)
在这里插入图片描述
超参数设定值:

Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。

9.Adam:Adaptive Moment Estimation

这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum

除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:

在这里插入图片描述
如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:
在这里插入图片描述
梯度更新规则:
在这里插入图片描述
超参数设定值:
建议 β1 = 0.9,β2 = 0.999,ϵ = 10e−8

实践表明,Adam 比其他适应性学习方法效果要好。

如何选择优化算法

如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。

RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。

Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,

随着梯度变的稀疏,Adam 比 RMSprop 效果会好。

整体来讲,Adam 是最好的选择。

很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。

如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

优化器之间的关系

在这里插入图片描述

网络层数和层宽

隐藏层数

隐藏层数是决定神经网络整体结构的关键参数,对最终输出有直接影响。具有更多层的深度学习网络可能获得更复杂的特征和相对更高的精度。通过增加更多层来升级神经网络是获得更好结果的常规方法。
一般使用的是base_model 例如resnet50和resnet101

每层神经元的个数

每层的神经元数量也必须仔细考虑。由于模型缺乏复杂性,隐藏层中的神经元太少可能导致欠拟合(Oppermann,2019)。相比之下,过多的神经元可能会导致过度训练,增加训练时间。

正则化

  • L1正则化
    权重绝对值之和。用于L1正则化的回归模型也称为套索回归或L1范数
    在这里插入图片描述
  • L2正则化
    L2项使用权重的最小二乘值之和。用于L2正则化的回归模型也称为岭回归或L2范数
    在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值