pytorch中Schedule与warmup_steps的用法说明
作者:Bingoyear 发布时间:2023-07-07 00:18:14
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指的是经过这么多次迭代,学习率改变一次。
来源:https://blog.csdn.net/angel_hben/article/details/104538634
猜你喜欢
- 前几天因为一个例外,数据库在没有做备份的情况下,直接删除了表记录。事后,又需要查询到删除的记录的内容。因此,在网上软件SS了半天,发现Log
- 字体设计是人类商业活动的需求,它随着时代和科学技术的进步而不断地变化着。被广泛应用于网络生活的各个方面。现代字体设计在电脑技术的应用中已经深
- Thinkphp6的日志问题日志级别debug, info, notice, warning, error, critical, alert
- 1 Video介绍引用我翻译文档《在HTML5页面中嵌入音频和视频》中的介绍文字:“当今,在网页上嵌入视频且所有用户不管使用任何浏览器或者操
- detectres.asp<HTML><head><TITLE>asp教程之全能屏幕分辨率侦测</
- SQL Server 2008的独到之处:安装SQL Server 2008的设置和安装也有所改进。配置数据和引擎位已经分开了,所以它使创建
- 在我们关于SQL服务器安全系列的这文章里,我们的目标是向你提供安全安装SQL服务器所需要的工具和信心,这样的话,你有价值的数据就会受到保护,
- mysql数据库数据表和数据表关联--问题??用户数据表user 字词作品数据表article 短信 message外键ID 主键,之间的关
- 分页,就是按照某种规则显示分组数据集,但是在SQL Server 中,分页并不是十分容易就能够实现。在过去,开发人员通常需要自己编写程序,使
- 很简单的方法,但很实用。用过新浪邮箱的朋友应该会知道此脚本的效果。如果您提交的数据处理时间很长,用这个做为提示很不错的.将下面的代码复制到&
- 数据库的表Info,表部分结构:Info_Id  
- ASP木马防御: 代码如下:const adTypeBinary=1 dim jpg(1):jpg(0)=CB
- 概述基于Swoole的websocket服务,再之前的消息系统系列的第4篇,实现了更加复杂的业务场景,是对消息推送的完善和优化,代码本身就是
- Javascript 选择器(selector engine)似乎从 jQuery 流行以来就大行其道,改变了原有 Javascript 选
- QQWry.dat数据可以去百度搜索最新版本<%'======================================
- 请问如何在Oracle Setver端检测ODBC是否连接好了?首先,在SQLPLUS安装时勾选oracle open client ada
- 如果当前绝对定位的元素需要透明(没啥内容、且不设置背景),背景元素有内容透出来的时候,IE6/IE7响应的不是期望的当前元素,而是背景元素。
- 如何做一个文本书写器?我们有下面的的函数,可做“文本书写器”:<%function WriteToFile(FileName
- 其实SQLServer提供了一个sp_spaceused的系统存储过程可以实现该功能,下面就是调用的SQL: 代码如下:crea
- 1、简述asp的6个内置对象和其功能答案 : session ,server ,response,request,objectcontext