pytorch中Schedule与warmup_steps的用法说明


Posted in Python onMay 24, 2021

1. lr_scheduler相关

lr_scheduler = WarmupLinearSchedule(optimizer, warmup_steps=args.warmup_steps, t_total=num_train_optimization_steps)

其中args.warmup_steps可以认为是耐心系数

num_train_optimization_steps为模型参数的总更新次数

一般来说:

num_train_optimization_steps = int(total_train_examples / args.train_batch_size / args.gradient_accumulation_steps)

Schedule用来调节学习率,拿线性变换调整来说,下面代码中,step是当前迭代次数。

def lr_lambda(self, step):
        # 线性变换,返回的是某个数值x,然后返回到类LambdaLR中,最终返回old_lr*x
        if step < self.warmup_steps: # 增大学习率
            return float(step) / float(max(1, self.warmup_steps))
        # 减小学习率
        return max(0.0, float(self.t_total - step) / float(max(1.0, self.t_total - self.warmup_steps)))

在实际运行中,lr_scheduler.step()先将lr初始化为0. 在第一次参数更新时,此时step=1,lr由0变为初始值initial_lr;在第二次更新时,step=2,上面代码中生成某个实数alpha,新的lr=initial_lr *alpha;在第三次更新时,新的lr是在initial_lr基础上生成,即新的lr=initial_lr *alpha。

其中warmup_steps可以认为是lr调整的耐心系数。

由于有warmup_steps存在,lr先慢慢增加,超过warmup_steps时,lr再慢慢减小。

在实际中,由于训练刚开始时,训练数据计算出的grad可能与期望方向相反,所以此时采用较小的lr,随着迭代次数增加,lr线性增大,增长率为1/warmup_steps;迭代次数等于warmup_steps时,学习率为初始设定的学习率;迭代次数超过warmup_steps时,学习率逐步衰减,衰减率为1/(total-warmup_steps),再进行微调。

2. gradient_accumulation_steps相关

gradient_accumulation_steps通过累计梯度来解决本地显存不足问题。

假设原来的batch_size=6,样本总量为24,gradient_accumulation_steps=2

那么参数更新次数=24/6=4

现在,减小batch_size=6/2=3,参数更新次数不变=24/3/2=4

在梯度反传时,每gradient_accumulation_steps次进行一次梯度更新,之前照常利用loss.backward()计算梯度。

补充:pytorch学习笔记 -optimizer.step()和scheduler.step()

optimizer.step()和scheduler.step()的区别

optimizer.step()通常用在每个mini-batch之中,而scheduler.step()通常用在epoch里面,但是不绝对,可以根据具体的需求来做。只有用了optimizer.step(),模型才会更新,而scheduler.step()是对lr进行调整。

通常我们有

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.9)
scheduler = lr_scheduler.StepLR(optimizer, step_size = 100, gamma = 0.1)
model = net.train(model, loss_function, optimizer, scheduler, num_epochs = 100)

在scheduler的step_size表示scheduler.step()每调用step_size次,对应的学习率就会按照策略调整一次。

所以如果scheduler.step()是放在mini-batch里面,那么step_size指的是经过这么多次迭代,学习率改变一次。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用PYTHON接收多播数据的代码
Mar 01 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
Python中类型检查的详细介绍
Feb 13 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
Python操作mongodb的9个步骤
Jun 04 Python
详解django2中关于时间处理策略
Mar 06 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
PyCharm中代码字体大小调整方法
Jul 29 Python
python反转列表的三种方式解析
Nov 08 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 Python
python 中yaml文件用法大全
Jul 04 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 #Python
pytorch交叉熵损失函数的weight参数的使用
May 24 #Python
pytorch 实现变分自动编码器的操作
May 24 #Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 #Python
Python基础之函数嵌套知识总结
May 23 #Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 #Python
Python基础之元编程知识总结
May 23 #Python
You might like
第七节 类的静态成员 [7]
2006/10/09 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
php和html的区别点详细总结
2019/09/24 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
基于JavaScript实现选项卡效果
2017/07/21 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python构建网页爬虫原理分析
2017/12/19 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
寄语是什么意思
2014/04/10 职场文书
男方婚前保证书
2015/02/28 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
爱国影片观后感
2015/06/18 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技