pytorch的余弦退火学习率

2020 年 11 月 10 日 深度学习自然语言处理

点击上方,选择星标置顶,每天给你送干货

阅读大概需要10分钟

跟随小博主,每天进步一丢丢


作者:limzero

地址:https://www.zhihu.com/people/lim0-34

编辑:人工智能前沿讲习

最近深入了解了下pytorch下面余弦退火学习率的使用.网络上大部分教程都是翻译的pytorch官方文档,并未给出一个很详细的介绍,由于官方文档也只是给了一个数学公式,对参数虽然有解释,但是解释得不够明了,这样一来导致我们在调参过程中不能合理的根据自己的数据设置合适的参数.这里作一个笔记,并且给出一些定性和定量的解释和结论.说到pytorch自带的余弦学习率调整方法,通常指下面这两个
CosineAnnealingLR
CosineAnnealingWarmRestarts

CosineAnnealingLR

这个比较简单,只对其中的最关键的Tmax参数作一个说明,这个可以理解为余弦函数的半周期.如果max_epoch=50次,那么设置T_max=5则会让学习率余弦周期性变化5次.

max_opoch=50, T_max=5

CosineAnnealingWarmRestarts

这个最主要的参数有两个:
  • T_0:学习率第一次回到初始值的epoch位置
  • T_mult:这个控制了学习率变化的速度
    • 如果T_mult=1,则学习率在T_0,2T_0,3T_0,....,i*T_0,....处回到最大值(初始学习率)
      • 5,10,15,20,25,.......处回到最大值
    • 如果T_mult>1,则学习率在T_0,(1+T_mult)T_0,(1+T_mult+T_mult**2)T_0,.....,(1+T_mult+T_mult2+...+T_0i)*T0,处回到最大值
      • 5,15,35,75,155,.......处回到最大值

T_0=5, T_mult=1

T_0=5, T_mult=2

所以可以看到,在调节参数的时候,一定要根据自己总的epoch合理的设置参数,不然很可能达不到预期的效果,经过我自己的试验发现,如果是用那种等间隔的退火策略(CosineAnnealingLR和Tmult=1的CosineAnnealingWarmRestarts),验证准确率总是会在学习率的最低点达到一个很好的效果,而随着学习率回升,验证精度会有所下降.所以为了能最终得到一个更好的收敛点,设置T_mult>1是很有必要的,这样到了训练后期,学习率不会再有一个回升的过程,而且一直下降直到训练结束。

下面是使用示例和画图的代码:
  
  
    
import torchfrom torch.optim.lr_scheduler import CosineAnnealingLR,CosineAnnealingWarmRestarts,StepLRimport torch.nn as nnfrom torchvision.models import resnet18import matplotlib.pyplot as plt#model=resnet18(pretrained=False)optimizer = torch.optim.SGD(model.parameters(), lr=0.1)mode='cosineAnnWarm'if mode=='cosineAnn':    scheduler = CosineAnnealingLR(optimizer, T_max=5, eta_min=0)elif mode=='cosineAnnWarm':    scheduler = CosineAnnealingWarmRestarts(optimizer,T_0=5,T_mult=1)    '''    以T_0=5, T_mult=1为例:    T_0:学习率第一次回到初始值的epoch位置.    T_mult:这个控制了学习率回升的速度        - 如果T_mult=1,则学习率在T_0,2*T_0,3*T_0,....,i*T_0,....处回到最大值(初始学习率)            - 5,10,15,20,25,.......处回到最大值        - 如果T_mult>1,则学习率在T_0,(1+T_mult)*T_0,(1+T_mult+T_mult**2)*T_0,.....,(1+T_mult+T_mult**2+...+T_0**i)*T0,处回到最大值            - 5,15,35,75,155,.......处回到最大值    example:        T_0=5, T_mult=1    '''plt.figure()max_epoch=50iters=200cur_lr_list = []for epoch in range(max_epoch):    for batch in range(iters):        '''        这里scheduler.step(epoch + batch / iters)的理解如下,如果是一个epoch结束后再.step        那么一个epoch内所有batch使用的都是同一个学习率,为了使得不同batch也使用不同的学习率        则可以在这里进行.step        '''        #scheduler.step(epoch + batch / iters)        optimizer.step()    scheduler.step()    cur_lr=optimizer.param_groups[-1]['lr']    cur_lr_list.append(cur_lr)    print('cur_lr:',cur_lr)x_list = list(range(len(cur_lr_list)))plt.plot(x_list, cur_lr_list)plt.show()
最后,对 scheduler.step(epoch + batch / iters)的一个说明,这里的个人理解:一个epoch结束后再.step, 那么一个epoch内所有batch使用的都是同一个学习率,为了使得不同batch也使用不同的学习率 ,则可以在这里进行.step(将离散连续化,或者说使得采样得更加的密集),下图是以20个epoch,每个epoch5个batch,T0=2,Tmul=2画的学习率变化图

