0


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​=β1​mt−1​+(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​=β2​vt−1​+(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​=θt​−gt+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移至GPUif torch.cuda.is_available():
    model = model.cuda()# 设定训练模式
model.train()# 定义 RMSprop 优化器
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)# 循环训练forinput, target in dataset:# 如果可用则将input、target移至GPUif 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等。要使用优化器,需要定义模型并转换为训练模式,然后定义优化器并指定要优化的模型参数和学习率。在训练循环中,每次迭代都要计算模型的损失,然后使用优化器来更新模型参数。选择优化器时,需要根据实际情况选择合适的优化器。另外,优化器的超参数也需要适当调整,以获得较好的优化效果。


本文转载自: https://blog.csdn.net/weixin_46417939/article/details/128274510
版权归原作者 CV_Today 所有, 如有侵权,请联系我们删除。

“Pytorch教程入门系列 10----优化器介绍”的评论:

还没有评论