文章总览:
在深度学习中,优化器用于更新模型的参数,以最小化损失函数。常见的优化函数有很多种,下面是几种主流的优化器及其特点、原理和 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)
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务