深入解析 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。

相关推荐
生信之灵2 小时前
追踪17只果蝇、7只线虫、10只小鼠,全程无需人工标注:这个无监督跟踪器如何颠覆动物行为研究?
人工智能·深度学习·神经网络·microsoft·交互
Purple Coder2 小时前
电力系统分析 第一章
深度学习
八月瓜科技2 小时前
豆包启动付费会员测试,承诺基础服务永久免费,免费AI时代是否终结?
数据库·人工智能·科技·深度学习·机器人
wayz114 小时前
Day 19 编程实战:LSTM股价预测
人工智能·rnn·深度学习·神经网络·lstm
动物园猫5 小时前
公共安全打架行为识别数据集分享(适用于YOLO系列深度学习检测任务)
人工智能·深度学习·yolo
AI棒棒牛5 小时前
YOLOv13最新创新改进系列:比闪电还快的医学影像分析!YOLOv13+EMCAD融合实战,改进代码已跑通!cvpr2025最新独家改进!
深度学习·yolo·目标检测·计算机视觉
bst@微胖子5 小时前
PyTorch深度学习框架之基于RNN实现AI歌词生成器
深度学习
赵优秀一一5 小时前
AI入门学习
人工智能·pytorch·深度学习
2zcode5 小时前
原创文档:基于MATLAB深度学习与传统机器学习的脑肿瘤MRI图像分类系统
深度学习·机器学习·分类