PyTorch学习(6):优化算法

2023-05-16

PyTorch学习(6):优化算法

  • Pytorch官方文档: https://pytorch-cn.readthedocs.io/zh/latest/
  • Pytorch学习文档: https://github.com/tensor-yu/PyTorch_Tutorial
  • 参考: https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-optim/#optimizer
        https://zhuanlan.zhihu.com/p/87209990?from_voters_page=true

文章目录

  • PyTorch学习(6):优化算法
    • 1.优化算法概述
      •  1)一阶优化算法
      •  2)二阶优化算法
    • 2.优化算法Torch.optim
    • 3.优化器基类 Optimizer
      •  1)zero_grad()
      •  2)step(closure)
      •  3)state_dict()
      •  4)load_state_dict(state_dict)
      •  5)add_param_group()
    • 4.PyTorch优化器
      •  1)torch.optim.SGD
      •  2)torch.optim.RMSprop
      •  3)torch.optim.Adam
      •  4)其他优化器
  • 总结


1.优化算法概述

  在机器学习或者深度学习中,模型需要通过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。
优化算法分为两大类。

 1)一阶优化算法

  这种算法使用各个参数的梯度值来更新参数,最常见的一阶优化算法是梯度下降。梯度下降的功能是通过寻找最小值,控制方差,更新模型参数,最终使模型收敛,网络的参数更新公式为:
  在这里插入图片描述
  其中 η \eta η是学习率, ∂ J ( θ ) ∂ θ \frac{\partial J( \theta )}{\partial \theta } θJ(θ)是函数的梯度。
  这是深度学习里面最常用的优化方法,目前已经有各种它的变式。

 2)二阶优化算法

  二阶优化算法使用二阶导数来最小化或最大化损失函数,主要基于牛顿法,但是由于二阶导数的计算成本很高,所以这种方法并没有广泛使用。

2.优化算法Torch.optim

  Torch.optim是一个实现各种优化算法的包,大多数常见的算法都能够直接通过这个包来调用,比如随机梯度下降,以及添加动量的随机梯度下降,自适应学习率等。在调用的时候将需要优化的参数传入,这些参数都必须是Variable,然后传入一些基本的设定,比如学习率和动量等。
下面举一个例子:
  optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
  如上所示就将模型的参数作为需要更新的参数传入优化器,设定学习率是0.01,动量是0.9的随机梯度下降,在优化之前需要先将梯度归零,即optimizer.zero_grad(),然后通过loss.backward()反向传播,自动求导得到每个参数的梯度,最后只需要optimizer.step() 就可以通过梯度做一步参数更新。

3.优化器基类 Optimizer

  基类链接: https://github.com/pytorch/pytorch/blob/master/torch/optim/optimizer.py
  PyTorch中所有的优化器(如:optim.Adadelta、optim.SGD、optim.RMSprop等)均是Optimizer的子类,Optimizer中定义了一些常用的方法,有zero_grad()、step(closure)、state_dict()、load_state_dict(state_dict)和add_param_group(param_group)

 1)zero_grad()

  功能: 将梯度清零。
  由于PyTorch不会自动清零梯度,所以在每次更新前会进行此操作。

 2)step(closure)

  功能: 执行一步权重更新,其中可传入参数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)

 3)state_dict()

  功能: 获取模型当前的参数,以一个有序字典形式返回。
  这个有序字典中,key是各层参数名,value就是参数值。

'state_dict': model.state_dict(),
'optimizer' : optimizer.state_dict()

 4)load_state_dict(state_dict)

  功能: 将state_dict中的参数加载到当前模型,常用于

model.load_state_dict(checkpoint['state_dict'])
optimizer.load_state_dict(checkpoint['optimizer'])

 5)add_param_group()

  功能: 给optimizer管理的参数组中增加一组参数,可为该组参数定制lr,momentum,weight_decay等,在finetune中常用。

optimizer.add_param_group({'params': w3, 'lr': 0.001, 'momentum': 0.8})

4.PyTorch优化器

 1)torch.optim.SGD

  CLASS torch.optim.SGD(params, lr=, momentum=0, dampening=0,
weight_decay=0, nesterov=False)

  功能:
    实现随机梯度下降算法(momentum可选)。
    Nesterov动量基于《On the importance of initialization and momentum in deep learning》中的公式。
  参数:
    params (iterable): 待优化参数的iterable或者是定义了参数组的dict;
    lr (float): 学习率;
    momentum (float, 可选): 动量因子(默认:0,通常设为0.8、0.9);
    weight_decay (float, 可选): 权重衰减(L2惩罚)(默认:0)
    dampening (float, 可选): 动量的抑制因子(默认:0)
    nesterov (bool, 可选): 使用Nesterov动量(默认:False)
  样例:

    optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
    optimizer.zero_grad()
    loss_fn(model(input), target).backward()
    optimizer.step()

 2)torch.optim.RMSprop

  CLASS torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
  功能:
    实现RMSprop优化方法(Hinton提出)。
    中心版本首次出现在《Generating Sequences With Recurrent Neural Networks》.
  参数:
    params (iterable): 待优化参数的iterable或者是定义了参数组的dict;
    lr (float, 可选): 学习率(默认:1e-2);
    momentum (float, 可选): 动量因子(默认:0);
    alpha (float, 可选): 平滑常数(默认:0.99);
    eps (float, 可选): 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8);
    centered (bool, 可选): 如果为True,计算中心化的RMSProp,并且用它的方差预测值对梯度进行归一化;
    weight_decay (float, 可选): 权重衰减(L2惩罚)(默认: 0)。

 3)torch.optim.Adam

  CLASS torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0,amsgrad=False)
  功能:
  实现Adam(Adaptive Moment Estimation))优化方法。Adam是一种自适应学习率的优化方法,Adam利用梯度的一阶矩估计和二阶矩估计动态的调整学习率。
  它在《Adam: A Method for Stochastic Optimization》中被提出。
  参数:
    params (iterable): 待优化参数的iterable或者是定义了参数组的dict;
    lr (float, 可选): 学习率(默认:1e-3);
    betas (Tuple[float, float], 可选): 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999);
    eps (float, 可选): 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8);
    weight_decay (float, 可选): 权重衰减(L2惩罚)(默认: 0)。

 4)其他优化器

  目前在深度学习任务上,常用的优化器为SGD、RMSprop和Adam。其他的PyTorch官方提供的优化器可根据任务需求,查找官方文档,了解详细内容。

(1)CLASS torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, 
weight_decay=0)
(2)CLASS torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
(3)CLASS torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, 
initial_accumulator_value=0, eps=1e-10)
(4)CLASS torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, 
weight_decay=0.01, amsgrad=False)
(5)CLASS torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)
(6)CLASS torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, 
weight_decay=0)
(7)CLASS torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None,
tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)
(8)CLASS torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))

总结

  至此,对PyTorch框架的优化算法进行了简单的了解,在实际应用中建议采用Adam或RMSprop优化算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyTorch学习(6):优化算法 的相关文章

随机推荐