深度学习中优化器的Adamax算法原理与实现细节
字数 1682 2025-10-31 08:19:25
深度学习中优化器的Adamax算法原理与实现细节
题目描述
Adamax是Adam优化器的一种变体,由Kingma和Ba在Adam原论文中提出。它通过将Adam中基于L2范数的自适应学习率机制替换为基于L∞范数(无穷范数)的更新规则,旨在更稳定地处理稀疏梯度问题,并简化超参数调节。本题目将详解Adamax的数学原理、计算步骤、优势及实现细节。
解题过程循序渐进讲解
-
背景与动机
- Adam优化器结合了动量(一阶矩估计)和自适应学习率(二阶矩估计),但其二阶矩估计使用梯度平方的指数移动平均(EMA),可能对异常值敏感。
- Adamax通过使用L∞范数替代L2范数计算二阶矩,使得更新步长对梯度幅度的变化更鲁棒,尤其在梯度稀疏的场景(如自然语言处理任务)中表现更稳定。
-
关键概念定义
- 一阶矩(m_t):梯度的指数移动平均,估计梯度方向,类似动量。
- 无穷范数(u_t):梯度各维度绝对值的最大值,用于替代Adam中的二阶矩(v_t)。其计算方式为:
\[ u_t = \max(\beta_2 \cdot u_{t-1}, |g_t|) \]
其中 $ g_t $ 是当前梯度,$ \beta_2 $ 为衰减率(通常取0.999)。
-
算法步骤详解
初始化:- 一阶矩 \(m_0 \leftarrow 0\)(向量)
- 无穷范数 \(u_0 \leftarrow 0\)(标量,实际为各维度共享)
- 时间步 \(t \leftarrow 0\)
- 超参数:学习率 \(\alpha\)、一阶矩衰减率 \(\beta_1\)(通常0.9)、二阶矩衰减率 \(\beta_2\)(通常0.999)
迭代更新(对于每个时间步t):
- 计算当前梯度 \(g_t\)(基于当前参数 \(\theta_t\))。
- 更新一阶矩:
\[ m_t \leftarrow \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t \]
- 更新无穷范数(逐元素取最大值):
\[ u_t \leftarrow \max(\beta_2 \cdot u_{t-1}, |g_t|) \]
*注:$ |g_t| $ 表示梯度各维度的绝对值,max操作按元素比较。*
- 偏差校正(Bias Correction):
- 仅对一阶矩进行校正(因 \(u_t\) 无需校正):
\[ \hat{m}_t \leftarrow \frac{m_t}{1 - \beta_1^t} \]
- 更新参数:
\[ \theta_t \leftarrow \theta_{t-1} - \frac{\alpha}{u_t} \cdot \hat{m}_t \]
*注:分母 $ u_t $ 为标量,所有参数维度共享相同的学习率缩放因子。*
-
与Adam的对比
- 二阶矩处理:Adam使用 \(v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2\),而Adamax直接取历史梯度绝对值与当前梯度绝对值的最大值,避免平方操作带来的数值不稳定。
- 参数更新:Adam的分母为 \(\sqrt{\hat{v}_t} + \epsilon\),Adamax的分母为 \(u_t\),更简洁且对极端梯度不敏感。
-
优势与适用场景
- 稀疏梯度优化:如Word2Vec或Transformer的嵌入层,梯度分布不均匀时,Adamax能避免学习率过度缩放。
- 超参数简化:因 \(u_t\) 的累积方式更稳定,对 \(\beta_2\) 的敏感性低于Adam。
-
代码实现示例(Python/PyTorch风格)
import torch def adamax_update(parameters, gradients, m, u, t, alpha=0.002, beta1=0.9, beta2=0.999): t += 1 m = beta1 * m + (1 - beta1) * gradients u = torch.max(beta2 * u, torch.abs(gradients)) m_hat = m / (1 - beta1**t) parameters -= alpha / u * m_hat return parameters, m, u, t注:实际需对每个参数组迭代,此处为简化示意。
总结
Adamax通过无穷范数替代二阶矩估计,在保持自适应学习率优点的同时,提升了算法对稀疏梯度的适应性。其实现简单,适用于需要稳定优化的大规模深度学习模型。