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_1和beta_2。调整learning_rate即可。
五、Adam vs 其他优化器
| 优化器 | 特点 | 适用场景 |
|---|---|---|
| SGD | 简单,需手动调 lr | 理论研究、微调 |
| RMSprop | 自适应 lr,无动量 | RNN 常用 |
| Adam | 自适应 lr + 动量 | 通用首选 |
| AdamW | Adam + 权重衰减解耦 | Transformer、BERT 等 |
AdamW 是 Adam 的改进版,在 Hugging Face Transformers 等库中已成为默认优化器。
六、注意事项
- Adam 不一定总是最优:在某些任务(如图像分类微调)中,带 warmup 的 SGD 可能泛化更好。
- 学习率仍需调优:虽然 Adam 对 lr 不敏感,但 0.01 可能发散,0.00001 可能太慢。
- 避免与其他正则化冲突 :如同时使用 L2 正则和 Adam,注意 Keras 中
kernel_regularizer是加在 loss 上的,而 AdamW 才是"真正"的权重衰减。
总结
Adam = Momentum(动量) + RMSprop(自适应学习率) + 偏差修正
它通过历史梯度动态调整每个参数的更新步长,兼顾速度、稳定性和通用性,是深度学习训练的"瑞士军刀"。
在绝大多数项目中,直接使用 optimizer='adam' 即可获得良好效果,后续再根据验证集表现微调学习率或尝试 AdamW。