趋近智
Adam (自适应矩估计) 优化器结合了动量(Momentum)在相关方向上加速梯度下降的优势,以及 RMSprop 为每个参数调整学习率的特点。这种强大的算法为每个参数计算自适应学习率,同时融入动量。Adam 是目前深度学习中最常用且有效的优化算法之一,通常是一个不错的默认选择。
Adam 保留了过去梯度的两个指数衰减移动平均值:
一阶矩估计 (类似于动量): 这跟踪梯度的均值。它类似于我们之前看到的动量项,有助于在一致的梯度方向上加速进展并抑制振荡。我们称之为 mt。
mt=β1mt−1+(1−β1)gt其中,gt 是当前时间步 t 的梯度,而 β1 是此一阶矩估计的指数衰减率(通常接近 1,例如 0.9)。
二阶矩估计 (类似于 RMSprop): 这跟踪梯度的未中心化方差。它类似于 RMSprop 中的机制,根据每个参数近期梯度的大小反向调整学习率。我们称之为 vt。
vt=β2vt−1+(1−β2)gt2其中,gt2 表示梯度的逐元素平方,而 β2 是此二阶矩估计的指数衰减率(通常也接近 1,例如 0.999)。
这些移动平均值可能存在一个问题,特别是在训练初期(当 t 较小时),它们被初始化为零。这种初始化会使矩估计偏向零。Adam 通过计算偏差校正后的估计值来抵消这种影响:
m^t=1−β1tmt v^t=1−β2tvt随着时间步 t 的增加,项 β1t 和 β2t 趋近于零,使得偏差校正的重要性降低。然而,在训练初期,这种校正能提供更好的矩估计。
最后,Adam 更新规则使用这些偏差校正后的估计值来更新模型参数 θ:
θt+1=θt−v^t+ϵαm^t我们来分解一下:
实际上,Adam 使用梯度方差估计为每个参数计算一个单独的自适应学习率,并沿梯度均值估计平滑的方向进行更新。
Adam 有几个超参数:
Adam 的一个显著优点是其默认超参数值通常在各种问题上表现良好,与带有动量的 SGD 相比,需要较少的手动调整。
# 在 PyTorch 中使用 Adam 的例子
import torch
import torch.optim as optim
import torch.nn as nn
# 假设 'model' 是你定义的神经网络 (nn.Module)
# 假设 'loss_fn' 是你的损失函数
# 假设 'dataloader' 提供批量数据
# model = YourModelDefinition(...)
# loss_fn = nn.CrossEntropyLoss() # 分类例子
# dataloader = YourDataLoader(...)
# 初始化 Adam 优化器
# 常见做法:学习率 = 0.001, betas=(0.9, 0.999), eps=1e-8
optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8)
# --- 在你的训练循环中 ---
# for data, labels in dataloader:
# optimizer.zero_grad() # 清除之前的梯度
# outputs = model(data) # 前向传播
# loss = loss_fn(outputs, labels) # 计算损失
# loss.backward() # 反向传播(计算梯度)
# optimizer.step() # 使用 Adam 更新权重
# --- 训练循环代码片段结束 ---
print("示例:优化器已初始化。")
# 注意:以上代码需要定义 'model' 和 'dataloader' 才能完整运行。
尽管 Adam 是一个强大且广泛使用的优化器,但值得注意的是,对于某些特定任务,经过精细调整的带有动量的 SGD 偶尔可能会实现略好的泛化性能。然而,Adam 在大多数深度学习应用中仍然是一个极佳的起点和表现出色的算法。
通过将自适应学习率与动量结合,并引入偏差校正,Adam 提供了一种有效的方式来应对训练深度神经网络时遇到的损失曲面。它直接建立在通过反向传播进行梯度计算以及动量和 RMSprop 中迭代改进的基础之上。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造