You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:10:27