深度学习中常见的优化算法
1.基础优化算法
1.1梯度下降(Gradient Descent)
通过计算损失函数对参数的梯度,沿着梯度下降的方向更新模型参数,直到找到最小值或足够接近最小值的解。其核心思想是基于损失函数的梯度方向来调整参数,以最小化损失。
1.1.2基本原理
梯度下降的核心思想是基于损失函数的梯度方向来调整参数。具体来说,它通过计算损失函数对参数的梯度,沿着梯度下降的方向更新模型参数,直到找到最小值或足够接近最小值的解。其更新公式为:
θ t + 1 = θ t − η ∇ J ( θ t ) \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) θt+1=θt−η∇J(θt)
其中, θ t \theta_t θt 是当前参数, η \eta η 是学习率, ∇ J ( θ t ) \nabla J(\theta_t) ∇J(θt) 是损失函数在参数 θ t \theta_t θt 处的梯度。
1.1.3特点
- 全局最优解:在凸优化问题中,梯度下降能够收敛到全局最优解;但在非凸问题中,可能会陷入局部最优解。
- 计算开销:需要计算整个数据集的梯度,计算开销较大,适用于小规模数据集。
- 稳定性:更新频率较低,训练过程相对稳定。
1.1.4实际应用中的注意事项
- 学习率的选择:学习率过大可能导致训练不收敛,过小则训练速度过慢。通常需要通过实验调整合适的学习率。
- 数据预处理:对数据进行归一化或标准化处理,有助于梯度下降更快地收敛。
- 损失函数的选择:不同的损失函数适用于不同的任务,选择合适的损失函数可以提高模型的性能。
- 正则化:为了防止过拟合,可以在损失函数中加入正则化项,如 L1 或 L2 正则化。
1.2随机梯度下降(Stochastic Gradient Descent, SGD)
随机梯度下降(Stochastic Gradient Descent,SGD)是一种优化算法,广泛应用于机器学习和深度学习中,用于最小化损失函数并更新模型参数。以下是SGD的详细介绍:
1.2.1基本原理
SGD的核心思想是通过随机选择一个样本或一小批样本来计算梯度,然后根据这个梯度更新模型参数。其更新公式为:
θ t + 1 = θ t − η ∇ J ( θ t ; x i ; y i ) \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t; x_i; y_i) θt+1=θt−η∇J(θt;xi;yi)
其中, θ t \theta_t θt 是当前参数, η \eta η 是学习率, ∇ J ( θ t ; x i ; y i ) \nabla J(\theta_t; x_i; y_i) ∇J(θt;xi;yi) 是损失函数在样本 ( x i , y i ) (x_i, y_i) (xi,yi) 处的梯度。
1.2.2特点
- 计算开销小:每次只使用一个或一小批样本计算梯度,计算开销小,适用于大规模数据集。
- 更新频率高:参数更新频繁,可能导致训练过程不稳定,但有助于跳出局部最优。
- 随机性:由于每次使用不同的样本计算梯度,导致参数更新具有随机性,可能在接近最优解时震荡。
1.2.3与梯度下降的区别
- 数据使用:梯度下降使用整个数据集计算梯度,而SGD每次只使用一个或一小批样本。
- 计算效率:SGD计算效率更高,尤其在大规模数据集上。
- 收敛速度:SGD收敛速度可能更快,但路径可能更曲折。
- 稳定性:SGD更新频率高,可能导致训练不稳定,但可通过学习率衰减来缓解。
在深度学习中的应用
在深度学习中,SGD被用于训练各种神经网络模型,如多层感知机、卷积神经网络等。它通过不断调整神经网络的权重和偏置,使得模型的预测结果与真实标签之间的误差最小化。例如,在训练一个图像分类模型时,SGD可以用来优化模型的参数,提高分类的准确性。

