美文网首页
Pytorch学习笔记(8) Pytorch 常用的优化算法

Pytorch学习笔记(8) Pytorch 常用的优化算法

作者: 银色尘埃010 | 来源:发表于2020-05-14 16:32 被阅读0次

Pytorch中如何使用优化方法。
torch.optim是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。

一、如何使用

首先看看最简单的使用方式

(1)定义优化算法和损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
loss_fn =  torch.nn.MSELoss()

(2) 三步走
optimizer.zero_grad()
loss = loss_fn(model(input), target)
loss..backward()
optimizer.step()

经过以上的基本步骤,实现了模型参数的更新。

仔细来看:

  • 构建
    为了构建一个Optimizer,你需要给它一个包含了需要优化的参数(必须都是Variable对象)的iterable。然后,你可以设置optimizer的参 数选项,比如学习率,权重衰减,等等。
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)
  • 为每个参数单独设置选项
    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将会被用于所 有的参数。

  • 进行单次优化

所有的optimizer都实现了step()方法,这个方法会更新所有的参数。它能按两种方式来使用:
optimizer.step()
这是大多数optimizer所支持的简化版本。一旦梯度被如backward()之类的函数计算好后,我们就可以调用这个函数。

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)

二、常见的优化算法

  • class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

  • class torch.optim.SGD(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

  • class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

  • class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)

  • class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)

  • ...
    还有如: Rprop, LBFGS, ASGD, Adamax, Adadelta等优化算法,感兴趣的可以自己去文档里面看详细介绍。torch-optim 中文文档

最后是所有优化函数的基类:

  • class torch.optim.Optimizer(params, defaults)
    包含的方法:
    1、load_state_dict(state_dict)
    optimizer的状态。是一个调用state_dict()所返回的对象。和state_dict()配合使用,先保存吗, 再加载。
    2、state_dict()
    以dict返回optimizer的状态。和model的state_dict相似,一般在保存模型参数的时候可以把优化器的参数一起保存。
    3、step(closure)
    单步优化
    4、zero_grad()
    清空所有被优化过的Variable的梯度. 在写的时候也可以用model.zero_grad()

相关文章

网友评论

      本文标题:Pytorch学习笔记(8) Pytorch 常用的优化算法

      本文链接:https://www.haomeiwen.com/subject/kqjudhtx.html