pytorch中Schedule与warmup_steps的⽤法说明
1. lr_scheduler相关
lr_scheduler = WarmupLinearSchedule(optimizer, warmup_steps=args.warmup_steps, t_total=num_train_optimization_steps)
其中args.warmup_steps可以认为是耐⼼系数schedule用法及搭配
num_train_optimization_steps为模型参数的总更新次数
⼀般来说:
num_train_optimization_steps = int(total_train_examples / ain_batch_size / adient_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 = ain(model, loss_function, optimizer, scheduler, num_epochs = 100)
在scheduler的step_size表⽰scheduler.step()每调⽤step_size次,对应的学习率就会按照策略调整⼀次。
所以如果scheduler.step()是放在mini-batch⾥⾯,那么step_size指的是经过这么多次迭代,学习率改变⼀次。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。