欢迎来到彩壳资讯
彩壳资讯
当前位置:彩壳资讯 > 数码

如何在pytorch中使用Schedule和warmup_steps?

日期:2023-10-03 10:41

在机器学习中,schedule的使用非常重要,用于调整学习率,并且warmup_steps也参与了schedule的使用,作为耐心系数。在下面的文章中,我们将学习如何使用pytorch进行调度。

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(自我, 步骤):
        # 线性变换返回某个值x,然后返回到类LambdaLR,最后返回old_lr*x
        if step < self.warmup_steps: # 提高学习率
            返回 float(step) / float(max(1, self.warmup_steps))
        # 降低学习率
        返回 max(0.0, float(self.t_total - 步骤) / float(max(1.0, self.t_total - self.warmup_steps)))

实际运行时,lr_scheduler.step()首先将lr初始化为0,第一次参数更新时,step=1,lr从0变为初始值initial_lr;第二次更新时,step=2,以上代码生成某个实数alpha,new lr=initial_lr *alpha;第三次更新时,根据initial_lr生成新的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。

通常我们有

优化器 = optim.SGD(model.parameters(), lr = 0.01, 动量 = 0.9)
调度程序= lr_scheduler.StepLR(优化器,step_size = 100,gamma = 0.1)
model = net.train(模型、loss_function、优化器、调度器、num_epochs = 100)

scheduler中的step_size是指scheduler.step()每调用一次step_size,就会根据策略调整对应的学习率。

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

总结

以上就是pytorch中如何使用schedule的全部内容了。希望能给大家一个参考,也希望大家支持W3Cschool。


关灯