我有一个关于Keras学习率下降的问题。我需要了解选项衰减在优化器中的工作原理,以便将其转换为等效的PyTorch公式。
从SGD的源代码中,我看到每次批量更新后都以这种方式完成了更新:
lr = self.lr * (1. / (1. + self.decay * self.iterations))
这是否意味着在每次批量更新后,lr会从其先前更新的值或其初始值开始更新?我的意思是,以下两种解释中哪一种是正确的?
lr = lr_0 * (1. / (1. + self.decay * self.iterations))
或
lr = lr * (1. / (1. + self.decay * self.iterations))
,
其中lr
是先前迭代之后更新的lr,而lr_0
始终是初始学习率。
如果正确的答案是第一个,那么就我而言,这意味着学习率将在100个纪元后从0.001下降到0.0002,而在第二个情况中,学习率将在1e-230左右从0.001下降。在70个时代之后。
为给您提供一些背景信息,我正在与CNN合作解决图像回归问题,我只需要将Keras代码转换为Pytorch代码即可。到目前为止,使用上述第二种解释,无论批次大小和测试时间的输入如何,我都只能总是预测相同的值。
在此先感谢您的帮助!
答案 0 :(得分:1)
基于Keras中的实现,我认为您的第一个表述是正确的,即包含初始学习率的表述(请注意,self.lr
不会被更新)。
但是我认为您的计算可能不正确:因为分母是相同的,并且lr_0
> = lr
因为您在进行衰减,因此第一个公式必须得出更大的数字。
我不确定PyTorch是否可以使用这种衰减,但是您可以使用torch.optim.lr_scheduler.LambdaLR
轻松创建类似的东西。
decay = .001
fcn = lambda step: 1./(1. + decay*step)
scheduler = LambdaLR(optimizer, lr_lambda=fcn)
最后,不要忘记您将需要在调度程序上显式调用.step()
,单步执行优化程序是不够的。另外,大多数情况下,学习计划仅在一个完整的时期之后才完成,而不是在每个批次之后才进行,但是我看到您在这里只是在重新创建Keras行为。
答案 1 :(得分:0)
实际上,mkisantal的响应可能是不正确的,因为关于keras中学习率的实际方程式(至少是这样,现在没有默认的衰减选项)是这样的:
lr = lr * (1. / (1. + self.decay * self.iterations))
(请参见https://github.com/keras-team/keras/blob/2.2.0/keras/optimizers.py#L178)
并且mkisantal提出的解决方案缺少重复/乘法项lr
,因此更准确的版本应基于MultiplicativeLR:
decay = .001
fcn = lambda step: 1./(1. + decay*step)
scheduler = MultiplicativeLR(optimizer, lr_lambda=fcn)