美文网首页
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