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时偏差修正可用可不用–吴恩达深度学习)

RMSprop:对梯度计算微分平方加权平均数,进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度.

Adam:将Momentum算法和RMSProp算法结合起来使用的一种算法,表现比前两种更好,所以它也是解决摆动幅度过大,加快函数的收敛速度(注意:在Adam中Momentum的偏差修正是必须使用的!)
详情参考-深度学习优化算法解析

学习率调整策略

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

深度学习实战(八)——如何设置学习率
学习率调整方案
常用的学习率调整策略(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的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,产生很好的效果。
YOLOv5-优化器和学习率调整策略_第1张图片

你可能感兴趣的:(算法,pytorch,python)