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 22 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
TensorFlow 模型载入方法汇总(小结)
Jun 19 Python
python3.7.0的安装步骤
Aug 27 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
Pandas-Cookbook 时间戳处理方式
Dec 07 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
Anaconda安装pytorch及配置PyCharm 2021环境
Jun 04 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
angularjs下拉框空白的解决办法
2017/06/20 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
JavaScript中ES6规范中let和const的用法和区别
2020/08/06 Javascript
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
wxPython色环电阻计算器
2019/11/18 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
银行实习生自我鉴定范文
2013/09/19 职场文书
校园新闻广播稿
2014/01/10 职场文书
大学生的创业计划书就该这么写
2014/01/30 职场文书
三个儿子教学反思
2014/02/03 职场文书
主题教育活动总结
2014/05/05 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
办护照工作证明
2014/10/01 职场文书
转让协议书
2015/01/27 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript