关于九游会 联系我们

咨询电话: 020-88888888

当前位置: 主页 > 新闻资讯 > 新政解读

PyTorch 优化器!

发布于 2024-05-06 05:49 阅读(

  • 优化的对象:优化参数
  • 优化的方法:优化算法

pytorch 中 torch.optim 包中给出了许多优化算法的实现,我们只需调用相应的 API 就能完成模型优化。我们现在人工智能学习优化往往是基于梯度来进行模型优化的,不断的调整参数获取最优解,每次调整的幅度称之为步长或学习率。在 pytorch 中还提供了许多学习率更新的方法。

构造一个优化器对象,维护当前状态,并基于梯度进行参数更新。

  • 给出优化参数:具体有哪些参数需要优化
  • 学习率:优化时的步长
  • 算法相关参数
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)

可以分层制定学习率

optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)
# base 学习率为 1e-2
# classifier 学习率为 1e-3
更多优化算法可查阅官网 优化算法

利用模型反向传播得到的梯度进行模型优化。pytorch 提供了两种方法

optimizer.step()方法

for input, target in dataset:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()

optimizer.step(closure) 方法

一些需要多次计算梯度的算法采用这种方法实现模型优化。

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)

3. 根据 epoch 调整学习率

torch.optim.lr_scheduler

  • StepLR
torch.optim.lr_scheduler.StepLR(*optimizer*, *step_size*, *gamma=0.1*, *last_epoch=- 1*, *verbose=False*)

给定的优化器对象中有需要更新的参数组和对应的学习率,每 step_sizeepochs 学习率乘gamma

python   
# Assuming optimizer uses lr=0.05 for all groups   
# lr=0.05     if epoch < 30   
# lr=0.005    if 30 <=epoch < 60   
# lr=0.0005   if 60 <=epoch < 90   
# ...   
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)   
for epoch in range(100):       
    train(...)       
    validate(...)       
    scheduler.step()    # 执行此步完成学习率更新
  • ExponentialLR
torch.optim.lr_scheduler.ExponentialLR(*optimizer*, *gamma*, *last_epoch=- 1*, *verbose=False*) 

每个epoch都进行学习率更新

更多更新策略可查阅官网 如何调整学习率

平台注册入口