Pytorch 中的 优化器

1. 介绍

torch.optim 是PyTorch库中的一个优化器模块,用于实现各种优化算法。优化器模块提供了一系列优化算法,如随机梯度下降(SGD)、Adam、Adagrad 等。这些优化算法用于调整神经网络的权重和学习率,以最小化损失函数。通过优化算法,可以帮助神经网络更快地收敛到最优解,提高训练效率和准确率。

2. 常见的优化算法

1. SGD 算法

class torch.optim.SGD(params, lr=0.001, momentum=0, dampening=0, weight_decay=0, nesterov=False, *, maximize=False, foreach=None, differentiable=False, fused=None)

optim.SGD 是 torch.optim 模块中的随机梯度下降(SGD)优化器类。它的参数介绍如下:

  • params:包含网络参数的可迭代对象。通常使用模型的 parameters() 方法来获取网络的参数。 eg: SGD(myModule_1.parameters(),lr=0.01)  来优化模型的所有参数
  • lr:学习率(learning rate),用于控制权重更新的步长。默认值为0.001。
  • momentum:动量参数,用于加速梯度下降算法。默认值为0。
  • dampening:动量的抑制因子。默认值为0。
  • weight_decay:权重衰减参数,用于控制模型的正则化项。默认值为0。
  • nesterov:是否使用 Nesterov 动量。默认值为False。

SGD 优化器通过调整网络的权重来最小化损失函数,核心思想是通过计算损失函数的梯度,沿着梯度的反方向更新网络的权重,从而逐步接近最优解学习率决定了每次更新的步长,动量则决定了更新方向的惯性。通过调整学习率和动量的大小,可以影响优化过程的速度和稳定性。

 注意:在使用时 需要:

optim = torch.optim.SGD(myModule_1.parameters(),lr=0.01) 

# 模型优化的步骤:

#  首先 需要将 数据清零,再进行反向传播与优化

optim.zero_grad() # 将 数据 清零
result_loss.backward() # 反向传播,求出每个节点的梯度
optim.step()      # 进行调优

 示例:

import torch.optim
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential, CrossEntropyLoss
from torch.utils.data import DataLoader

input = torchvision.datasets.CIFAR10("../TorchVersion/dataset",train=True,
                                     transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(input,batch_size=64)

class myModule(nn.Module):
    def __init__(self):
        super(myModule, self).__init__()
        self.module1 = Sequential(
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),

            Flatten(),  # 展平
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self,x):
        x = self.module1(x)
        return x

myModule_1 = myModule()
cross_loss = CrossEntropyLoss()
optim = torch.optim.SGD(myModule_1.parameters(),lr=0.01)

for epoch in range(10):
    running_loss = 0.0
    for data in dataloader:
        img, target = data
        output = myModule_1(img)
        result_loss = cross_loss(output,target)

        optim.zero_grad() # 将 数据 清零
        result_loss.backward() # 反向传播,求出每个节点的梯度
        optim.step()      # 进行调优

        # 计算每一 epoch 的损失总值,判断是否完成了优化
        running_loss = running_loss + result_loss
    print(running_loss)

 2. Adam 算法

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False, *, foreach=None, maximize=False, capturable=False, differentiable=False, fused=None)

  • params‌:这是一个包含模型参数的迭代器,或者是定义了参数组的字典。这些参数是在训练过程中需要被优化的变量。
  • lr‌(学习率):一个浮点数,表示每个参数更新的步长。学习率是一个重要的超参数,它决定了模型在学习过程中的速度和稳定性。
  • betas‌:一个包含两个浮点数的元组,通常设置为(0.9, 0.999)。这两个值分别控制一阶矩估计和二阶矩估计的指数移动平均的系数。它们有助于调整优化器的动量。
  • eps‌:一个小的正数,用于增加数值计算的稳定性。默认值为10−810^{-8}10−8。
  • weight_decay‌:一个浮点数,表示权重衰减(L2正则化)的系数。权重衰减有助于防止过拟合,通过在损失函数中添加权重的平方和来实现。

Adam算法是在2014年提出的一种基于一阶梯度的优化算法,它结合了动量(Momentum)和RMSprop(Root Mean Square Propagation)的思想,自适应地调整每个参数的学习率。

Adam算法的核心在于计算每个参数的一阶矩(即梯度的均值)和二阶矩(即梯度的未中心化方差)的指数移动平均,并利用这些矩的估计值来调整每个参数的学习率。

Adam 算法梯度的对角缩放(diagonal rescaling)具有不变性,因此很适合求解带有大规模数据或参数的问题。该算法同样适用于解决大噪声和稀疏梯度的非稳态(non-stationary)问题。超参数可以很直观地解释,并只需要少量调整。

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值