文章总览:YuanDaiMa2048博客文章总览
在深度学习中,优化器用于更新模型的参数,以最小化损失函数。常见的优化函数有很多种,下面是几种主流的优化器及其特点、原理和 PyTorch 实现:
原理: 随机梯度下降通过对每个小批量数据计算梯度,并根据梯度更新参数。它是最基本的优化算法,易于实现,但可能在复杂问题上表现较差。
公式:
θ = θ − η ∇ θ J ( θ ) \theta = \theta - \eta \nabla_\theta J(\theta) θ=θ−η∇θJ(θ)
其中:
PyTorch 代码:
import torch.optim as optim
# 定义模型
model = nn.Linear(10, 1)
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)
原理: 在 SGD 的基础上,动量优化引入了“动量”项,以加速收敛并减少震荡。动量优化的核心思想是根据过去的梯度累积来更新参数。
公式:
v = β v + ( 1 − β ) ∇ θ J ( θ ) v = \beta v + (1 - \beta) \nabla_\theta J(\theta) v=βv+(1−β)∇θJ(θ)
θ = θ − η v \theta = \theta - \eta v θ=θ−ηv
其中:
PyTorch 代码:
import torch.optim as optim
# 定义模型
model = nn.Linear(10, 1)
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
原理: Adagrad 通过调整每个参数的学习率,以适应不同的参数频率。这使得稀疏特征得到更多的更新,而频繁特征的更新则减少。
公式:
θ = θ − η G t + ϵ ∇ θ J ( θ ) \theta = \theta - \frac{\eta}{\sqrt{G_{t} + \epsilon}} \nabla_\theta J(\theta) θ=θ−Gt+ϵη∇θJ(θ)
其中:
PyTorch 代码:
import torch.optim as optim
# 定义模型
model = nn.Linear(10, 1)
# 定义优化器
optimizer = optim.Adagrad(model.parameters(), lr=0.01)
原理: 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=β1mt−1+(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=β2vt−1+(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
其中:
PyTorch 代码:
import torch.optim as optim
# 定义模型
model = nn.Linear(10, 1)
# 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)
原理: RMSprop 通过对每个参数的梯度平方的移动平均来调整学习率,使得频繁更新的参数有较小的学习率,而不常更新的参数有较大的学习率。
公式:
v t = β v t − 1 + ( 1 − β ) ( ∇ θ J ( θ ) ) 2 v_t = \beta v_{t-1} + (1 - \beta) (\nabla_\theta J(\theta))^2 vt=βvt−1+(1−β)(∇θJ(θ))2
θ = θ − η ∇ θ J ( θ ) v t + ϵ \theta = \theta - \frac{\eta \nabla_\theta J(\theta)}{\sqrt{v_t} + \epsilon} θ=θ−vt+ϵη∇θJ(θ)
其中:
PyTorch 代码:
import torch.optim as optim
# 定义模型
model = nn.Linear(10, 1)
# 定义优化器
optimizer = optim.RMSprop(model.parameters(), lr=0.01)