论文:Bag of Freebies for Training Object Detection Neural Networks
论文链接:https://:.org/abs/1902.04103
参考:https://blog.csdn.net/u014380165/article/details/88011833
按照我学习的过程:(实现的难易程度,哈哈哈)
1、lr采用 cosine+warm up
在神经网络训练的后期:如果学习率过高,会造成loss的振荡;但是如果学习率减小的过快,又会导致收敛变慢的问题。
lr 的改进方法:1)仅衰减 2) 衰减-》增加-》衰减-》增加 -》... 3)switch adam to sgd
1)仅衰减:
原因:在采用批次随机梯度下降算法时,神经网络应该越来越接近Loss值的全局最小值。当它逐渐接近这个最小值时,学习率应该变得更小来使得模型不会超调且尽可能接近这一点。
方法:随步数衰减 (在n步之后学习率变为原来的百分之m) ; 指数衰减 (α=α0e−kt);1/t衰减 (α=α0/(1+kt));余弦退火( lr_scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=5,eta_min=4e-08 )
2)衰减-》增加-》衰减-》增加 -》... :
原因:神经网络在训练过程中容易陷入局部最优值,通过突然提高学习率来跳出局部最优值并找到通向全局最优值的路径。
方法:CLR(https://github.com/anandsaha/pytorch.cyclic.learning.rate)以一个(step_size1+step_size2)为一个周期。其中step_size1的lr以k1为系数线性增加 从min增加到max, step_size2的lr以k2为系数线性减少,从max减少到min。
SGDR通过梯度下降过程中突然提高学习率来跳出局部最优值并找到通向全局最优值的路径。这种方式称为带重启的随机梯度下降。
3)switch adam to sgd : 前期用Adam优化器,迅速收敛,后期切换到SGD,慢慢寻找最优解。
本文:(个人觉得使用warm up + adam->sgd + cosine)是最好的方法。
代码:(Pytorch)
optimizer = optim.Adam(net.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay)
def adjust_learning_rate(optimizer, gamma, epoch_size,iteration,cfg): if iteration//epoch_size ==50 : optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) if iteration//epoch_size < 6: lr = 1e-6 + (args.lr - 1e-6) * iteration / (epoch_size * 6) for param_group in optimizer.param_groups: param_group['lr'] = lr else if: if iteration in cfg['lr_steps']: #list j=cfg['lr_steps'].index(iteration) lr = args.lr * (gamma ** (j+1)) for param_group in optimizer.param_groups: param_group['lr'] = lr else: lr_scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=5,eta_min=4e-08) lr_scheduler.step()