Adam 是一种可以替代传统随机梯度下降过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重。Adam 最开始是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jimmy Ba 在 2015 年 ICLR 论文(Adam: A Method for Stochastic Optimization)中提出的。该算法名为「Adam」,其并不是首字母缩写,也不是人名,它的名称来源于适应性矩估计(adaptive moment estimation)。
在 Adam 提出之前,人们已经在使用像 Momentum 和 RMSProp 这样的优化算法来加速深度神经网络的训练过程。然而,这些算法各有优势和局限。Momentum 善于处理梯度的方向和大小,而 RMSProp 善于调整学习率以应对数据的稀疏性。Adam 的提出是为了结合这两种算法的优点,同时减少它们的缺点,提供一种更加鲁棒的优化解决方案。
Adam优化器在构建完成后,具备一个param_groups列表,这个列表包含了哪些变量需要更新,这些变量更新的学习率如何,这个属性列表可通过param_groups()方法获取。param_groups()方法返回一个list列表,它的每个元素都是一组独立的参数,以dict的方式进行存储,结构参见下图:
-param_groups
-0(dict) # 第一组参数
params: # 维护要更新的参数
lr: # 该组参数的学习率
weight_decay: # 该组参数的权重衰减系数
-1(dict) # 第二组参数
-2(dict) # 第三组参数
...
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.nn1 = nn.Linear(2, 3)
self.nn2 = nn.Linear(3, 6)
def forward(self, x):
x = F.relu(self.nn1(x))
return F.relu(self.nn2(x))
model = MyModel()
optimizer_Adam = torch.optim.Adam(model.parameters(), lr=0.1)
print(optimizer_Adam.param_groups())
结果为:
[
{
"params": [Parameter containing:tensor([[-0.0386, 0.3979],
[ 0.2451, -0.5477],
[ 0.2848, -0.6663]], requires_grad=True),
Parameter containing:tensor([-0.6260, 0.6027, 0.0412], requires_grad=True),
Parameter containing:tensor([[-0.2931, -0.3993, 0.1601],
[ 0.1608, 0.1821, 0.4538],
[ 0.3516, -0.4239, -0.5256],
[ 0.4598, 0.1838, -0.4019],
[-0.4469, 0.4455, 0.1316],
[-0.1232, 0.3769, -0.1184]], requires_grad=True),
Parameter containing:tensor([ 0.1404, -0.0542, -0.0085, 0.0995, 0.3741, -0.0223],requires_grad=True)],
"lr": 0.1,
"betas": (0.9, 0.999),
"eps": 1e-08,
"weight_decay": 0,
"amsgrad": False,
"maximize": False,
"foreach": None,
"capturable": False,
"differentiable": False,
"fused": None
}
]
略