PyTorch中param_groups具体指什么?如何逐权重/偏置动态更新学习率?
为PyTorch中每个权重/偏置单独动态更新学习率
核心思路
PyTorch的param_groups支持为每个单独参数创建分组,只要初始化优化器时把每个参数拆成独立的group,就能实现对每个权重矩阵、偏置项单独设置和动态更新学习率。
具体实现步骤
1. 初始化优化器:为每个参数创建独立分组
遍历模型的所有参数,为每个参数单独生成一个param_group,同时可根据参数类型(权重/偏置)设置初始学习率:
import torch import torch.nn as nn import torch.optim as optim # 示例模型 class SimpleModel(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(10, 20) self.fc2 = nn.Linear(20, 10) model = SimpleModel() # 为每个参数创建独立param_group param_groups = [] for name, param in model.named_parameters(): # 根据参数名区分权重/偏置,设置不同初始LR initial_lr = 0.01 if 'weight' in name else 0.001 param_groups.append({ 'params': [param], 'lr': initial_lr, 'name': name # 保存参数名,方便后续动态更新 }) # 初始化优化器 optimizer = optim.SGD(param_groups)
2. 训练过程中动态更新学习率
在训练循环里,直接遍历优化器的param_groups,根据参数名、训练步数或其他条件修改对应group的lr值:
epochs = 10 for epoch in range(epochs): model.train() # 前向传播、计算损失、反向传播逻辑省略... # 动态更新学习率示例: for group in optimizer.param_groups: param_name = group['name'] current_lr = group['lr'] # 示例1:权重参数每轮衰减5%,偏置保持不变 if 'weight' in param_name: group['lr'] = current_lr * 0.95 # 示例2:fc1层的权重单独逐步提升学习率 if param_name == 'fc1.weight': group['lr'] = current_lr * (1 + 0.01 * epoch) optimizer.step() print(f"Epoch {epoch+1}: 各参数LR: {[(g['name'], round(g['lr'], 6)) for g in optimizer.param_groups]}")
关键注意事项
- 每个param_group必须包含
params字段(需传入参数列表,这里每个列表仅放单个参数),其他字段(如lr、自定义的name)为可选辅助项。 - 修改
param_groups中的lr后,下一次调用optimizer.step()就会使用新学习率更新对应参数。 - 复杂调度逻辑可封装成独立函数,结合训练状态(如损失变化、全局步数)灵活调整。
内容的提问来源于stack exchange,提问作者Toonia
相关产品推荐
相关产品推荐

