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 相关文章推荐
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
Python的净值数据接口调用示例分享
Mar 15 Python
用pickle存储Python的原生对象方法
Apr 28 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
对numpy中数组元素的统一赋值实例
Apr 04 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
Django Rest framework之权限的实现示例
Dec 17 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 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
PHP实时显示输出
2008/10/02 PHP
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
2019/03/21 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
复制js对象方法(详解)
2013/07/08 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
python logging类库使用例子
2014/11/22 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
keras实现多种分类网络的方式
2020/06/11 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
就业导师推荐信范文
2015/03/27 职场文书
办公室卫生管理制度
2015/08/04 职场文书
高中军训感想
2015/08/07 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL