MMAction2 优化器与学习率调度器定制指南
前言
在视频理解任务中,优化策略的选择和配置对模型性能有着至关重要的影响。本文将深入讲解如何在 MMAction2 框架中定制优化器和学习率调度器,帮助开发者根据具体任务需求灵活调整训练策略。
优化器配置基础
MMAction2 通过 optim_wrapper
字段统一管理优化策略,包括优化器选择、参数级配置、梯度裁剪和累积等。一个基础配置示例如下:
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(type='SGD', lr=0.0003, weight_decay=0.0001)
)
支持 PyTorch 原生优化器
MMAction2 支持所有 PyTorch 原生优化器,如 Adam、RMSprop 等。切换优化器只需修改配置文件:
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(
type='Adam',
lr=0.001,
betas=(0.9, 0.999),
weight_decay=0.01)
)
高级优化策略
参数级精细配置
对于复杂模型,不同层可能需要不同的优化策略。MMAction2 提供了 paramwise_cfg
参数实现精细控制:
- 按参数类型配置
optim_wrapper = dict(
optimizer=dict(type='SGD', lr=0.8, weight_decay=1e-4),
paramwise_cfg=dict(
norm_decay_mult=0., # 归一化层权重衰减设为0
bias_lr_mult=2.0) # 偏置项学习率加倍
)
- 自定义参数组配置
optim_wrapper = dict(
optimizer=dict(type='SGD', lr=0.01, weight_decay=0.0001),
paramwise_cfg=dict(
custom_keys={
'backbone.layer0': dict(lr_mult=0, decay_mult=0), # 冻结第一层
'head': dict(lr_mult=0.1) # 头部学习率降低
}))
梯度管理技术
- 梯度裁剪:防止梯度爆炸
optim_wrapper = dict(
optimizer=dict(type='SGD', lr=0.01),
clip_grad=dict(max_norm=35, norm_type=2)
)
- 梯度累积:模拟大批量训练
optim_wrapper = dict(
optimizer=dict(type='SGD', lr=0.01),
accumulative_counts=4 # 每4次迭代更新一次参数
)
学习率调度策略
MMAction2 提供了比 PyTorch 更灵活的学习率调度机制。
基础调度器
param_scheduler = dict(
type='MultiStepLR',
by_epoch=True,
milestones=[100, 150],
gamma=0.1)
组合调度策略
- 线性预热+多步衰减
param_scheduler = [
dict(type='LinearLR', start_factor=0.001, end=50, by_epoch=False),
dict(type='MultiStepLR', by_epoch=True, milestones=[8, 11], gamma=0.1)
]
- 余弦退火调度
param_scheduler = dict(
type='CosineAnnealingLR',
by_epoch=True,
T_max=num_epochs)
动量调度
param_scheduler = [
dict(type='LinearLR', ...),
dict(type='LinearMomentum',
start_factor=0.001,
by_epoch=False,
begin=0,
end=1000)
]
扩展优化器(高级)
对于研究需求,可以添加自定义优化器:
- 实现优化器类
@OPTIMIZERS.register_module()
class MyOptimizer(Optimizer):
def __init__(self, a, b, c):
...
- 注册到系统
# 在mmaction/engine/optimizers/__init__.py中添加
from .my_optimizer import MyOptimizer
__all__ = [..., 'MyOptimizer']
- 配置文件使用
optim_wrapper = dict(
optimizer=dict(type='MyOptimizer', a=1, b=2, c=3))
最佳实践建议
- 对于视频分类任务,推荐初始学习率设为 0.01-0.1
- 使用线性预热可提高训练稳定性
- 3D CNN 模型建议使用较小的初始学习率
- 长视频处理时可适当增加梯度累积次数
通过灵活组合这些优化策略,开发者可以在 MMAction2 框架中实现各种复杂的训练方案,满足不同视频理解任务的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考