YOLOv5-优化器和学习率调整策略

优化器和学习率调整策略

pytorch-优化器和学习率调整
这个链接关于优化器和学习率的一些基础讲得很细,还有相关实现代码

优化器

前向传播的过程,会得到模型输出与真实标签的差,我们称之为损失, 有了损失,我们会进入反向传播过程得到参数的梯度,接下来就是优化器干活,优化器(梯度下降)要根据我们的这个梯度去更新参数,使得损失不断的减低。
各种优化器的优缺点
optim.SGD: 随机梯度下降法
optim.Adagrad: 自适应学习率梯度下降法
optim.RMSprop: Adagrad的改进
optim.Adadelta: Adagrad的改进
optim.Adam: RMSprop结合Momentum
optim.Adamax: Adam增加学习率上限
optim.SparseAdam: 稀疏版的Adam
optim.ASGD: 随机平均梯度下降
optim.Rprop: 弹性反向传播
optim.LBFGS: BFGS的改进

SGD:选择合适的learning rate比较困难 – 对所有的参数更新使用同样的learning rate.我们常用的mini-batch SGD训练算法,然而虽然这种算法能够带来很好的训练速度,但是在到达最优点的时候并不能够总是真正到达最优点,而是在最优点附近徘徊。另一个缺点就是这种算法需要我们挑选一个合适的学习率,当我们采用小的学习率的时候,会导致网络在训练的时候收敛太慢;当我们采用大的学习率的时候,会导致在训练过程中优化的幅度跳过函数的范围,也就是可能跳过最优点

SGD+Momentum:基于梯度的移动指数加权平均解决mini-batch SGD优化算法更新幅度摆动大的问题,同时可以使得网络的收敛速度更快(注意:使用Momentum时偏差修正可用可不用–吴恩达深度学习)

Momentum原理:积累之前的动量来替代真正的梯度,计算梯度的指数加权平均数,并利用该梯度更新权重,相关方向加速SGD,抑制振荡,从而加快收敛。

RMSprop:积累之前的动量来替代真正的梯度对梯度计算微分平方加权平均数,进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度.(对学习率加了一定的约束,但事实上仍依赖于人工设置的一个全局学习率

Adam:将Momentum算法和RMSProp算法结合起来使用的一种算法,表现比前两种更好,所以它也是解决摆动幅度过大,加快函数的收敛速度;同时利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,实现学习率自适应。(注意:在Adam中Momentum的偏差修正是必须使用的!)
详情参考-深度学习优化算法解析

学习率调整策略

学习率是深度学习优化器中的一个重要的超参,直接控制了参数更新步伐的大小,整个训练当中,学习率也不是一成不变的,一般而言网络训练刚开始学习率要大(但似乎在网络最开始训练要有一个预热,学习率较小?),然后减小使损失收敛到最小值。

为什么要调整学习率:学习率是可以控制更新的步伐的。 我们在训练模型的时候,一般开始的时候学习率会比较大,这样可以以一个比较快的速度到达最优点的附近,然后再把学习率降下来, 缓慢的去收敛到最优值。

为什么需要warm up(学习率预热):由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳
warm up

深度学习实战(八)——如何设置学习率
学习率调整方案
常用的学习率调整策略(pytorch):
StepLR-等间隔调整学习率
MultiStepLR- 按给定间隔调整学习率
ExponentialLR-按指数衰减调整学习率
CosineAnnealingLR-余弦周期调整学习率
ReduceLRonPlateau-监控指标, 当指标不再变化则调整, 这个非常实用。可以监控loss或者准确率,当不在变化的时候,会自动去调整。
LambdaLR-自定义调整
自定义我们的学习率更新策略,告诉程序我们想怎么改变学习率。并且还可以对不同的参数组设置不同的学习率调整方法,所以在**模型的finetune(迁移)**中非常实用

总结
有序调整: Step、MultiStep、 Exponential和CosineAnnealing, 这些得事先知道学习率大体需要在多少个epoch之后调整的时候用
自适应调整: ReduceLROnPleateau, 这个非常实用,可以监控某个参数,根据参数的变化情况自适应调整
自定义调整:Lambda, 这个在模型的迁移中或者多个参数组不同学习策略的时候实用

YOLOv5-优化器和学习率调整策略

YOLOv5使用的优化器?
yolov5使用自定义的优化器分组方式,分别对**权重(使用权重衰减)、偏置、BN层(使用SGD)**使用不同的优化方式,详情见链接。
yolov5的学习率和优化器代码部分

YOLOv5为什么使用余弦退火学习率?
使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型尽可能接近这一点,而余弦退火(Cosine annealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,产生很好的效果(因为我们希望在网络开始阶段,以一个较小的学习率学习,慢慢变大,直到网络参数的稳定,然后加速训练,到达最优值的附近,这时又需要减小学习率的更新,慢慢接近最优解?)。

周期余弦退火:我们的目标优化函数可能是多峰的,除了全局最优解之外还有多个局部最优解。在训练时梯度下降算法可能陷入局部最小值,此时可以通过突然提高学习率(周期循环),来“跳出”局部最小值并找到通向全局最小值的路径。

来源:奔跑的阿诺

物联沃分享整理
物联沃-IOTWORD物联网 » YOLOv5-优化器和学习率调整策略

发表评论