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实现斐波那契递归函数的方法
Sep 08 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
python抓取百度首页的方法
May 19 Python
Python作用域用法实例详解
Mar 15 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python函数的默认参数设计示例详解
Dec 01 Python
python numpy数组复制使用实例解析
Jan 10 Python
python爬虫实例之获取动漫截图
May 31 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
Python logging模块handlers用法详解
Aug 14 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
使用PHP下载CSS文件中的图片的代码
2013/09/24 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
PHP中使用curl入门教程
2015/07/02 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
PHP goto语句用法实例
2019/08/06 PHP
jQuery参数列表集合
2011/04/06 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
python中stdout输出不缓存的设置方法
2014/05/29 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
PyQt5组件读取参数的实例
2019/06/25 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
Python logging设置和logger解析
2019/08/28 Python
ipad上运行python的方法步骤
2019/10/12 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
Python 支持向量机分类器的实现
2020/01/15 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
预备党员的自我评价
2014/03/12 职场文书
企业文化标语口号
2014/06/09 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
2014小学年度工作总结
2014/12/20 职场文书
红色故事汇观后感
2015/06/18 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
党章学习心得体会2016
2016/01/14 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
人生感悟经典句子
2019/08/20 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript