首页 > 解决方案 > Transformers 调度器和 Pytorch 调度器的区别

问题描述

Transformers 还为学习率提供了自己的调度器,例如get_constant_scheduleget_constant_schedule_with_warmup等。它们再次返回torch.optim.lr_scheduler.LambdaLR(火炬调度器)。warmup_steps两者之间的唯一区别是什么?

我们如何创建一个自定义的基于转换器的调度器,类似于其他的 Torch 调度器,如lr_scheduler.MultiplicativeLR, lr_scheduler.StepLR, lr_scheduler.ExponentialLR?

标签: pythonpytorchhuggingface-transformers

解决方案


您可以通过在类中创建一个函数来创建自定义调度程序,该函数接受优化器及其状态字典并编辑其 param_groups 中的值。

要了解如何在一个类中构造它,只需看看 Pytorch 如何创建它的调度程序并使用相同的功能,只需根据自己的喜好更改功能即可。

我发现将是一个很好的参考的永久链接在这里

编辑评论后:

这就像您可以使用的模板

from torch.optim import lr_scheduler

class MyScheduler(lr_scheduler._LRScheduler # Optional inheritance):
    def __init__(self, # optimizer, epoch, step size, whatever you need as input to lr scheduler, you can even use vars from LRShceduler Class that you can inherit from etc.):
      super(MyScheduler, self).__init__(optimizer, last_epoch, verbose)
      # Put variables that you will need for updating scheduler like gamma, optimizer, or step size etc.
      self.optimizer = optimizer

    def get_lr(self):
       # How will you use the above variables to update the optimizer
       for group in self.optimizer.param_groups:
          group["lr"] = # Fill this out with updated optimizer

       return self.optimizer

您可以添加更多功能以增加功能。或者你可以使用一个函数来更新你的学习率。这将接收优化器并将其更改为 optimizer.param_groups[0]["lr"] 并返回新的优化器。


推荐阅读