一、优化器作用
PyTorch的优化器在深度学习模型的训练过程中起着至关重要的作用。它们的主要功能是根据计算得到的梯度信息来更新模型的参数,以最小化损失函数。以下是PyTorch优化器的主要作用:
- 参数更新:优化器负责根据计算得到的梯度信息更新模型的参数。梯度表示了损失函数关于每个参数的变化率,通过将梯度与学习率相乘,优化器可以决定参数在每个训练步骤中的更新幅度。
- 学习率调整:优化器还可以控制学习率的调整。学习率决定了参数更新的步长,过大或过小的学习率都可能导致训练不稳定或收敛速度缓慢。一些优化器提供了自适应调整学习率的功能,根据训练进程或其他因素自动调整学习率的大小。
- 参数优化算法:优化器实现了不同的参数优化算法,如随机梯度下降(SGD)、Adam、Adagrad、RMSprop等。这些算法在计算参数更新时使用不同的策略和规则,以提高训练效果和收敛速度。
- 动量:一些优化器支持动量的概念,通过引入动量项来加速参数更新。动量可以帮助优化器在参数空间中更快地搜索,并有助于克服局部最小值的困境。
总而言之,PyTorch的优化器在深度学习模型的训练中起着关键的作用,负责根据梯度信息更新模型参数、调整学习率,并利用不同的优化算法和技术来提高训练效果和收敛速度。选择合适的优化器要根据具体的问题和模型特性进行调整和实验
二、torch.optim
torch.optim是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。
三、如何使用optimizer
为了使用torch.optim,你需要构建一个optimizer对象。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。
1.构建
为了构建一个Optimizer,你需要给它一个包含了需要优化的参数(必须都是Variable对象)的iterable。然后,你可以设置optimizer的参数选项,比如学习率,权重衰减,等等。
例子:
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)
2.为每个参数单独设置选项
Optimizer也支持为每个参数单独设置选项。若想这么做,不要直接传入Variable的iterable,而是传入dict的iterable。每一个dict都分别定义了一组参数,并且包含一个param键,这个键对应参数的列表。其他的键应该optimizer所接受的其他参数的关键字相匹配,并且会被用于对这组参数的优化。
注意:
你仍然能够传递选项作为关键字参数。在未重写这些选项的组中,它们会被用作默认值。当你只想改动一个参数组的选项,但其他参数组的选项不变时,这是 非常有用的。
例如,当我们想指定每一层的学习率时,这是非常有用的
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的学习率,并且0.9的momentum将会被用于所有的参数。
3.进行单次优化
所有的optimizer都实现了step()方法,这个方法会更新所有的参数。它能按两种方式来使用:
(1)optimizer.step()
这是大多数optimizer所支持的简化版本。一旦梯度被如backward()之类的函数计算好后,我们就可以调用这个函数。
例子optimizer.zero_grad() output = model(input) loss = loss_fn(output, target) loss.backward() optimizer.step()
(2)optimizer.step(closure)
一些优化算法例如Conjugate Gradient和LBFGS需要重复多次计算函数,因此你需要传入一个闭包去允许它们重新计算你的模型。这个闭包应当清空梯度, 计算损失,然后返回。
for input, target in dataset:
def closure():
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
return loss
optimizer.step(closure)