[实践应用] 深度学习之优化器

文章总览:YuanDaiMa2048博客文章总览


深度学习之优化器

    • 1. 随机梯度下降(SGD)
    • 2. 动量优化(Momentum)
    • 3. 自适应梯度(Adagrad)
    • 4. 自适应矩估计(Adam)
    • 5. RMSprop
    • 总结
    • 其他介绍

在深度学习中,优化器用于更新模型的参数,以最小化损失函数。常见的优化函数有很多种,下面是几种主流的优化器及其特点、原理和 PyTorch 实现:

1. 随机梯度下降(SGD)

原理: 随机梯度下降通过对每个小批量数据计算梯度,并根据梯度更新参数。它是最基本的优化算法,易于实现,但可能在复杂问题上表现较差。

公式:
θ = θ − η ∇ θ J ( θ ) \theta = \theta - \eta \nabla_\theta J(\theta) θ=θηθJ(θ)

其中:

  • θ \theta θ 是模型参数。
  • η \eta η 是学习率。
  • ∇ θ J ( θ ) \nabla_\theta J(\theta) θJ(θ) 是损失函数 J J J 对参数 θ \theta θ 的梯度。

PyTorch 代码:

import torch.optim as optim

# 定义模型
model = nn.Linear(10, 1)

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

2. 动量优化(Momentum)

原理: 在 SGD 的基础上,动量优化引入了“动量”项,以加速收敛并减少震荡。动量优化的核心思想是根据过去的梯度累积来更新参数。

公式:
v = β v + ( 1 − β ) ∇ θ J ( θ ) v = \beta v + (1 - \beta) \nabla_\theta J(\theta) v=βv+(1β)θJ(θ)
θ = θ − η v \theta = \theta - \eta v θ=θηv

其中:

  • v v v 是动量项。
  • β \beta β 是动量超参数(通常在 0.9 到 0.99 之间)。

PyTorch 代码:

import torch.optim as optim

# 定义模型
model = nn.Linear(10, 1)

# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

3. 自适应梯度(Adagrad)

原理: Adagrad 通过调整每个参数的学习率,以适应不同的参数频率。这使得稀疏特征得到更多的更新,而频繁特征的更新则减少。

公式:
θ = θ − η G t + ϵ ∇ θ J ( θ ) \theta = \theta - \frac{\eta}{\sqrt{G_{t} + \epsilon}} \nabla_\theta J(\theta) θ=θGt+ϵ ηθJ(θ)

其中:

  • G t G_t Gt 是梯度平方的累积和。
  • ϵ \epsilon ϵ 是避免除零的平滑项(通常设置为 1e-8)。

PyTorch 代码:

import torch.optim as optim

# 定义模型
model = nn.Linear(10, 1)

# 定义优化器
optimizer = optim.Adagrad(model.parameters(), lr=0.01)

4. 自适应矩估计(Adam)

原理: Adam 结合了动量优化和自适应梯度的优点,通过一阶矩(平均梯度)和二阶矩(梯度平方的均值)来调整每个参数的学习率。

公式:
m t = β 1 m t − 1 + ( 1 − β 1 ) ∇ θ J ( θ ) m_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla_\theta J(\theta) mt=β1mt1+(1β1)θJ(θ)
v t = β 2 v t − 1 + ( 1 − β 2 ) ( ∇ θ J ( θ ) ) 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) (\nabla_\theta J(\theta))^2 vt=β2vt1+(1β2)(θJ(θ))2
m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t} m^t=1β1tmt
v ^ t = v t 1 − β 2 t \hat{v}_t = \frac{v_t}{1 - \beta_2^t} v^t=1β2tvt
θ = θ − η m ^ t v ^ t + ϵ \theta = \theta - \frac{\eta \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θ=θv^t +ϵηm^t

其中:

  • m t m_t mt 是一阶矩估计(均值)。
  • v t v_t vt 是二阶矩估计(方差)。
  • β 1 \beta_1 β1 β 2 \beta_2 β2 是动量和二阶矩的衰减率(通常设置为 0.9 和 0.999)。
  • ϵ \epsilon ϵ 是避免除零的平滑项(通常设置为 1e-8)。

PyTorch 代码:

import torch.optim as optim

# 定义模型
model = nn.Linear(10, 1)

# 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

5. RMSprop

原理: RMSprop 通过对每个参数的梯度平方的移动平均来调整学习率,使得频繁更新的参数有较小的学习率,而不常更新的参数有较大的学习率。

公式:
v t = β v t − 1 + ( 1 − β ) ( ∇ θ J ( θ ) ) 2 v_t = \beta v_{t-1} + (1 - \beta) (\nabla_\theta J(\theta))^2 vt=βvt1+(1β)(θJ(θ))2
θ = θ − η ∇ θ J ( θ ) v t + ϵ \theta = \theta - \frac{\eta \nabla_\theta J(\theta)}{\sqrt{v_t} + \epsilon} θ=θvt +ϵηθJ(θ)

其中:

  • v t v_t vt 是梯度平方的均值。
  • β \beta β 是衰减率(通常设置为 0.9)。

PyTorch 代码:

import torch.optim as optim

# 定义模型
model = nn.Linear(10, 1)

# 定义优化器
optimizer = optim.RMSprop(model.parameters(), lr=0.01)

总结

  • SGD: 基础的优化方法,简单直接。
  • Momentum: 引入动量以加速收敛并减少震荡。
  • Adagrad: 根据参数的稀疏性调整学习率。
  • Adam: 综合了动量和自适应学习率的优点,适用于大多数任务。
  • RMSprop: 通过调整学习率来应对不同的特征频率。

其他介绍

  • 深度学习之激活函数
  • 深度学习之损失函数

你可能感兴趣的:(深度学习,工具使用,pytorch,深度学习,人工智能,机器学习,python,优化器)