1. lr_scheduler综述
torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。
学习率的调整应该放在optimizer更新之后,下面是一个参考:
>>> model = [Parameter(torch.randn(2, 2, requires_grad=True))]
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.LinearLR(self.opt, start_factor=0.5, total_iters=4)
>>> for epoch in range(20):
>>> for input, target in dataset:
>>> optimizer.zero_grad()
>>> output = model(input)
>>> loss = loss_fn(output, target)
>>> loss.backward()
>>> optimizer.step()
>>> scheduler.step()
注意: 在PyTorch 1.1.0之前的版本,学习率的调整应该被放在optimizer更新之前的。如果我们在 1.1.0 及之后的版本仍然将学习率的调整(即 scheduler.step())放在 optimizer’s update(即 optimizer.step())之前,那么 learning rate schedule 的第一个值将会被跳过。所以如果某个代码是在 1.1.0 之前的版本下开发,但现在移植到 1.1.0及之后的版本运行,发现效果变差,需要检查一下是否将scheduler.step()放在了optimizer.step()之前。
2. optimizer综述
torch.optim 是一个实现各种优化算法的包。
要使用torch.optim,必须构造一个optimizer对象,该对象将保持当前状态,并将根据计算出的梯度更新参数。
要构造一个optimizer,我们必须给它一个包含要优化的参数(所有参数应该是Variable类型)的迭代器。然后,可以指定特定于optimizer的选项,如学习率、权重衰减等。
例如:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.05)
optimizer也支持指定每个参数的选项。要做到这一点,不是传递一个Variable的迭代,而是传递一个可迭代的dict。每个变量都将定义一个单独的parameter group,并且应该包含一个 params 键,包含一个属于它的参数列表。其他键应该与优化器接受的关键字参数匹配,并将用作该组的优化选项。
我们仍然可以将选项作为关键字参数传递。它们将作为默认值,在没有覆盖它们的组中使用。如果只希望改变单个选项,同时保持参数组之间所有其他选项的一致性时,这种方法非常有用。
例如,想要指定每层的学习速度时:
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
则:model.base 的参数将使用默认的学习率1e-2,model.classifier 的参数将使用学习率1e-3,并且所有参数的momentum为0.9。
所有的优化器都实现了一个 step()方法来更新参数:optimizer.step()。当使用如backward()等方法计算出梯度后,就可以调用step()更新参数。
例如:
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
torch.optim.optimizer(params, defaults)
参数:
- params(iterable) - 可迭代的torch.Tensor或dict,用来指定需要优化的张量。
- defaults(dict) - dict,包含优化选项的默认值(当参数组没有指定它们时生效)。
方法:
- Optimizer.add_param_group - 添加一个参数组到优化器的参数组
- Optimizer.load_state_dict - 加载优化器状态
- Optimizer.state_dict - 以字典形式返回优化器的状态
- Optimizer.step - 执行单个优化步骤(参数更新)
- Optimizer.zero_grad - 所有需优化张量的梯度清零
3. linearLR综述
- 在epoch数达到total_iters数值之前,使用线性改变乘法因子衰减学习率。
- 计算公式和pytorch计算代码如下:
def _get_closed_form_lr(self): return [base_lr * (self.start_factor + (self.end_factor - self.start_factor) * min(self.total_iters, self.last_epoch) / self.total_iters) for base_lr in self.base_lrs]
- pytorch调用及相关参数:
torch.optim.lr_scheduler.LinearLR(optimizer, start_factor=0.3333333333333333, end_factor=1.0, total_iters=5, last_epoch=- 1, verbose=False)
参数:
-
-
optimizer(Optimizer) -包装优化器。
-
start_factor(float) -我们在第一个 epoch 中乘以学习率(base_lr)的数字。在接下来的 epoch 中,乘法因子向 end_factor 变化。默认值:1./3。
-
end_factor(float) -我们在线性变化过程结束时乘以学习率(base_lr)的数字。默认值:1.0。
-
total_iters(int) -乘法因子达到1的迭代次数。默认值:5。
-
last_epoch(int) -最后一个纪元的索引。默认值:-1。
-
verbose(bool) -如果
True
,每次更新都会向标准输出打印一条消息。默认值:False
。
-
通过线性改变小的乘法因子来衰减每个参数组的学习率,直到 epoch 的数量达到预定义的里程碑:total_iters。
请注意,这种衰减可能与此调度程序外部对学习率的其他更改同时发生。当last_epoch=-1 时,设置初始 lr 为 lr。
- 举例说明:
lr_scheduler = LinearLR(optimizer, start_factor=0.5, total_iters=4)
base_lr=0.05
# epoch == 0→lr = base_lr * start_factor = 0.05 * 0.5=0.025;
# epoch == 1→lr = 0.05 * (0.5 + 0.5 * 0.25) = 0.3125;
......
# epoch ≥ 4→lr = base_lr * end_factor = 0.05(当epoch数等于total_iters时,min(self.total_iters, self.last_epoch) / self.total_iters = 1)
标签:optimizer,self,学习,epoch,lr,linearLR,factor,-----,参数 From: https://www.cnblogs.com/zz-w/p/16756527.html