每次重新启动后降低最大学习速率



我正在为基于计算机视觉的任务训练神经网络。对于优化器,我发现在整个训练中使用单一学习率并不理想,人们所做的是他们使用学习率调度器以特定方式衰减学习率。因此,为此,我尝试了PyTorch'sCosineAnnealingWarmRestarts().这样做是它以余弦方式退火/降低初始学习率(由我们设置(,直到它重新启动。在此"重新启动"之后,学习率被设置回初始学习率,并且循环再次发生。这对我来说效果很好,但我想对它进行一些更改。我想改变学习率,优化器在每次重启后分配,这样每次重启后优化器的最大学习率也会降低。这可以在 PyTorch 中完成吗?

在我看来,一个简单的解决方案就是从CosineAnnealingWarmRestarts继承,然后在覆盖的step函数中更改其self.optimizer参数。在伪代码中,这将是类似的

class myScheduler(torch.optim.lr_scheduler.CosineAnnealingWarmRestarts):
def __init__(self,
optimizer, 
T_0, 
T_mult=1,
eta_min=0,
last_epoch=-1):
#initialize base calss
super().__init__(.... blablabla ...)
def step(self):
#call step() from base class
#Do some book-keeping to determine if you've hit a restart 
#now change optimizer lr for each parameter group
if some_condition:#condition like number of iterations, restarts, etc
self.optimizer.param_groups[i]['lr']*=some_coef

我遇到了同样的问题,并根据 Ashs 的建议解决了它,在运行结束时继承了CosineAnnealingWarmRestarts和衰减η max

import math
from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts
class CosineAnnealingWarmRestartsDecay(CosineAnnealingWarmRestarts):
def __init__(self, optimizer, T_0, T_mult=1,
eta_min=0, last_epoch=-1, verbose=False, decay=1):
super().__init__(optimizer, T_0, T_mult=T_mult,
eta_min=eta_min, last_epoch=last_epoch, verbose=verbose)
self.decay = decay
self.initial_lrs = self.base_lrs

def step(self, epoch=None):
if epoch == None:
if self.T_cur + 1 == self.T_i:
if self.verbose:
print("multiplying base_lrs by {:.4f}".format(self.decay))
self.base_lrs = [base_lr * self.decay for base_lr in self.base_lrs]
else:
if epoch < 0:
raise ValueError("Expected non-negative epoch, but got {}".format(epoch))
if epoch >= self.T_0:
if self.T_mult == 1:
n = int(epoch / self.T_0)
else:
n = int(math.log((epoch / self.T_0 * (self.T_mult - 1) + 1), self.T_mult))
else:
n = 0

self.base_lrs = [initial_lrs * (self.decay**n) for initial_lrs in self.initial_lrs]
super().step(epoch)

最新更新