实际应用中的注意事项
- 学习率的选择:学习率过大可能导致训练不收敛,过小则训练速度过慢。通常需要通过实验调整合适的学习率,可以使用学习率调度来动态调整学习率。
- 数据预处理:对数据进行归一化或标准化处理,有助于SGD更快地收敛。
- 随机性:由于SGD的随机性,可能导致每次训练结果不同,可以通过设置随机种子来保证结果的可重复性。
- 正则化:为了防止过拟合,可以在损失函数中加入正则化项,如L1或L2正则化。
- 动量项:为了加速收敛并抑制震荡,可以引入动量项,如使用动量SGD或Nesterov加速梯度下降(NAG)。
总的来说,SGD是一种高效且常用的优化算法,在深度学习中被广泛应用,尤其适用于大规模数据集的训练任务。
2.动量方法
2.1动量随机梯度下降(Momentum-based SGD)
动量随机梯度下降(Momentum-based Stochastic Gradient Descent,Momentum SGD)是一种优化算法,通过在随机梯度下降(SGD)中引入动量项,加速收敛并抑制震荡,提高训练效率和稳定性。以下是其详细介绍:
2.1.1基本原理
动量SGD通过累积历史梯度信息形成动量,使参数更新时不仅考虑当前梯度,还参考之前更新方向,避免在相同方向重复调整。
动量的计算公式
动量的计算公式如下:
v t = γ v t − 1 + η ∇ J ( θ t ; x i ; y i ) θ t + 1 = θ t − v t \begin{align*} v_t &= \gamma v_{t-1} + \eta \nabla J(\theta_t; x_i; y_i) \\ \theta_{t+1} &= \theta_t - v_t \end{align*} vtθt+1=γvt−1+η∇J(θt;xi;yi)=θt−vt
其中:
- v t v_t vt 是当前时刻 t t t 的动量。
- γ \gamma γ 是动量系数(通常取值在 0 到 1 之间,常见的值是 0.9)。
- η \eta η 是学习率。
- ∇ J ( θ t ; x i ; y i ) \nabla J(\theta_t; x_i; y_i) ∇J(θt;xi;yi) 是在当前样本 ( x i , y i ) (x_i, y_i) (xi,yi) 处计算的梯度。
- θ t \theta_t θt 是当前时刻 t t t 的模型参数。
2.1.2动量计算的步骤
-
初始化动量:在训练开始时,动量 v 0 v_0 v0 通常初始化为零。
v 0 = 0 v_0 = 0 v0=0 -
计算当前梯度:在每次迭代中,计算当前样本 ( x i , y i ) (x_i, y_i) (xi,yi) 的梯度。
∇ J ( θ t ; x i ; y i ) \nabla J(\theta_t; x_i; y_i) ∇J(θt;xi;yi) -
更新动量:根据当前梯度和上一时刻的动量,更新当前时刻的动量。
v t = γ v t − 1 + η ∇ J ( θ t ; x i ; y i ) v_t = \gamma v_{t-1} + \eta \nabla J(\theta_t; x_i; y_i) vt=γvt−1+η∇J(θt;xi;yi)- γ v t − 1 \gamma v_{t-1} γvt−1 是动量的“惯性”部分,表示上一时刻动量的保留。
- η ∇ J ( θ t ; x i ; y i ) \eta \nabla J(\theta_t; x_i; y_i) η∇J(θt;xi;yi) 是当前梯度的影响部分。
-
更新参数:根据更新后的动量 v t v_t vt 来更新模型参数。
θ t + 1 = θ t − v t \theta_{t+1} = \theta_t - v_t θt+1=θt−vt
2.1.3动量的作用
- 平滑更新:动量项 γ v t − 1 \gamma v_{t-1} γvt−1 使得参数更新不仅依赖于当前梯度,还依赖于之前的历史梯度信息。这有助于平滑参数更新过程,减少因随机梯度的波动而导致的震荡。
- 加速收敛:在梯度方向一致的情况下,动量会不断累积,使得参数更新的步长增加,从而加速收敛。
- 避免局部最优:动量可以帮助模型在接近最优解时“冲过”小的山谷或鞍点,避免陷入局部最优解。
2.1.4动量系数的选择
- 动量系数 γ \gamma γ:通常取值在 0 到 1 之间,常见的值是 0.9。较大的 γ \gamma γ 值(如 0.9 或 0.99)表示动量的惯性较大,模型更新更加平滑;较小的 γ \gamma γ 值(如 0.5)表示动量的惯性较小,模型更新对当前梯度的依赖更强。
- 学习率 η \eta η:学习率控制每次更新的步长。较大的学习率可能导致训练不稳定,而较小的学习率可能导致训练速度过慢。通常需要通过实验来调整合适的学习率。
示例
假设我们正在训练一个简单的线性回归模型,损失函数为均方误差,模型参数为 θ \theta θ。以下是动量SGD的更新过程:
-
初始化:
θ 0 = 0 , v 0 = 0 , γ = 0.9 , η = 0.01 \theta_0 = 0, \quad v_0 = 0, \quad \gamma = 0.9, \quad \eta = 0.01 θ0=0,v0=0,γ=0.9,η=0.01 -
第一次迭代:
- 计算当前样本 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 的梯度:
∇ J ( θ 0 ; x 1 ; y 1 ) = ∂ ∂ θ ( 1 2 ( y 1 − θ 0 x 1 ) 2 ) = − x 1 ( y 1 − θ 0 x 1 ) \nabla J(\theta_0; x_1; y_1) = \frac{\partial}{\partial \theta} \left( \frac{1}{2} (y_1 - \theta_0 x_1)^2 \right) = -x_1 (y_1 - \theta_0 x_1) ∇J(θ0;x1;y1)=∂θ∂(21(y1−θ0x1)2)=−x1(y1−θ0x1) - 更新动量:
v 1 = 0.9 ⋅ 0 + 0.01 ⋅ ( − x 1 ( y 1 − θ 0 x 1 ) ) = − 0.01 x 1 ( y 1 − θ 0 x 1 ) v_1 = 0.9 \cdot 0 + 0.01 \cdot (-x_1 (y_1 - \theta_0 x_1)) = -0.01 x_1 (y_1 - \theta_0 x_1) v1=0.9⋅0+0.01⋅(−x1(y1−θ0x1))=−0.01x1(y1−θ0x1) - 更新参数:
θ 1 = θ 0 − v 1 = 0 − ( − 0.01 x 1 ( y 1 − θ 0 x 1 ) ) = 0.01 x 1 ( y 1 − θ 0 x 1 ) \theta_1 = \theta_0 - v_1 = 0 - (-0.01 x_1 (y_1 - \theta_0 x_1)) = 0.01 x_1 (y_1 - \theta_0 x_1) θ1=θ0−v1=0−(−0.01x1(y1−θ0x1))=0.01x1(y1−θ0x1)
- 计算当前样本 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 的梯度:
-
第二次迭代:
- 计算当前样本 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 的梯度:
∇ J ( θ 1 ; x 2 ; y 2 ) = − x 2 ( y 2 − θ 1 x 2 ) \nabla J(\theta_1; x_2; y_2) = -x_2 (y_2 - \theta_1 x_2) ∇J(θ1;x2;y2)=−x2(y2−θ1x2) - 更新动量:
v 2 = 0.9 ⋅ v 1 + 0.01 ⋅ ( − x 2 ( y 2 − θ 1 x 2 ) ) v_2 = 0.9 \cdot v_1 + 0.01 \cdot (-x_2 (y_2 - \theta_1 x_2)) v2=0.9⋅v1+0.01⋅(−x2(y2−θ1x2)) - 更新参数:
θ 2 = θ 1 − v 2 \theta_2 = \theta_1 - v_2 θ2=θ1−v2
- 计算当前样本 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 的梯度:
通过这种方式,动量SGD能够在每次迭代中累积历史梯度信息,从而加速收敛并减少震荡。
2.1.5特点
- 加速收敛:动量项累积历史梯度信息,使参数在相关方向上加速更新,缩短收敛时间。
- 抑制震荡:动量项平滑参数更新,减少随机性,使训练更稳定,尤其在接近最优解时效果明显。
- 依赖超参数:动量系数 γ \gamma γ 和学习率 η \eta η 需合理设置,通常 γ \gamma γ 取0.9左右, η \eta η 需根据任务调整。
2.1.6与随机梯度下降的区别
- 更新方向:SGD仅用当前样本梯度更新参数,而动量SGD结合动量和当前梯度,使更新更平滑、稳定。
- 收敛速度:动量SGD通过动量累积加速收敛,尤其在相关方向上效果显著,而SGD收敛速度较慢。
- 稳定性:动量SGD的动量项减少震荡,提高稳定性,而SGD更新频率高,可能导致训练不稳定。
2.1.7动量随机梯度下降在实际应用中的注意事项
- 超参数调优:动量系数和学习率的选择对算法性能有显著影响,通常需要通过实验调整。
- 数据预处理:对数据进行归一化或标准化处理,有助于动量SGD更快地收敛。
- 随机性:由于动量SGD的随机性,可能导致每次训练结果不同,可以通过设置随机种子来保证结果的可重复性。
- 正则化:为了防止过拟合,可以在损失函数中加入正则化项,如L1或L2正则化。
2.2 Nesterov加速梯度下降(Nesterov Accelerate Gradient Descent, NAG)
Nesterov加速梯度下降(Nesterov Accelerated Gradient Descent,NAG)是一种改进的动量优化算法,它在动量随机梯度下降(Momentum SGD)的基础上进行了优化,进一步提高了收敛速度和训练效率。NAG的核心思想是通过“向前看”的方式来计算梯度,使得梯度计算更加准确,从而更有效地更新参数。
2.2.1基本原理
NAG的关键在于梯度计算的方式。与动量SGD直接在当前位置计算梯度不同,NAG先根据动量项向前移动一步,然后在这个“前瞻”位置计算梯度。这种方法可以更准确地预测梯度方向,避免在接近最优解时的震荡。
其更新公式为:
-
计算前瞻梯度:
∇ J ( θ t − γ v t − 1 ; x i ; y i ) \nabla J(\theta_t - \gamma v_{t-1}; x_i; y_i) ∇J(θt−γvt−1;xi;yi)
其中, θ t \theta_t θt 是当前参数, γ \gamma γ 是动量系数, v t − 1 v_{t-1} vt−1 是上一时刻的动量, ∇ J ( θ t − γ v t − 1 ; x i ; y i ) \nabla J(\theta_t - \gamma v_{t-1}; x_i; y_i) ∇J(θt−γvt−1;xi;yi) 是在前瞻位置的梯度。 -
更新动量:
v t = γ v t − 1 + η ∇ J ( θ t − γ v t − 1 ; x i ; y i ) v_t = \gamma v_{t-1} + \eta \nabla J(\theta_t - \gamma v_{t-1}; x_i; y_i) vt=γvt−1+η∇J(θt−γvt−1;xi;yi)
其中, η \eta η 是学习率。 -
更新参数:
θ t + 1 = θ t − v t \theta_{t+1} = \theta_t - v_t θt+1=θt−vt
2.2.2特点
- 加速收敛:通过在前瞻位置计算梯度,NAG能够更准确地预测梯度方向,从而加速收敛。
- 抑制震荡:动量项平滑了参数更新过程,减少了随机性,使训练更加稳定,尤其在接近最优解时效果明显。
- 依赖超参数:动量系数 γ \gamma γ 和学习率 η \eta η 需要合理设置。通常, γ \gamma γ 取值在 0.9 左右, η \eta η 需根据具体任务调整。
2.2.3与动量SGD的区别
- 梯度计算位置:动量SGD在当前位置计算梯度,而NAG在前瞻位置计算梯度,这使得NAG能够更准确地预测梯度方向。
- 收敛速度:NAG通常比动量SGD收敛更快,尤其是在复杂优化问题中。
- 稳定性:NAG在接近最优解时的震荡更小,训练过程更稳定。
2.2.4在深度学习中的应用
NAG被广泛应用于训练各种神经网络模型,如多层感知机、卷积神经网络(CNN)和循环神经网络(RNN)等。它通过不断调整神经网络的权重和偏置,使得模型的预测结果与真实标签之间的误差最小化。例如,在训练一个图像分类模型时,NAG可以用来优化模型的参数,提高分类的准确性。
2.2.5实际应用中的注意事项
-
超参数调优:
- 动量系数 γ \gamma γ:通常取值在 0.8 到 0.99 之间,常见的值是 0.9。较大的 γ \gamma γ 值表示更强的惯性,有助于平滑更新。
- 学习率 η \eta η:需要根据具体任务进行调整。较大的学习率可能导致训练不稳定,而较小的学习率可能导致训练速度过慢。可以使用学习率调度(如学习率衰减)来动态调整学习率。
-
数据预处理:对数据进行归一化或标准化处理,有助于NAG更快地收敛。
-
随机性:由于NAG的随机性,可能导致每次训练结果不同,可以通过设置随机种子来保证结果的可重复性。
-
正则化:为了防止过拟合,可以在损失函数中加入正则化项,如L1或L2正则化。
2.2.6示例
假设我们正在训练一个简单的线性回归模型,损失函数为均方误差,模型参数为 θ \theta θ。以下是NAG的更新过程:
-
初始化:
θ 0 = 0 , v 0 = 0 , γ = 0.9 , η = 0.01 \theta_0 = 0, \quad v_0 = 0, \quad \gamma = 0.9, \quad \eta = 0.01 θ0=0,v0=0,γ=0.9,η=0.01 -
第一次迭代:
- 计算前瞻位置:
θ 0 − γ v 0 = 0 − 0.9 ⋅ 0 = 0 \theta_0 - \gamma v_0 = 0 - 0.9 \cdot 0 = 0 θ0−γv0=0−0.9⋅0=0 - 计算前瞻梯度:
∇ J ( θ 0 − γ v 0 ; x 1 ; y 1 ) = ∇ J ( 0 ; x 1 ; y 1 ) \nabla J(\theta_0 - \gamma v_0; x_1; y_1) = \nabla J(0; x_1; y_1) ∇J(θ0−γv0;x1;y1)=∇J(0;x1;y1) - 更新动量:
v 1 = 0.9 ⋅ 0 + 0.01 ⋅ ∇ J ( 0 ; x 1 ; y 1 ) = 0.01 ⋅ ∇ J ( 0 ; x 1 ; y 1 ) v_1 = 0.9 \cdot 0 + 0.01 \cdot \nabla J(0; x_1; y_1) = 0.01 \cdot \nabla J(0; x_1; y_1) v1=0.9⋅0+0.01⋅∇J(0;x1;y1)=0.01⋅∇J(0;x1;y1) - 更新参数:
θ 1 = θ 0 − v 1 = 0 − 0.01 ⋅ ∇ J ( 0 ; x 1 ; y 1 ) \theta_1 = \theta_0 - v_1 = 0 - 0.01 \cdot \nabla J(0; x_1; y_1) θ1=θ0−v1=0−0.01⋅∇J(0;x1;y1)
- 计算前瞻位置:
-
第二次迭代:
- 计算前瞻位置:
θ 1 − γ v 1 = θ 1 − 0.9 ⋅ v 1 \theta_1 - \gamma v_1 = \theta_1 - 0.9 \cdot v_1 θ1−γv1=θ1−0.9⋅v1 - 计算前瞻梯度:
∇ J ( θ 1 − γ v 1 ; x 2 ; y 2 ) \nabla J(\theta_1 - \gamma v_1; x_2; y_2) ∇J(θ1−γv1;x2;y2) - 更新动量:
v 2 = 0.9 ⋅ v 1 + 0.01 ⋅ ∇ J ( θ 1 − γ v 1 ; x 2 ; y 2 ) v_2 = 0.9 \cdot v_1 + 0.01 \cdot \nabla J(\theta_1 - \gamma v_1; x_2; y_2) v2=0.9⋅v1+0.01⋅∇J(θ1−γv1;x2;y2) - 更新参数:
θ 2 = θ 1 − v 2 \theta_2 = \theta_1 - v_2 θ2=θ1−v2
- 计算前瞻位置:
通过这种方式,NAG能够在每次迭代中更准确地预测梯度方向,从而加速收敛并减少震荡。
3.自适应学习率的优化算法
3.1AdaGrad
AdaGrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,它通过为每个参数动态调整学习率,解决了传统优化算法中学习率固定或难以调整的问题。根据每个参数的历史梯度大小调整每个参数的学习率,使得学习率较大的参数得到更多的更新,反之则更新较少。该算法特别适合用于稀疏数据集,但其学习率可能会过早衰减。AdaGrad特别适合处理稀疏数据,例如在自然语言处理和图像识别等任务中表现出色。
3.1.1基本原理
AdaGrad的核心思想是根据每个参数的历史梯度信息来调整学习率。具体来说,对于每个参数,学习率会随着该参数的梯度平方的累积和而减小。这意味着,如果某个参数的梯度一直很大,那么它的学习率会逐渐减小;反之,如果某个参数的梯度一直很小,那么它的学习率会保持较大。这种自适应调整学习率的方式有助于加速训练过程,并提高模型的收敛速度。
AdaGrad的更新公式如下:
-
累积梯度平方:
r t = r t − 1 + ∇ J ( θ t ; x i ; y i ) ⊙ ∇ J ( θ t ; x i ; y i ) r_t = r_{t-1} + \nabla J(\theta_t; x_i; y_i) \odot \nabla J(\theta_t; x_i; y_i) rt=rt−1+∇J(θt;xi;yi)⊙∇J(θt;xi;yi)
其中, r t r_t rt 是累积梯度平方, ⊙ \odot ⊙ 表示逐元素相乘。 -
更新参数:
θ t + 1 = θ t − η r t + ϵ ⊙ ∇ J ( θ t ; x i ; y i ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{r_t + \epsilon}} \odot \nabla J(\theta_t; x_i; y_i) θt+1=θt−rt+ϵη⊙∇J(θt;xi;yi)
- 累积梯度平方: r t r_t rt 是一个向量,每个元素对应一个参数的历史梯度平方的累积和。随着时间的推移, r t r_t rt 会不断增加,因为每次迭代都会加上新的梯度平方。
- 自适应学习率:每个参数的学习率 η t , i \eta_{t,i} ηt,i 是动态调整的,具体取决于该参数的历史梯度平方 r t , i r_{t,i} rt,i。如果某个参数的梯度一直很大,那么 r t , i r_{t,i} rt,i 会很大,从而使得 η t , i \eta_{t,i} ηt,i 变小;反之,如果某个参数的梯度一直很小,那么 r t , i r_{t,i} rt,i 会很小,从而使得 η t , i \eta_{t,i} ηt,i 保持较大。
- 小常数 ϵ \epsilon ϵ:为了避免分母为零,我们在分母中加入一个小常数 ϵ \epsilon ϵ。这个常数通常取值为 1 0 − 8 10^{-8} 10−8,它不会对学习率产生显著影响,但可以确保数值稳定性。
3.1.2特点
-
累积梯度平方: r t r_t rt 累积了每个参数的历史梯度平方。随着时间的推移, r t r_t rt 会不断增加,因为每次迭代都会加上新的梯度平方。
-
自适应学习率:每个参数的学习率 η t , i \eta_{t,i} ηt,i 是动态调整的,具体取决于该参数的历史梯度平方 r t , i r_{t,i} rt,i。如果某个参数的梯度一直很大,那么 r t , i r_{t,i} rt,i 会很大,从而使得 η t , i \eta_{t,i} ηt,i 变小;反之,如果某个参数的梯度一直很小,那么 r t , i r_{t,i} rt,i 会很小,从而使得 η t , i \eta_{t,i} ηt,i 保持较大。
-
适合稀疏数据:对于稀疏数据,AdaGrad能够有效地调整学习率,使得稀疏参数的更新更加合理。
-
学习率衰减:AdaGrad的学习率会随着梯度平方的累积和而逐渐减小,这有助于在训练后期减小学习率,从而提高模型的稳定性。
-
全局学习率:尽管AdaGrad为每个参数调整学习率,但仍然需要设置一个全局学习率 η \eta η。
3.1.3优点
- 加速收敛:通过自适应调整学习率,AdaGrad能够加速收敛,尤其是在稀疏数据集上。
- 减少手动调整学习率的需求:AdaGrad减少了手动调整学习率的需求,使得优化过程更加自动化。
3.1.4缺点
- 学习率衰减过快:AdaGrad的学习率会随着梯度平方的累积和而逐渐减小,这可能导致学习率过早衰减,使得训练过程在后期难以继续优化。
- 内存需求:AdaGrad需要存储每个参数的累积梯度平方,这增加了内存需求。
3.1.5在深度学习中的应用
AdaGrad被广泛应用于各种深度学习任务中,尤其是在处理稀疏数据时表现出色。例如,在自然语言处理任务中,AdaGrad能够有效地处理稀疏的词嵌入向量;在图像识别任务中,AdaGrad也能够加速模型的收敛。
3.1.6实际应用中的注意事项
- 全局学习率的选择:尽管AdaGrad为每个参数调整学习率,但全局学习率 η \eta η 的选择仍然很重要。通常需要通过实验来调整合适的全局学习率。
- 小常数 ϵ \epsilon ϵ:为了避免分母为零,需要在分母中加入一个小常数 ϵ \epsilon ϵ。通常取值为 1 0 − 8 10^{-8} 10−8。
- 学习率衰减:由于AdaGrad的学习率会逐渐减小,可能需要在训练过程中动态调整全局学习率,以防止学习率过早衰减。
3.1.7示例
假设我们正在训练一个简单的线性回归模型,损失函数为均方误差,模型参数为 θ \theta θ。以下是AdaGrad的更新过程:
-
初始化:
θ 0 = 0 , r 0 = 0 , η = 0.01 , ϵ = 1 0 − 8 \theta_0 = 0, \quad r_0 = 0, \quad \eta = 0.01, \quad \epsilon = 10^{-8} θ0=0,r0=0,η=0.01,ϵ=10−8 -
第一次迭代:
- 计算当前样本 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 的梯度:
∇ J ( θ 0 ; x 1 ; y 1 ) = − x 1 ( y 1 − θ 0 x 1 ) \nabla J(\theta_0; x_1; y_1) = -x_1 (y_1 - \theta_0 x_1) ∇J(θ0;x1;y1)=−x1(y1−θ0x1) - 累积梯度平方:
r 1 = r 0 + ∇ J ( θ 0 ; x 1 ; y 1 ) ⊙ ∇ J ( θ 0 ; x 1 ; y 1 ) r_1 = r_0 + \nabla J(\theta_0; x_1; y_1) \odot \nabla J(\theta_0; x_1; y_1) r1=r0+∇J(θ0;x1;y1)⊙∇J(θ0;x1;y1) - 更新参数:
θ 1 = θ 0 − η r 1 + ϵ ⊙ ∇ J ( θ 0 ; x 1 ; y 1 ) \theta_1 = \theta_0 - \frac{\eta}{\sqrt{r_1 + \epsilon}} \odot \nabla J(\theta_0; x_1; y_1) θ1=θ0−r1+ϵη⊙∇J(θ0;x1;y1)
- 计算当前样本 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 的梯度:
-
第二次迭代:
- 计算当前样本 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 的梯度:
∇ J ( θ 1 ; x 2 ; y 2 ) = − x 2 ( y 2 − θ 1 x 2 ) \nabla J(\theta_1; x_2; y_2) = -x_2 (y_2 - \theta_1 x_2) ∇J(θ1;x2;y2)=−x2(y2−θ1x2) - 累积梯度平方:
r 2 = r 1 + ∇ J ( θ 1 ; x 2 ; y 2 ) ⊙ ∇ J ( θ 1 ; x 2 ; y 2 ) r_2 = r_1 + \nabla J(\theta_1; x_2; y_2) \odot \nabla J(\theta_1; x_2; y_2) r2=r1+∇J(θ1;x2;y2)⊙∇J(θ1;x2;y2) - 更新参数:
θ 2 = θ 1 − η r 2 + ϵ ⊙ ∇ J ( θ 1 ; x 2 ; y 2 ) \theta_2 = \theta_1 - \frac{\eta}{\sqrt{r_2 + \epsilon}} \odot \nabla J(\theta_1; x_2; y_2) θ2=θ1−r2+ϵη⊙∇J(θ1;x2;y2)
- 计算当前样本 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 的梯度:
通过这种方式,AdaGrad能够在每次迭代中根据每个参数的历史梯度信息动态调整学习率,从而加速收敛并提高模型的性能。
3.2RMSprop
RMSprop(Root Mean Square Propagation)是一种自适应学习率的优化算法,旨在解决AdaGrad学习率过早衰减的问题。它通过引入梯度平方的滑动平均来动态调整学习率,使得学习率在训练过程中更加稳定。以下是RMSprop的详细介绍:
3.2.1基本原理
RMSprop的核心思想是通过计算梯度平方的滑动平均来调整学习率,而不是直接使用累积梯度平方。这种方法可以避免学习率过早衰减,同时保持自适应学习率的优势。
3.2.2具体步骤
-
初始化:
- 参数 θ 0 \theta_0 θ0:初始参数。
- 滑动平均 s 0 s_0 s0:初始化为零向量。
- 全局学习率 η \eta η:一个正的标量值。
- 衰减率 γ \gamma γ:通常取值在 0 到 1 之间,常见的值是 0.9。
- 小常数 ϵ \epsilon ϵ:用于数值稳定性,防止分母为零,通常取值为 1 0 − 8 10^{-8} 10−8。
-
每次迭代的更新:
-
计算梯度:
g t = ∇ J ( θ t ) g_t = \nabla J(\theta_t) gt=∇J(θt)
其中, g t g_t gt 是损失函数 J ( θ t ) J(\theta_t) J(θt) 在当前参数 θ t \theta_t θt 处的梯度。 -
计算滑动平均:
s t = γ s t − 1 + ( 1 − γ ) g t ⊙ g t s_t = \gamma s_{t-1} + (1 - \gamma) g_t \odot g_t st=γst−1+(1−γ)gt⊙gt
其中, ⊙ \odot ⊙ 表示逐元素相乘。这一步计算了梯度平方的滑动平均。 -
计算自适应学习率:
η t , i = η s t , i + ϵ \eta_{t,i} = \frac{\eta}{\sqrt{s_{t,i} + \epsilon}} ηt,i=st,i+ϵη
其中, η t , i \eta_{t,i} ηt,i 是第 i i i 个参数在时刻 t t t 的自适应学习率, s t , i s_{t,i} st,i 是第 i i i 个参数的滑动平均, ϵ \epsilon ϵ 是一个小常数,用于防止分母为零。 -
更新参数:
θ t + 1 , i = θ t , i − η t , i ⋅ g t , i \theta_{t+1,i} = \theta_{t,i} - \eta_{t,i} \cdot g_{t,i} θt+1,i=θt,i−ηt,i⋅gt,i
其中, g t , i g_{t,i} gt,i 是梯度的第 i i i 个元素。
-
3.2.3特点
- 滑动平均:RMSprop通过计算梯度平方的滑动平均来调整学习率,而不是直接使用累积梯度平方。这使得学习率在训练过程中更加稳定,避免了学习率过早衰减的问题。
- 自适应学习率:RMSprop为每个参数动态调整学习率,使得学习率能够根据参数的历史梯度信息进行自适应调整。
- 适合稀疏数据:RMSprop特别适合处理稀疏数据,能够加速收敛并提高模型的性能。
- 减少手动调整学习率的需求:RMSprop减少了手动调整学习率的需求,使得优化过程更加自动化。
3.2.4优点
- 加速收敛:通过自适应调整学习率,RMSprop能够加速收敛,尤其是在训练初期。
- 提高稳定性:通过滑动平均,RMSprop避免了学习率过早衰减,使得训练过程更加稳定。
- 减少手动调整学习率的需求:RMSprop减少了手动调整学习率的需求,使得优化过程更加自动化。
3.2.5缺点
- 内存需求:RMSprop需要存储每个参数的滑动平均,这增加了内存需求。
- 超参数调整:虽然RMSprop减少了手动调整学习率的需求,但仍然需要调整全局学习率 η \eta η 和衰减率 γ \gamma γ。
3.2.6在深度学习中的应用
RMSprop被广泛应用于各种深度学习任务中,尤其是在处理稀疏数据时表现出色。例如,在自然语言处理任务中,RMSprop能够有效地处理稀疏的词嵌入向量;在图像识别任务中,RMSprop也能够加速模型的收敛。
3.2.7实际应用中的注意事项
- 全局学习率的选择:尽管RMSprop为每个参数调整学习率,但全局学习率 η \eta η 的选择仍然很重要。通常需要通过实验来调整合适的全局学习率。
- 衰减率的选择:衰减率 γ \gamma γ 通常取值在 0 到 1 之间,常见的值是 0.9。较大的 γ \gamma γ 值表示更强的滑动平均效果。
- 小常数 ϵ \epsilon ϵ:为了避免分母为零,需要在分母中加入一个小常数 ϵ \epsilon ϵ。通常取值为 1 0 − 8 10^{-8} 10−8。
3.2.8示例
假设我们正在训练一个简单的线性回归模型,损失函数为均方误差,模型参数为 θ \theta θ。以下是RMSprop的更新过程:
-
初始化:
θ 0 = 0 , s 0 = 0 , η = 0.01 , γ = 0.9 , ϵ = 1 0 − 8 \theta_0 = 0, \quad s_0 = 0, \quad \eta = 0.01, \quad \gamma = 0.9, \quad \epsilon = 10^{-8} θ0=0,s0=0,η=0.01,γ=0.9,ϵ=10−8 -
第一次迭代:
- 计算梯度:
g 1 = ∇ J ( θ 0 ) g_1 = \nabla J(\theta_0) g1=∇J(θ0) - 计算滑动平均:
s 1 = 0.9 ⋅ 0 + 0.1 ⋅ g 1 ⊙ g 1 = 0.1 ⋅ g 1 ⊙ g 1 s_1 = 0.9 \cdot 0 + 0.1 \cdot g_1 \odot g_1 = 0.1 \cdot g_1 \odot g_1 s1=0.9⋅0+0.1⋅g1⊙g1=0.1⋅g1⊙g1 - 计算自适应学习率:
η 1 , i = 0.01 s 1 , i + 1 0 − 8 \eta_{1,i} = \frac{0.01}{\sqrt{s_{1,i} + 10^{-8}}} η1,i=s1,i+10−80.01 - 更新参数:
θ 1 , i = θ 0 , i − η 1 , i ⋅ g 1 , i \theta_{1,i} = \theta_{0,i} - \eta_{1,i} \cdot g_{1,i} θ1,i=θ0,i−η1,i⋅g1,i
- 计算梯度:
-
第二次迭代:
- 计算梯度:
g 2 = ∇ J ( θ 1 ) g_2 = \nabla J(\theta_1) g2=∇J(θ1) - 计算滑动平均:
s 2 = 0.9 ⋅ s 1 + 0.1 ⋅ g 2 ⊙ g 2 s_2 = 0.9 \cdot s_1 + 0.1 \cdot g_2 \odot g_2 s2=0.9⋅s1+0.1⋅g2⊙g2 - 计算自适应学习率:
η 2 , i = 0.01 s 2 , i + 1 0 − 8 \eta_{2,i} = \frac{0.01}{\sqrt{s_{2,i} + 10^{-8}}} η2,i=s2,i+10−80.01 - 更新参数:
θ 2 , i = θ 1 , i − η 2 , i ⋅ g 2 , i \theta_{2,i} = \theta_{1,i} - \eta_{2,i} \cdot g_{2,i} θ2,i=θ1,i−η2,i⋅g2,i
- 计算梯度:
通过这种方式,RMSprop能够在每次迭代中根据每个参数的历史梯度信息动态调整学习率,从而加速收敛并提高模型的性能。
3.3AdaDelta
是AdaGrad的扩展,改善了AdaGrad的两个主要缺点:在整个训练过程中学习率的持续衰减以及需要手动选择学习率的需求。
AdaDelta是一种自适应学习率优化算法,旨在解决AdaGrad算法中学习率单调递减的问题。它通过限制累积梯度的窗口大小,并且不需要设置全局学习率,而是根据之前的参数更新量来自适应地调整学习率。以下是AdaDelta算法的详细原理和实现步骤:
3.3.1算法原理
AdaDelta算法的核心在于使用梯度平方的指数加权移动平均来调整学习率,同时引入了一个新的状态变量来记录参数变化量的平方的指数加权移动平均。这种方法使得学习率能够根据参数的历史梯度信息动态调整,而不需要手动设置全局学习率。
3.3.2算法步骤
-
初始化:
- 累积平方梯度的指数加权移动平均变量 s 0 s_0 s0 初始化为零向量。
- 累积参数变化量的平方的指数加权移动平均变量 Δ x 0 \Delta x_0 Δx0 初始化为零向量。
- 衰减率 ρ \rho ρ 通常取值为 0.95。
- 小常数 ϵ \epsilon ϵ 用于数值稳定性,通常取值为 1 0 − 6 10^{-6} 10−6。
-
每次迭代的更新:
- 计算梯度:
g t = ∇ J ( θ t ) g_t = \nabla J(\theta_t) gt=∇J(θt) - 更新累积平方梯度的指数加权移动平均:
s t = ρ s t − 1 + ( 1 − ρ ) g t 2 s_t = \rho s_{t-1} + (1 - \rho) g_t^2 st=ρst−1+(1−ρ)gt2 - 计算参数更新量:
Δ x t = − Δ x t − 1 + ϵ s t + ϵ g t \Delta x_t = -\frac{\sqrt{\Delta x_{t-1} + \epsilon}}{\sqrt{s_t + \epsilon}} g_t Δxt=−st+ϵΔxt−1+ϵgt - 更新参数:
θ t + 1 = θ t + Δ x t \theta_{t+1} = \theta_t + \Delta x_t θt+1=θt+Δxt - 更新累积参数变化量的平方的指数加权移动平均:
Δ x t = ρ Δ x t − 1 + ( 1 − ρ ) Δ x t 2 \Delta x_t = \rho \Delta x_{t-1} + (1 - \rho) \Delta x_t^2 Δxt=ρΔxt−1+(1−ρ)Δxt2
- 计算梯度:
3.3.3特点
- 无需手动设置学习率:AdaDelta算法通过使用参数变化量的平方的指数加权移动平均来动态调整学习率,避免了手动设置全局学习率的需要。
- 自适应调整学习率:AdaDelta算法能够根据参数的历史梯度信息动态调整学习率,使得训练过程更加稳定。
- 对噪声梯度信息的鲁棒性:AdaDelta算法对噪声梯度信息、不同的模型结构、各种数据模式以及超参数的选择表现出较强的鲁棒性。
3.3.4实际应用中的注意事项
- 超参数选择:虽然AdaDelta不需要手动设置学习率,但仍然需要选择合适的衰减率 ρ \rho ρ 和小常数 ϵ \epsilon ϵ。通常, ρ \rho ρ 取值为 0.95, ϵ \epsilon ϵ 取值为 1 0 − 6 10^{-6} 10−6。
- 数值稳定性:小常数 ϵ \epsilon ϵ 的选择对算法的数值稳定性至关重要。如果 ϵ \epsilon ϵ 太小,可能会导致数值不稳定;如果 ϵ \epsilon ϵ 太大,可能会导致学习率调整不够灵敏。
3.3.5总结
AdaDelta算法通过使用梯度平方的指数加权移动平均和参数变化量的平方的指数加权移动平均来动态调整学习率,避免了手动设置全局学习率的需要。这种方法使得AdaDelta在训练过程中能够自适应地调整每个参数的学习率,从而提高了训练的稳定性和效率。
3.4Adam(Adaptive Moment Estimation)
Adam(Adaptive Moment Estimation)是一种结合了动量(Momentum)和RMSprop算法优点的自适应优化算法。它通过计算梯度的一阶矩(均值)和二阶矩(未中心化的方差)的指数加权移动平均来动态调整学习率,从而在训练过程中表现出良好的收敛速度和稳定性。Adam是目前深度学习中最常用的优化算法之一。
3.4.1算法原理
Adam算法的核心在于结合了动量(Momentum)和RMSprop算法的优点,通过计算梯度的一阶矩和二阶矩的指数加权移动平均来动态调整学习率。具体来说,Adam算法维护两个状态变量:一阶矩估计 m t m_t mt 和二阶矩估计 v t v_t vt,分别对应梯度的均值和未中心化的方差。
3.4.2算法步骤
-
初始化:
- 参数 θ 0 \theta_0 θ0:初始参数。
- 一阶矩估计 m 0 m_0 m0:初始化为零向量。
- 二阶矩估计 v 0 v_0 v0:初始化为零向量。
- 全局学习率 η \eta η:一个正的标量值,通常取值为 0.001 0.001 0.001。
- 衰减率 β 1 \beta_1 β1 和 β 2 \beta_2 β2:通常取值为 β 1 = 0.9 \beta_1 = 0.9 β1=0.9 和 β 2 = 0.999 \beta_2 = 0.999 β2=0.999。
- 小常数 ϵ \epsilon ϵ:用于数值稳定性,防止分母为零,通常取值为 1 0 − 8 10^{-8} 10−8。
-
每次迭代的更新:
-
计算梯度:
g t = ∇ J ( θ t ) g_t = \nabla J(\theta_t) gt=∇J(θt)
其中, g t g_t gt 是损失函数 J ( θ t ) J(\theta_t) J(θt) 在当前参数 θ t \theta_t θt 处的梯度。 -
更新一阶矩估计:
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
其中, m t m_t mt 是梯度的指数加权移动平均,用于估计梯度的均值。 -
更新二阶矩估计:
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
其中, v t v_t vt 是梯度平方的指数加权移动平均,用于估计梯度的未中心化方差。 -
偏差校正:
由于 m t m_t mt 和 v t v_t vt 的初始值为零,这会导致初始时刻的估计值偏小。为了校正这种偏差,引入偏差校正项:
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 \hat{m}_t m^t 和 v ^ t \hat{v}_t v^t 是校正后的一阶矩和二阶矩估计。 -
计算自适应学习率:
η t = η v ^ t + ϵ \eta_t = \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} ηt=v^t+ϵη
其中, η t \eta_t ηt 是校正后的自适应学习率, ϵ \epsilon ϵ 是一个小常数,用于防止分母为零。 -
更新参数:
θ t + 1 = θ t − η t m ^ t \theta_{t+1} = \theta_t - \eta_t \hat{m}_t θt+1=θt−ηtm^t
-
3.4.3特点
- 结合动量和RMSprop:Adam结合了动量(Momentum)和RMSprop算法的优点,通过计算梯度的一阶矩和二阶矩的指数加权移动平均来动态调整学习率。
- 自适应学习率:Adam为每个参数动态调整学习率,使得学习率能够根据参数的历史梯度信息进行自适应调整。
- 偏差校正:Adam引入了偏差校正机制,校正了初始时刻的估计值偏小的问题,使得算法在训练初期也能表现出良好的性能。
- 适合大规模数据集:Adam在训练大规模数据集时表现出良好的收敛速度和稳定性,是目前深度学习中最常用的优化算法之一。
3.4.4优点
- 加速收敛:通过自适应调整学习率,Adam能够加速收敛,尤其是在训练初期。
- 提高稳定性:通过偏差校正和指数加权移动平均,Adam在训练过程中表现出良好的稳定性。
- 减少手动调整学习率的需求:Adam减少了手动调整学习率的需求,使得优化过程更加自动化。
3.4.5缺点
- 内存需求:Adam需要存储每个参数的一阶矩估计和二阶矩估计,这增加了内存需求。
- 超参数调整:虽然Adam减少了手动调整学习率的需求,但仍然需要调整全局学习率 η \eta η、衰减率 β 1 \beta_1 β1 和 β 2 \beta_2 β2。
3.4.6在深度学习中的应用
Adam被广泛应用于各种深度学习任务中,包括但不限于:
- 图像识别:在卷积神经网络(CNN)中,Adam能够加速模型的收敛,提高分类的准确性。
- 自然语言处理:在循环神经网络(RNN)和Transformer模型中,Adam能够有效地处理稀疏数据,加速训练过程。
- 强化学习:在强化学习中,Adam能够动态调整学习率,提高训练的稳定性和效率。
3.4.7在实际应用中的注意事项
- 全局学习率的选择:尽管Adam为每个参数调整学习率,但全局学习率 η \eta η 的选择仍然很重要。通常需要通过实验来调整合适的全局学习率。
- 衰减率的选择:衰减率 β 1 \beta_1 β1 和 β 2 \beta_2 β2 通常取值为 0.9 0.9 0.9 和 0.999 0.999 0.999,但可以根据具体任务进行调整。
- 小常数 ϵ \epsilon ϵ:为了避免分母为零,需要在分母中加入一个小常数 ϵ \epsilon ϵ。通常取值为 1 0 − 8 10^{-8} 10−8。
3.4.8示例
假设我们正在训练一个简单的线性回归模型,损失函数为均方误差,模型参数为 θ \theta θ。以下是Adam的更新过程:
-
初始化:
θ 0 = 0 , m 0 = 0 , v 0 = 0 , η = 0.001 , β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 0 − 8 \theta_0 = 0, \quad m_0 = 0, \quad v_0 = 0, \quad \eta = 0.001, \quad \beta_1 = 0.9, \quad \beta_2 = 0.999, \quad \epsilon = 10^{-8} θ0=0,m0=0,v0=0,η=0.001,β1=0.9,β2=0.999,ϵ=10−8 -
第一次迭代:
- 计算梯度:
g 1 = ∇ J ( θ 0 ) g_1 = \nabla J(\theta_0) g1=∇J(θ0) - 更新一阶矩估计:
m 1 = 0.9 ⋅ 0 + 0.1 ⋅ g 1 = 0.1 ⋅ g 1 m_1 = 0.9 \cdot 0 + 0.1 \cdot g_1 = 0.1 \cdot g_1 m1=0.9⋅0+0.1⋅g1=0.1⋅g1 - 更新二阶矩估计:
v 1 = 0.999 ⋅ 0 + 0.001 ⋅ g 1 2 = 0.001 ⋅ g 1 2 v_1 = 0.999 \cdot 0 + 0.001 \cdot g_1^2 = 0.001 \cdot g_1^2 v1=0.999⋅0+0.001⋅g12=0.001⋅g12 - 偏差校正:
m ^ 1 = m 1 1 − 0. 9 1 = 0.1 ⋅ g 1 0.1 = g 1 \hat{m}_1 = \frac{m_1}{1 - 0.9^1} = \frac{0.1 \cdot g_1}{0.1} = g_1 m^1=1−0.91m1=0.10.1⋅g1=g1
v ^ 1 = v 1 1 − 0.99 9 1 = 0.001 ⋅ g 1 2 0.001 = g 1 2 \hat{v}_1 = \frac{v_1}{1 - 0.999^1} = \frac{0.001 \cdot g_1^2}{0.001} = g_1^2 v^1=1−0.9991v1=0.0010.001⋅g12=g12 - 计算自适应学习率:
η 1 = 0.001 v ^ 1 + 1 0 − 8 = 0.001 g 1 2 + 1 0 − 8 \eta_1 = \frac{0.001}{\sqrt{\hat{v}_1} + 10^{-8}} = \frac{0.001}{\sqrt{g_1^2} + 10^{-8}} η1=v^1+10−80.001=g12+10−80.001 - 更新参数:
θ 1 = θ 0 − η 1 m ^ 1 = 0 − η 1 g 1 \theta_1 = \theta_0 - \eta_1 \hat{m}_1 = 0 - \eta_1 g_1 θ1=θ0−η1m^1=0−η1g1
- 计算梯度:
-
第二次迭代:
- 计算梯度:
g 2 = ∇ J ( θ 1 ) g_2 = \nabla J(\theta_1) g2=∇J(θ1) - 更新一阶矩估计:
m 2 = 0.9 ⋅ m 1 + 0.1 ⋅ g 2 m_2 = 0.9 \cdot m_1 + 0.1 \cdot g_2 m2=0.9⋅m1+0.1⋅g2 - 更新二阶矩估计:
v 2 = 0.999 ⋅ v 1 + 0.001 ⋅ g 2 2 v_2 = 0.999 \cdot v_1 + 0.001 \cdot g_2^2 v2=0.999⋅v1+0.001⋅g22 - 偏差校正:
m ^ 2 = m 2 1 − 0. 9 2 \hat{m}_2 = \frac{m_2}{1 - 0.9^2} m^2=1−0.92m2
v ^ 2 = v 2 1 − 0.99 9 2 \hat{v}_2 = \frac{v_2}{1 - 0.999^2} v^2=1−0.9992v2 - 计算自适应学习率:
η 2 = 0.001 v ^ 2 + 1 0 − 8 \eta_2 = \frac{0.001}{\sqrt{\hat{v}_2} + 10^{-8}} η2=v^2+10−80.001 - 更新参数:
θ 2 = θ 1 − η 2 m ^ 2 \theta_2 = \theta_1 - \eta_2 \hat{m}_2 θ2=θ1−η2m^2
- 计算梯度:
通过这种方式,Adam能够在每次迭代中根据每个参数的历史梯度信息动态调整学习率,从而加速收敛并提高模型的性能。
结合了动量梯度下降和RMSProp梯度下降的优势,使用一阶矩估计和二阶矩估计来动态调整学习率,具有自适应学习率的特点,是目前使用最广泛的优化算法之一。
前沿优化创新
- 学习率调度(Learning Rate Scheduling):通过动态调整学习率来提高训练过程的效率,常见的策略包括按时间衰减、周期性调整以及基于性能的调整等,有助于模型在接近最优解时更新更加精细。
- 自适应优化器的自动调节(Auto-tuning Optimizers):研究如何通过自动调节优化器的超参数(如学习率、β1、β2等),使得优化过程更加智能化,例如基于贝叶斯优化和进化算法的超参数调优方法。
- 跨任务的优化算法(Cross-task Optimization):针对多任务学习和迁移学习等场景,设计能够在不同任务之间共享信息和优化策略的优化算法,以提高模型在多个任务上的训练效率。
- 联邦学习中的优化(Federated Learning Optimization):在联邦学习中,由于每个客户端的数据分布可能不同,需要设计全局优化策略来协调各个客户端的更新,解决数据异质性、通信开销和隐私保护等问题。