Pytorch教程入门系列 10----优化器介绍


前言

一、什么叫优化器

用于优化模型的参数。在选择优化器时,需要考虑模型的结构、模型的数据量、模型的目标函数等因素。
优化器是一种算法,用于训练模型并使模型的损失最小化。它通过不断更新模型的参数来实现这一目的。
优化器通常用于深度学习模型,因为这些模型通常具有大量可训练参数,并且需要大量数据和计算来优化。优化器通过不断更新模型的参数来拟合训练数据,从而使模型在新数据上表现良好。

二、优化器的种类介绍

1、SGD(Stochastic Gradient Descent)

  • 思想

SGD是一种经典的优化器,用于优化模型的参数。SGD的基本思想是,通过梯度下降的方法,不断调整模型的参数,使模型的损失函数最小化。SGD的优点是实现简单、效率高,缺点是收敛速度慢、容易陷入局部最小值。

  • 数学表达

通过如下的方式来更新模型的参数:

θ ( t + 1 ) = θ ( t ) − α ⋅ ∇ θ J ( θ ( t ) ) \theta^{(t+1)} = \theta^{(t)} - \alpha \cdot \nabla_{\theta} J(\theta^{(t)}) θ(t+1)=θ(t)αθJ(θ(t))
其中, θ ( t ) 表 示 模 型 在 第 \theta^{(t)}表示模型在第 θ(t)t$次迭代时的参数值, α \alpha α表示学习率, ∇ θ J ( θ ( t ) ) \nabla_{\theta} J(\theta^{(t)}) θJ(θ(t))表示损失函数 J ( θ ) J(\theta) J(θ)关于模型参数 θ \theta θ的梯度。

  • 实际使用

在PyTorch中,可以使用torch.optim.SGD类来实现SGD。

# 定义模型
model = ...

# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 训练模型
for inputs, labels in dataset:
    # 计算损失函数
    outputs = model(inputs)
    loss = ...

    # 计算梯度
    optimizer.zero_grad()
    loss.backward()

    # 更新参数
    optimizer.step()

首先定义了模型,然后定义了SGD优化器,并指定了学习率为0.1。接着,通过循环迭代数据集,计算损失函数和梯度,并更新模型的参数。通过这样的方式,就可以在PyTorch中使用SGD来训练模型了。

2、Adam

  • 思想

Adam是一种近似于随机梯度下降的优化器,用于优化模型的参数。Adam的基本思想是,通过维护模型的梯度和梯度平方的一阶动量和二阶动量,来调整模型的参数。Adam的优点是计算效率高,收敛速度快,缺点是需要调整超参数。

  • 数学表达

  • 通过如下的方式来更新模型的参数:

m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt1+(1β1)gt

v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt1+(1β2)gt2

其中, m t m_t mt v t v_t vt分别表示梯度的一阶动量和二阶动量, g t g_t gt表示模型在第 t t t次迭代时的梯度, β 1 \beta_1 β1 β 2 \beta_2 β2是超参数。

θ ( t + 1 ) = θ ( t ) − α v t + ϵ m t \theta^{(t+1)} = \theta^{(t)} - \frac{\alpha}{\sqrt{v_t} + \epsilon} m_t θ(t+1)=θ(t)vt +ϵαmt
其中, θ ( t ) \theta^{(t)} θ(t)表示模型在第 t t t次迭代时的参数值, α \alpha α表示学习率, m t m_t mt v t v_t vt分别表示梯度的一阶动量和二阶动量, ϵ \epsilon ϵ是一个小常数,用于防止分母为0。

  • 实际使用

在PyTorch中,可以使用torch.optim.Adam类来实现Adam。

# 定义模型
model = ...

# 定义优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.1, betas=(0.9, 0.999))

# 训练模型
for inputs, labels in dataset:
    # 计算损失函数
    outputs = model(inputs)
    loss = ...

    # 计算梯度
    optimizer.zero_grad()
    loss.backward()

    # 更新参数
    optimizer.step()

上面的代码中,首先定义了模型,然后定义了Adam优化器,并指定了学习率为0.1, β 1 \beta_1 β1 β 2 \beta_2 β2的值分别为0.9和0.999。接着,通过循环迭代数据集,计算损失函数和梯度,并更新模型的参数。通过这样的方式,就可以在PyTorch中使用Adam来训练模型了。

3、RMSprop(Root Mean Square Propagation)

  • 思想

RMSprop是一种改进的随机梯度下降优化器,用于优化模型的参数。RMSprop的基本思想是,通过维护模型的梯度平方的指数加权平均,来调整模型的参数。RMSprop的优点是收敛速度快,缺点是计算复杂度高,需要调整超参数。

  • 数学表达

具体来说,RMSprop优化算法的公式如下:

g t + 1 = α g t + ( 1 − α ) g t 2 g_{t+1} = \alpha g_t + (1 - \alpha) g_t^2 gt+1=αgt+(1α)gt2

θ t + 1 = θ t − η g t + 1 + ϵ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{g_{t+1} + \epsilon}} θt+1=θtgt+1+ϵ η

其中, g t g_t gt表示模型在第 t t t次迭代中的梯度的平方和, θ t \theta_t θt表示模型在第 t t t次迭代中的参数值, α \alpha α表示梯度的指数衰减率, η \eta η表示学习率, ϵ \epsilon ϵ表示一个小常数,用于防止除数为0。

  • 实际使用

在PyTorch中,可以使用torch.optim.Adam类来实现Adam。

import torch

# 定义模型
model = MyModel()

# 如果可用则model移至GPU
if torch.cuda.is_available():
    model = model.cuda()

# 设定训练模式
model.train()
# 定义 RMSprop 优化器
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)

# 循环训练
for input, target in dataset:
    # 如果可用则将input、target移至GPU
    if torch.cuda.is_available():
        input = input.cuda()
        target = target.cuda()

    # 前向传递:通过将输入传递给模型来计算预测输出
    output = model(input)

    # 计算损失
    loss = loss_fn(output, target)

    # 清除所有优化变量的梯度
    optimizer.zero_grad()

    # 反向传递:计算损失相对于模型参数的梯度
    loss.backward()

    # 执行单个优化步骤(参数更新)
    optimizer.step()

上面的代码中,首先定义了模型,并将其转换为训练模式。然后定义了RMSprop优化器,并指定了要优化的模型参数,学习率为0.1, α \alpha α的值为0.9。接着,通过循环迭代数据集,计算损失函数和梯度,并更新模型的参数。通过这样的方式,就可以在PyTorch中使用RMSprop来训练模型了。


总结

除了上面提到的三种优化器,PyTorch还提供了多种优化器,比如Adadelta、Adagrad、AdamW、SparseAdam等。要使用优化器,需要定义模型并转换为训练模式,然后定义优化器并指定要优化的模型参数和学习率。在训练循环中,每次迭代都要计算模型的损失,然后使用优化器来更新模型参数。选择优化器时,需要根据实际情况选择合适的优化器。另外,优化器的超参数也需要适当调整,以获得较好的优化效果。

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV_Today

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值