趋近智
为优化器选择合适的超参数 (parameter) (hyperparameter)对于成功训练大型语言模型来说非常重要。尽管像AdamW这样的自适应优化器与传统SGD相比简化了一些方面,但找到学习率、动量项、epsilon以及权重 (weight)衰减的最佳设置仍然是训练过程中的主要组成部分,特别是在考虑到LLM训练的规模和成本时。这些超参数直接影响模型的收敛速度、稳定性和最终性能。本文探讨如何选择这些主要参数的值,包括AdamW、学习率调度和梯度裁剪等概念的考量。
学习率也许是唯一最重要的超参数 (parameter) (hyperparameter)。它决定了梯度下降 (gradient descent)过程中采取的步长。设置过高,训练可能会变得不稳定,导致发散或损失波动。设置过低,训练会慢得不切实际,可能陷入次优的局部最小值。
Adam和AdamW使用两个类似动量的项,由和控制。
对于大多数LLM训练场景,和的默认值效果非常好,通常无需修改即可使用。
Adam/AdamW中的epsilon项()是一个小值,在自适应学习率计算时加到分母中(具体来说,是在计算第二阶矩估计的平方根之前)。它的主要目的是防止除以零并提高数值稳定性,尤其当第二阶矩估计非常接近零时。
权重衰减是一种正则化 (regularization)技术,通过向损失函数 (loss function)添加与模型权重平方大小成比例的惩罚项来防止过拟合 (overfitting)。如前所述,AdamW实现了解耦的权重衰减,与自适应梯度一起使用时,通常优于原始Adam优化器固有的L2正则化方法。
请记住这些超参数 (parameter) (hyperparameter)彼此关联。更改学习率可能需要调整权重 (weight)衰减。学习率调度的有效性与所选的峰值学习率有关。
以下是如何在PyTorch中定义AdamW优化器并指定这些超参数:
import torch
# 假设 'model' 是您的大型语言模型实例
# 定义超参数
peak_lr = 2e-4
beta1 = 0.9
beta2 = 0.98 # 示例,使用了略微调整的beta2
epsilon = 1e-8
weight_decay_lambda = 0.1
# 过滤不应应用权重衰减的参数
# (例如,偏置、层归一化权重)
decay_params = []
no_decay_params = []
for pn, p in model.named_parameters():
if p.requires_grad:
# 检查偏置或1D参数(如层归一化权重)
if (pn.endswith("bias") or
len(p.shape) == 1):
no_decay_params.append(p)
# print(f"不衰减的参数: {pn}") # 解开注释用于调试
else:
decay_params.append(p)
# print(f"衰减的参数: {pn}") # 解开注释用于调试
# 创建优化器参数组
optimizer_grouped_parameters = [
{'params': decay_params, 'weight_decay': weight_decay_lambda},
{
'params': no_decay_params,
'weight_decay': 0.0
# 这些参数不进行权重衰减
}
]
# 实例化优化器
optimizer = torch.optim.AdamW(
optimizer_grouped_parameters,
lr=peak_lr,
# 注意:学习率调度器将在训练期间调整此值
betas=(beta1, beta2),
eps=epsilon
)
print(
f"优化器已创建,包含 {len(optimizer_grouped_parameters)} "
f"个参数组。"
)
print(
f"组 0(衰减):"
f"{len(optimizer_grouped_parameters[0]['params'])} 个张量,"
f"weight_decay="
f"{optimizer_grouped_parameters[0]['weight_decay']}"
)
print(
f"组 1(无衰减):"
f"{len(optimizer_grouped_parameters[1]['params'])} 个张量,"
f"weight_decay="
f"{optimizer_grouped_parameters[1]['weight_decay']}"
)
# 学习率调度器通常的使用示例
# (此处未显示调度器设置)
# 假设调度器已在其他地方根据峰值学习率、预热和衰减定义
# for step in range(num_training_steps):
# current_lr = scheduler.get_last_lr()[0] # 从调度器获取当前学习率
# # 在优化器步进*之前*设置优化器的学习率
# for param_group in optimizer.param_groups:
# param_group['lr'] = current_lr
# # ... 前向传播,损失计算,反向传播 ...
# optimizer.step()
# scheduler.step() # 更新调度器
# optimizer.zero_grad()
此PyTorch代码片段示例展示了如何使用独立的参数组初始化AdamW优化器,以选择性地应用权重衰减。偏置 (bias)和归一化 (normalization)层参数通常会关闭权重衰减。
要点:
找到最优的超参数集合是一个迭代过程。仔细选择,依据既定实践并通过监测进行经验观察,对于应对大规模模型优化的复杂性非常重要。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•