赞
踩
在深度学习中,优化器是一个非常重要的组成部分,它通过调整模型参数的方式来最小化损失函数。本教程将介绍三种常用的优化器以及如何选择最合适的优化器。
随机梯度下降(Stochastic Gradient Descent,SGD)是一种常见的优化器,也是深度学习模型中最基础的优化算法之一。它是对梯度下降算法的一种实现方式,常被用于神经网络中的权重更新。
SGD的基本思路是在每个训练样本上计算梯度并更新权重,因此也被称为在线学习。相比于批量梯度下降(Batch Gradient Descent, BGD),SGD更加高效,尤其是当数据集较大时。
在SGD中,模型的参数向负梯度方向更新,使得损失函数的值逐渐减少。具体来说,每个训练样本的误差对每个参数的偏导数被计算,并且应用于参数的当前值以更新它。在迭代过程中,每次更新后,下一个样本的误差被计算,参数再次更新。这个过程重复多次,直到达到一定的收敛条件或达到事先设定的最大迭代次数。
SGD的具体实现包括以下步骤:
W
为一个随机的初始值x
和对应的标签 y
x
上计算损失函数关于 W
的梯度,即 ∇L(W, x, y)
W = W - α * ∇L(W, x, y)
,其中 α
是学习率,控制每次更新的大小SGD虽然简单,但它有一个缺点是收敛速度相对较慢并且具有一定的不稳定性,因为更新方向与当前样本对应的梯度方向不一定完全指向全局最优解。为了解决这个问题,后续发展出了多种自适应的优化算法,如动量梯度下降(Momentum)、Adagrad、Adam等。
随机梯度下降优化器(SGD)是一种基本的优化器,它使用数据集中的单个样本或一批样本的梯度来更新模型参数。其更新公式为:
w
t
+
1
=
w
t
−
η
∇
w
L
(
w
t
;
x
i
,
y
i
)
w_{t+1} = w_t - \eta \nabla_{w} L(w_t; x_i, y_i)
wt+1=wt−η∇wL(wt;xi,yi)
其中
w
t
w_t
wt 是在时间步
t
t
t 的模型参数,
∇
w
L
(
w
t
;
x
i
,
y
i
)
\nabla_{w} L(w_t; x_i, y_i)
∇wL(wt;xi,yi) 是在
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi) 上损失函数
L
L
L 相对于模型参数
w
w
w 的梯度,
η
\eta
η 是学习率,控制更新步长大小。随机梯度下降优化器适用于大规模数据集和复杂模型。
import tensorflow as tf
sgd_optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
import torch
sgd_optimizer = torch.optim.SGD(params, lr=0.01)
Adam(Adaptive Moment Estimation)是一种自适应学习率的优化算法,是在动量梯度下降和自适应学习率算法的基础上发展而来的。Adam算法将不同的梯度给予不同的权重,使得神经网络在学习率稳定时,能快速、稳定的收敛到最佳点。
具体来说,Adam算法维护了每个权重的一阶梯度平均值和二阶梯度平均值的指数加权移动平均数。其更新过程如下:
初始化各参数的一阶梯度的指数加权平均数 m 0 m_0 m0、二阶梯度的指数加权平均数 v 0 v_0 v0均为 0 0 0,偏差校正系数为 m ^ 0 = v ^ 0 = 0 \hat{m}_0 = \hat{v}_0 = 0 m^0=v^0=0。
对于第 t t t 个时间步的小批量样本 B t B_t Bt,计算其梯度 g t g_t gt。
更新一阶和二阶梯度的指数加权平均值:
m
t
=
β
1
⋅
m
t
−
1
+
(
1
−
β
1
)
⋅
g
t
,
v
t
=
β
2
⋅
v
t
−
1
+
(
1
−
β
2
)
⋅
g
t
2
,
m_t = \beta_1 \cdot m_{t - 1} + (1 - \beta_1) \cdot g_t, \\ v_t = \beta_2 \cdot v_{t - 1} + (1 - \beta_2) \cdot g_t^2,
mt=β1⋅mt−1+(1−β1)⋅gt,vt=β2⋅vt−1+(1−β2)⋅gt2,
其中
β
1
\beta_1
β1 和
β
2
\beta_2
β2 是平均系数,一般设置为
0.9
0.9
0.9 和
0.999
0.999
0.999。
计算
m
^
t
\hat{m}_{t}
m^t 和
v
^
t
\hat{v}_{t}
v^t 偏差校正后的梯度的估计值:
m
^
t
=
m
t
1
−
β
1
t
,
v
^
t
=
v
t
1
−
β
2
t
\hat{m}_t = \frac{m_t}{1 - \beta_1^t},\ \hat{v}_t = \frac{v_t}{1 - \beta_2^t}
m^t=1−β1tmt, v^t=1−β2tvt
其中 β 1 t \beta_1^t β1t 和 β 2 t \beta_2^t β2t 分别是 β 1 \beta_1 β1 和 β 2 \beta_2 β2 的 t t t 次方。
其中 η \eta η 是学习率, ϵ \epsilon ϵ 是为了增加数值稳定性而添加的常数,一般取 1 0 − 8 10^{-8} 10−8。 Adam算法中,梯度范数较大时,梯度估计占比较大,此时动量项占比就会减小。而梯度范数小时,动量项占比会增大,从而可以避免杂讯对优化过程所带来的影响。
Adam算法的优点在于:
总的来说,Adam算法是一种高效、自适应的优化算法,在各类深度学习问题中表现出色,被广泛应用。
Adam 优化器是一种基于梯度的自适应优化器,它可以自适应地调整每个参数的学习率。其更新公式为:
g
t
=
∇
w
L
(
w
t
;
x
i
,
y
i
)
g_t = \nabla_{w} L(w_t; x_i, y_i)
gt=∇wL(wt;xi,yi)
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−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=β2vt−1+(1−β2)gt2
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
w t + 1 = w t − η m ^ t v ^ t + ϵ w_{t+1} = w_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} wt+1=wt−ηv^t +ϵm^t
其中 g t g_t gt 是在 ( x i , y i ) (x_i, y_i) (xi,yi) 上损失函数 L L L 相对于模型参数 w w w 的梯度, m t m_t mt 和 v t v_t vt 分别是梯度和梯度平方的指数移动平均值, β 1 \beta_1 β1 和 β 2 \beta_2 β2 是衰减率, ϵ \epsilon ϵ 是一个很小的数值,防止分母为 0。Adam 优化器适用于各种类型的深度学习模型和数据集。
import tensorflow as tf
adam_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07)
import torch
adam_optimizer = torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-07)
Adagrad(Adaptive Gradient)是一种自适应学习率的优化算法,它能够对不同的参数自适应地调整学习率,这使得具有稀疏梯度的问题的训练过程更加高效。Adagrad算法在学习率方面与传统的优化算法相比,采用更为自适应的策略,对于不同的参数,学习率的值也不同。
具体来说,Adagrad算法为每个参数维护一个不同的学习率,而这个学习率是根据这个参数以前的梯度来更新的。在每个迭代过程中,Adagrad计算每个参数的梯度平方和的平方根,并将其用于缩放学习率。此外,为了避免学习率过小,Adagrad还引入了一个小常数,以避免除零运算。
具体来说,Adagrad算法的更新步骤如下:
初始化每个参数的累积梯度平方和 r i = 0 r_i = 0 ri=0。
对于第
t
t
t 个小批量样本,计算其在参数
i
i
i 处的梯度
g
t
,
i
g_{t,i}
gt,i,更新参数
i
i
i:
x
t
+
1
,
i
=
x
t
,
i
−
η
r
t
,
i
+
ϵ
g
t
,
i
x_{t+1,i} = x_{t,i} - \frac{\eta}{\sqrt{r_{t,i}} + \epsilon} g_{t,i}
xt+1,i=xt,i−rt,i
+ϵηgt,i
其中
η
\eta
η 是学习率,
ϵ
\epsilon
ϵ 是增加数值稳定性的常数,一般取
1
0
−
8
10^{-8}
10−8。
更新每个参数的累积梯度平方和:
r
t
,
i
=
r
t
−
1
,
i
+
g
t
,
i
2
r_{t,i} = r_{t-1,i} + g_{t,i}^2
rt,i=rt−1,i+gt,i2
Adagrad算法的优点是,能够自适应地调整每个参数的学习率,使得训练过程更加高效,特别是对于稀疏梯度的问题的训练效果更好。但是,它的缺点是无法处理参数空间中梯度变化很大的情况,这样会导致学习率过小,阻碍优化的进程。为了解决这个问题,一些基于Adagrad的改进算法也被推出,例如Adadelta和RMSProp等算法。
Adagrad 优化器是一种自适应性学习率的优化器,它可以自适应地为每个参数分配不同的学习率。其更新公式为:
g
t
=
∇
w
L
(
w
t
;
x
i
,
y
i
)
g_t = \nabla_{w} L(w_t; x_i, y_i)
gt=∇wL(wt;xi,yi)
r t = r t − 1 + g t 2 r_t = r_{t-1} + g_t^2 rt=rt−1+gt2
w t + 1 = w t − η g t r t + ϵ w_{t+1} = w_t - \eta \frac{g_t}{\sqrt{r_t} + \epsilon} wt+1=wt−ηrt +ϵgt
其中 g t g_t gt 是在 ( x i , y i ) (x_i, y_i) (xi,yi) 上损失函数 L L L 相对于模型参数 w w w 的梯度, r t r_t rt 是梯度平方的指数累积和, η \eta η 是学习率, ϵ \epsilon ϵ 是一个很小的数值,防止分母为 0。Adagrad 优化器适用于稀疏数据集和模型参数的稀疏性。
import tensorflow as tf
adagrad_optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.01, initial_accumulator_value=0.1, epsilon=1e-07)
import torch
adagrad_optimizer = torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0.1, eps=1e-07)
在选择优化器时,应该考虑以下几个因素:
数据集的规模和复杂性
对于大规模数据集和复杂模型,应该选择具有较好收敛性的优化器,如 SGD 或 Adam。
模型的稀疏性
对于稀疏模型,应该选择 Adagrad 或其他自适应学习率的优化器。
训练速度
对于需要较快训练速度的场景,可以选择具有加速功能的优化器,如 SGD 的带动量更新或 Nesterov 动量更新,或者选择具有较高并行性的优化器,如 Adam 或 Adagrad。
学习率的调整
对于需要调整学习率的场景,可以选择自适应学习率的优化器,如 Adam 或 Adagrad。
在实际使用中,可以通过尝试多种优化器并比较其效果来选择最合适的优化器。
优化器是深度学习中非常重要的组成部分,它可以通过调整模型参数的方式来最小化损失函数。本教程介绍了三种常用的优化器:随机梯度下降优化器、Adam 优化器和 Adagrad 优化器,并讨论了如何选择最合适的优化器。在实际使用中,应该根据数据集的规模和复杂性、模型的稀疏性、训练速度和学习率的调整等因素来选择优化器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。