Super-Gradients 项目中的学习率调度技术详解

Super-Gradients 项目中的学习率调度技术详解

super-gradients Deci-AI/super-gradients: 是一个用于深度学习模型优化的库。适合用于需要训练和优化深度学习模型的研究者和开发者。特点是可以提供高效的优化算法和工具,支持多种深度学习框架。 super-gradients 项目地址: https://gitcode.com/gh_mirrors/su/super-gradients

学习率调度概述

在深度神经网络训练过程中,随着训练的进行动态调整学习率是一种常见且有效的优化策略。Super-Gradients 提供了多种学习率调度方式,帮助开发者更高效地训练模型。

内置学习率调度器

Super-Gradients 提供了四种主要的学习率调度策略:

  1. StepLRScheduler(步进式调度)

    • 在指定epoch进行学习率衰减
    • 每次衰减比例为lr_decay_factor
    • 适用于需要明确控制学习率变化点的场景
  2. PolyLRScheduler(多项式调度)

    • 采用多项式衰减公式:lr = initial_lr * (1 - current_iter/max_iter)^0.9
    • 提供平滑的学习率下降曲线
  3. CosineLRScheduler(余弦退火调度)

    • 基于余弦函数调整学习率
    • 通过cosine_final_lr_ratio控制最终学习率比例
    • 适合需要周期性调整学习率的场景
  4. FunctionLRScheduler(自定义函数调度)

    • 允许用户完全自定义学习率变化函数
    • 通过lr_schedule_function参数传入自定义函数

配置学习率调度器

在代码中配置学习率调度器非常简单:

train_params = {
    "initial_lr": 0.1,
    "lr_mode": "StepLRScheduler",
    "lr_updates": [100, 150, 200],  # 在这些epoch进行学习率衰减
    "lr_decay_factor": 0.1,  # 每次衰减比例
    # 其他训练参数...
}

或者在YAML配置文件中:

training_hyperparams:
    initial_lr: 0.1
    lr_mode: StepLRScheduler
    user_lr_updates:
      - 100
      - 150
      - 200
    lr_decay_factor: 0.1

自定义学习率调度器

当内置调度器不能满足需求时,可以创建自定义调度器:

  1. 继承LRCallbackBase基类

    • 必须实现perform_schedulingis_lr_scheduling_enabled方法
    • perform_scheduling负责计算新的学习率
    • is_lr_scheduling_enabled控制何时启用调度
  2. 示例:自定义步进式调度器

from super_gradients.training.utils.callbacks import LRCallbackBase, Phase
from super_gradients.common.registry import register_lr_scheduler

@register_lr_scheduler("user_step")
class UserStepLRCallback(LRCallbackBase):
    def __init__(self, user_lr_updates, user_lr_decay_factors, **kwargs):
        super().__init__(Phase.TRAIN_EPOCH_END, **kwargs)
        self.lr_updates = user_lr_updates
        self.lr_decay_factors = user_lr_decay_factors

    def perform_scheduling(self, context):
        curr_lr = self.initial_lr
        for epoch_idx, decay_rate in zip(self.lr_updates, self.lr_decay_factors):
            if epoch_idx <= context.epoch:
                curr_lr *= decay_rate
        self.lr = curr_lr
        self.update_lr(context.optimizer, context.epoch, None)

    def is_lr_scheduling_enabled(self, context):
        return self.training_params.lr_warmup_epochs <= context.epoch
  1. 使用自定义调度器
train_params = {
    "initial_lr": 0.1,
    "lr_mode": "user_step",
    "user_lr_updates": [100, 150, 200],
    "user_lr_decay_factors": [0.1, 0.01, 0.001],
    # 其他参数...
}

使用PyTorch原生调度器

Super-Gradients 也支持直接使用PyTorch的原生调度器:

  1. 基本配置格式
lr_mode = {
    "调度器类名": {
        "调度器参数": 值,
        "phase": Phase.阶段,
        "metric_name": "监控指标名"  # 仅ReduceLROnPlateau需要
    }
}
  1. StepLR示例
train_params = {
    "lr_mode": {
        "StepLR": {
            "gamma": 0.1,
            "step_size": 1,
            "phase": Phase.TRAIN_EPOCH_END
        }
    },
    # 其他参数...
}
  1. ReduceLROnPlateau示例
train_params = {
    "lr_mode": {
        "ReduceLROnPlateau": {
            "patience": 3,
            "phase": Phase.TRAIN_EPOCH_END,
            "metric_name": "Accuracy"
        }
    },
    "metric_to_watch": "Accuracy",
    # 其他参数...
}

学习率预热(Warmup)

Super-Gradients 支持学习率预热功能,通过lr_warmup_epochs参数控制:

train_params = {
    "lr_warmup_epochs": 5,  # 前5个epoch进行学习率预热
    # 其他参数...
}

在预热期间,学习率会从0线性增加到设定的初始学习率,有助于训练初期的稳定性。

最佳实践建议

  1. 对于新任务,建议先尝试CosineLRScheduler,它通常能提供不错的基准性能
  2. 当训练过程出现震荡时,可以尝试StepLRScheduler进行更可控的调整
  3. 对于复杂任务,ReduceLROnPlateau可以根据验证指标动态调整学习率
  4. 配合学习率预热使用可以提升训练初期的稳定性
  5. 自定义调度器时,确保充分测试调度逻辑的正确性

通过合理配置学习率调度策略,可以显著提升模型训练效果和收敛速度。Super-Gradients 提供的灵活调度机制,能够满足各种复杂训练场景的需求。

super-gradients Deci-AI/super-gradients: 是一个用于深度学习模型优化的库。适合用于需要训练和优化深度学习模型的研究者和开发者。特点是可以提供高效的优化算法和工具,支持多种深度学习框架。 super-gradients 项目地址: https://gitcode.com/gh_mirrors/su/super-gradients

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘妙霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值