从零开始深度学习Pytorch笔记(13)—— torch.optim

浏览: 2442

image.png

前文传送门:

从零开始深度学习Pytorch笔记(1)——安装Pytorch

从零开始深度学习Pytorch笔记(2)——张量的创建(上)

从零开始深度学习Pytorch笔记(3)——张量的创建(下)

从零开始深度学习Pytorch笔记(4)——张量的拼接与切分

从零开始深度学习Pytorch笔记(5)——张量的索引与变换

从零开始深度学习Pytorch笔记(6)——张量的数学运算

从零开始深度学习Pytorch笔记(7)—— 使用Pytorch实现线性回归

从零开始深度学习Pytorch笔记(8)—— 计算图与自动求导(上)

从零开始深度学习Pytorch笔记(9)—— 计算图与自动求导(下)

从零开始深度学习Pytorch笔记(10)—— Dataset类

从零开始深度学习Pytorch笔记(11)—— DataLoader类

从零开始深度学习Pytorch笔记(12)—— nn.Module

在该系列的上一篇,我们讲解了nn.Module类,本篇我们来聊聊torch.optim。在机器学习和深度学习中,我们在训练阶段通常要不断修改调整参数,使得损失函数最小化,优化算法是一种调整模型参数更新的策略。torch.optim是一个实现各种优化算法的包,大多数常见的的算法都能够直接通过这个包来调用,例如随机梯度下降,加入了动量的随机梯度下降等等。为了使用torch.optim,你需要构建一个optimizer对象。然后,你可以设置optimizer的参数选项,比如学习率,权重衰减,等等。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)

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

#例如:
for input, target in dataset:
   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)

我们介绍几种优化算法和使用的方法:

随机梯度下降:Stochastic Gradient Descent (SGD)SGD算法是从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。

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

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float) – 学习率momentum (float, 可选) – 动量因子(默认:0)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)dampening (float, 可选) – 动量的抑制因子(默认:0)nesterov (bool, 可选) – 使用Nesterov动量(默认:False)动量梯度下降:Momentum此时的梯度不再只是当前数据的梯度,而是有一定权重的之前的梯度。要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。

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

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float) – 学习率momentum (float, 可选) – 动量因子(默认:0)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)dampening (float, 可选) – 动量的抑制因子(默认:0)nesterov (bool, 可选) – 使用Nesterov动量(默认:False)Adagrad优化学习率Adagrad使学习率适应不同的梯度:梯度越大越陡峭学习率越小,希望步子迈小一点(不希望越过最低点所以步子要小一点),梯度越小越平坦学习率越大希望步子迈大一点。随着时间的推移步长会衰减到0。

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

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float, 可选) – 学习率(默认: 1e-2)lr_decay (float, 可选) – 学习率衰减(默认: 0)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)RMSProp(root mean square prop)因为Adagrad算法会出现提前停止的现象,所以在RMSProp算法中解决了这个问题,它采用指数加权平均的思想,只将最近的梯度进行累加计算平方。

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

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float, 可选) – 学习率(默认:1e-2)momentum (float, 可选) – 动量因子(默认:0)alpha (float, 可选) – 平滑常数(默认:0.99)eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)centered (bool, 可选) – 如果为True,计算中心化的RMSProp,并且用它的方差预测值对梯度进行归一化weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)Adam

opt_Adam = torch.optim.Adam(params, lr=0.001, betas=(0.90.999), eps=1e-08, weight_decay=0)

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float, 可选) – 学习率(默认:1e-3)betas (Tuple[float, float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

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

SGD 是最普通的优化器, 也可以说没有加速效果, 而 Momentum 是 SGD 的改良版, 它加入了动量原则. 后面的 RMSprop 又是 Momentum 的升级版. 而 Adam 又是 RMSprop 的升级版。并不是越先进的优化器, 结果越佳. 我们在自己的试验中可以尝试不同的优化器, 找到那个最适合你数据/网络的优化器。本文主要给出了在Pytorch中如何使用这些优化算法,并给出了可调的参数,之后有机会可以仔细讲讲这几个优化算法的数学原理。欢迎关注公众号学习之后的深度学习连载部分~

扫码下图关注我们不会让你失望!

image.png

推荐 0
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册