代码:
import torchfrom torch.optim.lr_scheduler import CosineAnnealingLR,CosineAnnealingWarmRestarts,StepLRimport torch.nn as nnfrom torchvision.models import resnet18import matplotlib.pyplot as plt#model=resnet18(pretrained=False)optimizer = torch.optim.SGD(model.parameters(), lr=0.1)mode='cosineAnnWarm'if mode=='cosineAnn':    scheduler = CosineAnnealingLR(optimizer, T_max=5, eta_min=0)elif mode=='cosineAnnWarm':    scheduler = CosineAnnealingWarmRestarts(optimizer,T_0=2,T_mult=2)    '''    以T_0=5, T_mult=1为例:    T_0:学习率第一次回到初始值的epoch位置.    T_mult:这个控制了学习率回升的速度        - 如果T_mult=1,则学习率在T_0,2*T_0,3*T_0,....,i*T_0,....处回到最大值(初始学习率)            - 5,10,15,20,25,.......处回到最大值        - 如果T_mult>1,则学习率在T_0,(1+T_mult)*T_0,(1+T_mult+T_mult**2)*T_0,.....,(1+T_mult+T_mult**2+...+T_0**i)*T0,处回到最大值            - 5,15,35,75,155,.......处回到最大值    example:        T_0=5, T_mult=1    '''plt.figure()max_epoch=20iters=5cur_lr_list = []for epoch in range(max_epoch):    print('epoch_{}'.format(epoch))    for batch in range(iters):        scheduler.step(epoch + batch / iters)        optimizer.step()        #scheduler.step()        cur_lr=optimizer.param_groups[-1]['lr']        cur_lr_list.append(cur_lr)        print('cur_lr:',cur_lr)    print('epoch_{}_end'.format(epoch))x_list = list(range(len(cur_lr_list)))plt.plot(x_list, cur_lr_list)plt.show()

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


  
  
    
下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!
后台回复【五件套


下载二:南大模式识别PPT
后台回复南大模式识别



说个正事哈



由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方深度学习自然语言处理”,进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心



投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等

记得备注呦


推荐两个专辑给大家:
专辑 | 李宏毅人类语言处理2020笔记
专辑 | NLP论文解读
专辑 | 情感分析

整理不易,还望给个在看!

登录查看更多
1

相关内容

专知会员服务
15+阅读 · 2020年7月27日
【ACL2020】利用模拟退火实现无监督复述
专知会员服务
13+阅读 · 2020年5月26日
【伯克利】再思考 Transformer中的Batch Normalization
专知会员服务
40+阅读 · 2020年3月21日
专知会员服务
44+阅读 · 2020年3月6日
基于深度学习的行人重识别研究进展,自动化学报
专知会员服务
38+阅读 · 2019年12月5日
PyTorch  深度学习新手入门指南
机器学习算法与Python学习
9+阅读 · 2019年9月16日
PyTorch 学习笔记(七):PyTorch的十个优化器
极市平台
8+阅读 · 2019年5月19日
PyTorch中在反向传播前为什么要手动将梯度清零?
极市平台
39+阅读 · 2019年1月23日
基础 | 深度学习中的优化算法
黑龙江大学自然语言处理实验室
5+阅读 · 2018年5月11日
入门 | 理解深度学习中的学习率及多种选择策略
如何找到最优学习率?
AI研习社
11+阅读 · 2017年11月29日
【教程】如何估算深度神经网络的最优学习率
GAN生成式对抗网络
5+阅读 · 2017年11月18日
Arxiv
0+阅读 · 2021年1月29日
Arxiv
0+阅读 · 2021年1月28日
Arxiv
11+阅读 · 2019年6月19日
Sparse Sequence-to-Sequence Models
Arxiv
5+阅读 · 2019年5月14日
Arxiv
7+阅读 · 2018年6月8日
Arxiv
3+阅读 · 2018年2月12日
Arxiv
11+阅读 · 2018年1月18日
VIP会员
相关资讯
PyTorch  深度学习新手入门指南
机器学习算法与Python学习
9+阅读 · 2019年9月16日
PyTorch 学习笔记(七):PyTorch的十个优化器
极市平台
8+阅读 · 2019年5月19日
PyTorch中在反向传播前为什么要手动将梯度清零?
极市平台
39+阅读 · 2019年1月23日
基础 | 深度学习中的优化算法
黑龙江大学自然语言处理实验室
5+阅读 · 2018年5月11日
入门 | 理解深度学习中的学习率及多种选择策略
如何找到最优学习率?
AI研习社
11+阅读 · 2017年11月29日
【教程】如何估算深度神经网络的最优学习率
GAN生成式对抗网络
5+阅读 · 2017年11月18日
相关论文
Arxiv
0+阅读 · 2021年1月29日
Arxiv
0+阅读 · 2021年1月28日
Arxiv
11+阅读 · 2019年6月19日
Sparse Sequence-to-Sequence Models
Arxiv
5+阅读 · 2019年5月14日
Arxiv
7+阅读 · 2018年6月8日
Arxiv
3+阅读 · 2018年2月12日
Arxiv
11+阅读 · 2018年1月18日
Top
微信扫码咨询专知VIP会员