Super-Gradients 项目中的学习率调度技术详解
学习率调度概述
在深度神经网络训练过程中,随着训练的进行动态调整学习率是一种常见且有效的优化策略。Super-Gradients 提供了多种学习率调度方式,帮助开发者更高效地训练模型。
内置学习率调度器
Super-Gradients 提供了四种主要的学习率调度策略:
-
StepLRScheduler(步进式调度)
- 在指定epoch进行学习率衰减
- 每次衰减比例为
lr_decay_factor
- 适用于需要明确控制学习率变化点的场景
-
PolyLRScheduler(多项式调度)
- 采用多项式衰减公式:
lr = initial_lr * (1 - current_iter/max_iter)^0.9
- 提供平滑的学习率下降曲线
- 采用多项式衰减公式:
-
CosineLRScheduler(余弦退火调度)
- 基于余弦函数调整学习率
- 通过
cosine_final_lr_ratio
控制最终学习率比例 - 适合需要周期性调整学习率的场景
-
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
自定义学习率调度器
当内置调度器不能满足需求时,可以创建自定义调度器:
-
继承LRCallbackBase基类
- 必须实现
perform_scheduling
和is_lr_scheduling_enabled
方法 perform_scheduling
负责计算新的学习率is_lr_scheduling_enabled
控制何时启用调度
- 必须实现
-
示例:自定义步进式调度器
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
- 使用自定义调度器
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的原生调度器:
- 基本配置格式
lr_mode = {
"调度器类名": {
"调度器参数": 值,
"phase": Phase.阶段,
"metric_name": "监控指标名" # 仅ReduceLROnPlateau需要
}
}
- StepLR示例
train_params = {
"lr_mode": {
"StepLR": {
"gamma": 0.1,
"step_size": 1,
"phase": Phase.TRAIN_EPOCH_END
}
},
# 其他参数...
}
- 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线性增加到设定的初始学习率,有助于训练初期的稳定性。
最佳实践建议
- 对于新任务,建议先尝试CosineLRScheduler,它通常能提供不错的基准性能
- 当训练过程出现震荡时,可以尝试StepLRScheduler进行更可控的调整
- 对于复杂任务,ReduceLROnPlateau可以根据验证指标动态调整学习率
- 配合学习率预热使用可以提升训练初期的稳定性
- 自定义调度器时,确保充分测试调度逻辑的正确性
通过合理配置学习率调度策略,可以显著提升模型训练效果和收敛速度。Super-Gradients 提供的灵活调度机制,能够满足各种复杂训练场景的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考