Adam(Adaptive Moment Estimation)优化器是深度学习中广泛使用的自适应学习率优化算法,结合了动量(Momentum)和 RMSprop 的优点,具有收敛快、稳定性强的特点。以下是 Adam 优化器每一步迭代的详细流程,从初始化到参数更新的完整步骤解析:
在开始前,先明确核心符号(假设优化目标是最小化损失函数 \(L(\theta)\),其中 \(\theta\) 是模型参数):
- t:迭代步数(从 1 开始计数)。
- \(\theta_t\):第 t 步的参数值。
- \(g_t = \nabla_{\theta} L(\theta_t)\):第 t 步的梯度(损失函数对参数的偏导数)。
- \(m_t\):梯度的一阶矩估计(动量项,类似移动平均)。
- \(v_t\):梯度的二阶矩估计(自适应学习率项,类似平方梯度的移动平均)。
- \(\beta_1\):一阶矩的指数衰减率(通常取 0.9)。
- \(\beta_2\):二阶矩的指数衰减率(通常取 0.999)。
- \(\alpha\):学习率(通常取 0.001)。
- \(\epsilon\):数值稳定项(防止分母为 0,通常取 \(10^{-8}\))。
在训练开始前,对模型参数和矩估计进行初始化:
- 参数初始值:\(\theta_0\)(通常随机初始化,如正态分布或均匀分布)。
- 一阶矩初始值:\(m_0 = 0\)(全零向量,与参数维度一致)。
- 二阶矩初始值:\(v_0 = 0\)(全零向量,与参数维度一致)。
根据当前参数 \(\theta_{t-1}\) 计算损失函数的梯度:\(g_t = \nabla_{\theta} L(\theta_{t-1})\)
说明:梯度通过反向传播算法计算,反映了参数对损失的影响方向和大小。
一阶矩估计是梯度的指数移动平均,用于模拟 “动量”,平滑梯度方向的波动:\(m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t\)
说明:
- \(\beta_1 \cdot m_{t-1}\) 保留上一步的动量(类似物理中的惯性)。
- \((1 - \beta_1) \cdot g_t\) 加入当前梯度的贡献,权重由 \(1 - \beta_1\) 控制。
- 若 \(\beta_1 = 0.9\),则当前梯度仅占 10%,历史动量占 90%,有效抑制梯度噪声。
二阶矩估计是梯度平方的指数移动平均,用于衡量梯度的 “可信度”(波动大小):\(v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2\)
说明:
- \(g_t^2\) 是梯度的逐元素平方(非矩阵平方)。
- 若梯度长期较大(如参数处于陡峭区域),\(v_t\) 会增大,后续学习率会自动减小,避免参数震荡;若梯度较小(如平缓区域),\(v_t\) 较小,学习率相对较大,加速收敛。
- 通常 \(\beta_2 = 0.999\),即历史平方梯度占 99.9%,当前平方梯度占 0.1%,更关注长期趋势。
由于初始时 \(m_0 = 0\) 和 \(v_0 = 0\),前几步的 \(m_t\) 和 \(v_t\) 会偏小(偏向 0),需要进行偏差修正:\(\hat{m}_t = \frac{m_t}{1 - \beta_1^t}\)\(\hat{v}_t = \frac{v_t}{1 - \beta_2^t}\)
说明:
- 当 t 较小时(如 \(t=1\)),\(1 - \beta_1^t \approx 0.1\),修正后 \(\hat{m}_t \approx 10 \cdot m_t\),抵消初始值为 0 的影响。
- 当 t 足够大(如 \(t>100\)),\(\beta_1^t \approx 0\),修正项趋近于 1,偏差可忽略。
使用修正后的矩估计更新参数,核心公式为:\(\theta_t = \theta_{t-1} - \alpha \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}\)
说明:
- \(\frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}\) 是 “有效梯度”:分子是修正后的动量(方向和大小),分母是修正后的二阶矩平方根(类似梯度的标准差),整体实现 “梯度除以自身波动”,即自适应学习率。
- \(\epsilon\) 防止 \(\sqrt{\hat{v}_t}\) 过小导致分母为 0(数值稳定性)。
- 学习率 \(\alpha\) 控制更新步长的整体缩放,需根据任务调参(如 0.001、0.0001)。
通过上述步骤,Adam 实现了两大核心特性:
- 动量机制(一阶矩):平滑梯度方向,加速收敛(尤其在鞍点或平坦区域)。
- 自适应学习率(二阶矩):对梯度波动大的参数减小步长,对梯度稳定的参数增大步长,避免手动调参的麻烦。
这使得 Adam 在大多数深度学习任务(如 NLP、CV、推荐系统)中表现优异,成为默认优化器之一。
初始化:θ₀, m₀=0, v₀=0
for t = 1, 2, ... do
1. 计算梯度 gₜ = ∇L(θₜ₋₁)
2. 更新一阶矩 mₜ = β₁·mₜ₋₁ + (1-β₁)·gₜ
3. 更新二阶矩 vₜ = β₂·vₜ₋₁ + (1-β₂)·gₜ²
4. 修正偏差:m̂ₜ = mₜ/(1-β₁ᵗ), v̂ₜ = vₜ/(1-β₂ᵗ)
5. 更新参数:θₜ = θₜ₋₁ - α·(m̂ₜ / (√v̂ₜ + ε))
end