深入解析 Adam 优化器

tensorflow.keras.optimizers.Adam 是 TensorFlow/Keras 中最常用、性能优异的优化器之一。它结合了 自适应学习率动量机制,在训练深度神经网络时通常能快速收敛且对超参数不敏感。

下面从 作用、用法、数学原理 三方面详细介绍:


一、作用(What it does)

Adam(Adaptive Moment Estimation )是一种一阶梯度优化算法,主要用于:

  • 自动调整每个参数的学习率;
  • 利用梯度的一阶矩(均值)和二阶矩(未中心化的方差)进行自适应更新;
  • 在稀疏梯度或非平稳目标函数下表现良好;
  • 广泛适用于 CNN、RNN、Transformer 等各类模型。

优点

  • 收敛速度快;
  • 内存需求低;
  • 对超参数鲁棒(默认参数常可直接使用);
  • 适合处理大规模数据和高维参数空间。

二、用法(How to use in TensorFlow/Keras)

1. 基本用法

python 复制代码
import tensorflow as tf

model = tf.keras.Sequential([...])
model.compile(
    optimizer='adam',  # 使用默认 Adam
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

2. 自定义参数

python 复制代码
optimizer = tf.keras.optimizers.Adam(
    learning_rate=0.001,    # 初始学习率(默认 0.001)
    beta_1=0.9,             # 一阶矩估计的指数衰减率(默认 0.9)
    beta_2=0.999,           # 二阶矩估计的指数衰减率(默认 0.999)
    epsilon=1e-7,           # 数值稳定性小常数(默认 1e-7)
    amsgrad=False           # 是否使用 AMSGrad 变体(默认 False)
)

model.compile(optimizer=optimizer, ...)

3. 动态调整学习率(推荐)

python 复制代码
# 使用学习率调度器
initial_lr = 0.001
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
    initial_lr, decay_steps=1000, decay_rate=0.9
)
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)

三、数学原理(How it works)

Adam 的核心思想是:为每个参数维护一个自适应的学习率,基于梯度的历史信息。

设第 ttt 步的参数为 θt\theta_tθt ,损失函数对 θ\thetaθ 的梯度为 gt=∇θJ(θt)g_t = \nabla_\theta J(\theta_t)gt=∇θJ(θt) 。

Step 1: 计算一阶矩(动量项)和二阶矩(自适应学习率项)

  • 一阶矩(均值)估计:

mt=β1mt−1+(1−β1)gt m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt

  • 二阶矩(未中心化方差)估计:

vt=β2vt−1+(1−β2)gt2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2

其中 m_0 = 0 , v_0 = 0

注意: m_t v_t 有偏估计(因为初始为 0,早期值偏小)。

Step 2: 偏差修正(Bias Correction)

为消除初始偏差,对 m_t v_t 进行修正:

m^t=mt1−β1t,v^t=vt1−β2t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} m^t=1−β1tmt,v^t=1−β2tvt

Step 3: 参数更新

θt+1=θt−ηv^t+ϵ⋅m^t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t θt+1=θt−v^t +ϵη⋅m^t

其中:

  • \\eta 是学习率(即 learning_rate);
  • \\epsilon 是防止除零的小常数(如 10\^{-7} );
  • 分母 \\sqrt{\\hat{v}_t} + \\epsilon 起到自适应学习率作用: \\downarrow 梯度大则步长小,梯度小则步长大。

四、关键超参数解释

参数 默认值 作用
learning_rate ( η\etaη ) 0.001 控制整体更新步长
beta_1 0.9 控制一阶矩(动量)的衰减速度,越大越平滑
beta_2 0.999 控制二阶矩(梯度平方)的衰减速度,影响自适应程度
epsilon 1e-7 防止除零,数值稳定

经验建议:除非有特殊需求,否则不要轻易修改 beta_1beta_2 。调整 learning_rate 即可。


五、Adam vs 其他优化器

优化器 特点 适用场景
SGD 简单,需手动调 lr 理论研究、微调
RMSprop 自适应 lr,无动量 RNN 常用
Adam 自适应 lr + 动量 通用首选
AdamW Adam + 权重衰减解耦 Transformer、BERT 等

AdamW 是 Adam 的改进版,在 Hugging Face Transformers 等库中已成为默认优化器。


六、注意事项

  1. Adam 不一定总是最优:在某些任务(如图像分类微调)中,带 warmup 的 SGD 可能泛化更好。
  2. 学习率仍需调优:虽然 Adam 对 lr 不敏感,但 0.01 可能发散,0.00001 可能太慢。
  3. 避免与其他正则化冲突 :如同时使用 L2 正则和 Adam,注意 Keras 中 kernel_regularizer 是加在 loss 上的,而 AdamW 才是"真正"的权重衰减。

总结

Adam = Momentum(动量) + RMSprop(自适应学习率) + 偏差修正

它通过历史梯度动态调整每个参数的更新步长,兼顾速度、稳定性和通用性,是深度学习训练的"瑞士军刀"。

在绝大多数项目中,直接使用 optimizer='adam' 即可获得良好效果,后续再根据验证集表现微调学习率或尝试 AdamW。

相关推荐
不羁的木木4 小时前
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第6篇:图片滤镜效果实现
图像处理·深度学习·harmonyos
CCC:CarCrazeCurator7 小时前
A100作为深度学习基础计算节点的原因
人工智能·深度学习
hhzz7 小时前
Barbershop:基于GAN和分割Mask的图像合成技术——从理论到实战全解析
图像处理·人工智能·python·深度学习·计算机视觉
数智工坊13 小时前
RealNet:用于异常检测的特征选择网络,具备真实的合成异常样本
人工智能·深度学习
阳明山水13 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
m0_6265352014 小时前
GAE generalized advantage estimation 广义优势估计
深度学习
力学与人工智能14 小时前
POF | 西工大曹文博、张伟伟等:基于时间步进导向的神经网络求解高雷诺数壁湍流问题
人工智能·神经网络·机器学习·高雷诺数·湍流
卡梅德生物科技小能手14 小时前
卡美德生物科普NGF(神经生长因子):神经系统发育与修复的关键调节因子
经验分享·深度学习·生活
大鱼>14 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物
我没胡说八道14 小时前
论文排版避坑指南|按问题选工具,不踩坑,选好工具
人工智能·深度学习·考研·计算机视觉·自然语言处理·论文