Adam 优化器原理及其与 SGD 的不同
编辑日期: 2024-07-16 文章阅读: 次
Adam 优化器原理
Adam(Adaptive Moment Estimation)是一个结合了动量和 RMSProp 优点的优化算法。它利用梯度的一阶矩估计和二阶矩估计动态调整学习率,适用于处理稀疏梯度问题和大规模数据集。Adam 通过计算梯度的一阶和二阶矩的移动平均值来实现这一点。
算法步骤
Adam 算法的更新规则如下:
第一,初始化参数:
\(m_0 = 0\)(一阶矩估计的初始值)
\(v_0 = 0\)(二阶矩估计的初始值)
\(t = 0\)(时间步)
设置学习率 \(\alpha\)、一阶矩估计的衰减率 \(\theta_1\)、二阶矩估计的衰减率 \(\theta_2\),以及防止分母为零的小常数 \(\epsilon\)。
第二,梯度计算:
计算损失函数 \(L(\theta)\) 对参数 \(\theta\) 的梯度 \(g_t = \nabla L(\theta_t)\)。
第三,更新一阶矩估计:
第四,更新二阶矩估计:
第五,计算偏差校正:
第六,参数更新:
用法示例
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(10, 1)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
inputs = torch.randn(32, 10) # 假设有 32 个样本,每个样本有 10 个特征
targets = torch.randn(32, 1) # 假设对应的 32 个目标值
outputs = model(inputs)
loss = criterion(outputs, targets)
optimizer.zero_grad() # 清空梯度
loss.backward() # 计算梯度
optimizer.step() # 更新参数
关键参数
params
:模型参数,可以是模型的参数列表或模型参数的迭代器。lr
:学习率,控制每次参数更新的步长。momentum
(可选):动量因子,默认为 0。weight_decay
(可选):权重衰减(L2 正则化),默认为 0。dampening
(可选):动量的抑制因子,默认为 0。nesterov
(可选):布尔值,指示是否使用 Nesterov 动量,默认为 False。
动量
动量(Momentum)是 SGD 的一种扩展,用于加速收敛并减小震荡。其更新规则为:
其中,\(v_t\) 是动量项,\(\mu\) 是动量因子。
Adam 与 SGD 的不同
1. 梯度动量
-
SGD:标准 SGD 直接使用当前梯度进行参数更新。如果加入动量,SGD 可以通过动量项累积之前的梯度信息,使得优化过程更加平滑。
-
Adam:Adam 结合了一阶矩(动量)和二阶矩(梯度平方的移动平均)来调整每个参数的学习率。这样可以使优化过程更稳定,并且更快地收敛。
2. 学习率调整
-
SGD:通常需要手动调整学习率,学习率在训练过程中保持不变或根据预先设定的计划逐步降低。
-
Adam:学习率根据梯度的一阶和二阶矩动态调整,每个参数都有独立的学习率,适应性更强,通常不需要手动调整。
3. 偏差校正
-
SGD:没有偏差校正。
-
Adam:引入了偏差校正,尤其是在初始阶段,保证了估计值的无偏性。
4. 超参数
-
SGD:主要超参数是学习率 \(\alpha\),如果使用动量,还有动量因子 \(\theta\)。
-
Adam:主要超参数包括学习率 \(\alpha\)、一阶矩估计的衰减率 \(\theta_1\)、二阶矩估计的衰减率 \(\theta_2\),以及防止分母为零的小常数 \(\epsilon\)。
总结
Adam 优化器通过结合动量和自适应学习率调整机制,提供了比标准 SGD 更加鲁棒和高效的优化方法,特别适合处理稀疏梯度和大规模数据集的问题。两者在应用中的选择取决于具体的任务需求和数据特性。