目录

1. 学习率:模型训练的"油门控制器"

2. 学习率调整策略

2.1 基础调整策略

2.2 动态调整策略

3. 学习率与其他超参数的协同

4. 学习率范围测试与实践建议

5. 不同策略效果对比

6. 完整训练示例

总结


1. 学习率:模型训练的"油门控制器"

学习率(Learning Rate)是深度学习优化算法中的核心超参数,它控制着模型参数每次更新的步长大小。如同下山时的步幅选择:步幅太大会越过最低点甚至失控;步幅太小则下山速度缓慢,甚至被困在半山腰。

梯度下降的参数更新公式清晰地展示了学习率的作用:

θ = θ - η * ∇J(θ)

其中θ是模型参数,η是学习率,∇J(θ)是损失函数关于参数的梯度。

学习率大小

对训练过程的影响

损失曲线特征

解决方案

过大

参数更新步伐太大,可能越过最优点

剧烈震荡、锯齿状波动

减小学习率10倍

过小

参数更新缓慢,收敛速度慢

平滑但下降极慢的曲线

增大学习率2-5倍

合适

稳定收敛至最优解

平滑的指数下降曲线

保持并监控

2. 学习率调整策略

2.1 基础调整策略

固定学习率是最简单的策略,但难以适应训练不同阶段的需求。

学习率预热(Warmup)​​ 在训练初期逐步增加学习率,帮助模型"平稳起步":

# PyTorch中的线性预热实现
def warmup_lr_scheduler(epoch, initial_lr=0.01, warmup_epochs=5):
    if epoch < warmup_epochs:
        return (epoch + 1) / warmup_epochs  # 线性增长
    else:
        return 1.0  # 预热结束后保持初始学习率

scheduler = torch.optim.lr_scheduler.LambdaLR(
    optimizer, lr_lambda=warmup_lr_scheduler
)

2.2 动态调整策略

阶梯式衰减(Step Decay)​​ 按照预设的"里程碑"降低学习率:

# PyTorch实现
scheduler = torch.optim.lr_scheduler.StepLR(
    optimizer, step_size=10, gamma=0.1
)
# 每10轮训练后,学习率降至原来的0.1倍

余弦退火(Cosine Annealing)​​ 模拟余弦函数周期性调整学习率:

# PyTorch实现
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
    optimizer, T_max=50, eta_min=0
)
# T_max: 周期长度, eta_min: 最小学习率

自适应调整(ReduceLROnPlateau)​​ 根据模型表现动态调整:

# PyTorch实现
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
    optimizer, 
    mode='max',        # 监控指标最大化(如准确率)
    factor=0.1,        # 衰减因子:新学习率 = 原学习率 × 0.1
    patience=10,       # 容忍10轮无改善后调整
    verbose=True,      # 打印调整日志
    min_lr=0           # 最小学习率不低于0
)

3. 学习率与其他超参数的协同

学习率与批量大小(Batch Size)​​ 需要协同调整。一般经验是:当批量大小增加N倍时,学习率也相应增加N倍或√N倍,以保持学习稳定性。

不同优化算法对学习率的敏感度也不同:

优化器

推荐初始学习率

适用场景

SGD

0.01-0.1

基础模型训练

Adam

0.001

默认首选,适应大多数场景

RMSprop

0.01

RNN/LSTM训练

Adagrad

0.01

稀疏数据表现好

4. 学习率范围测试与实践建议

学习率范围测试帮助确定合适的学习率范围:

# 使用torch_lr_finder进行学习率范围测试
from torch_lr_finder import LRFinder

optimizer = torch.optim.Adam(model.parameters(), lr=1e-7)
lr_finder = LRFinder(model, optimizer, criterion)
lr_finder.range_test(train_loader, end_lr=1, num_iter=100)
lr_finder.plot()  # 找到损失下降最快区间

实践建议​:

  1. 初始学习率选择​:从常用值开始(SGD:0.01,Adam:0.001)

  2. 结合Warmup​:前5-10个epoch逐步增加学习率

  3. 监控损失曲线​:震荡→降低学习率,停滞→增加学习率

  4. 进阶策略​:余弦退火+Warmup组合效果通常较好

5. 不同策略效果对比

实验比较(食品分类任务,50轮训练):

策略

最终验证准确率

收敛轮次(达到80%准确率)

训练稳定性

固定学习率(0.01)

43%

35轮

高(损失震荡)

StepLR(step=10, γ=0.1)

51%

28轮

ReduceLROnPlateau

58%

22轮

低(平滑下降)

余弦退火(T_max=50)

62%

18轮

极低

余弦退火+Warmup

65%​

15轮

极低(无震荡)​

6. 完整训练示例

以下是一个结合了Warmup和余弦退火的完整训练示例:

import torch
import torch.nn as nn
import torch.optim as optim
import math

# 定义模型、损失函数和优化器
model = MyModel()  # 你的模型
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 定义组合学习率调度器(Warmup + 余弦退火)
def warmup_cosine_lr(epoch, warmup_epochs=10, max_epochs=100, base_lr=0.001):
    if epoch < warmup_epochs:
        return (epoch + 1) / warmup_epochs  # 线性预热
    else:
        # 余弦退火
        return 0.5 * (1 + math.cos(math.pi * 
                (epoch - warmup_epochs) / (max_epochs - warmup_epochs)))

scheduler = torch.optim.lr_scheduler.LambdaLR(
    optimizer, lr_lambda=warmup_cosine_lr
)

# 训练循环
for epoch in range(num_epochs):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
    
    # 更新学习率
    scheduler.step()
    
    # 打印当前学习率
    current_lr = optimizer.param_groups[0]['lr']
    print(f'Epoch {epoch+1}, Learning Rate: {current_lr:.6f}')

总结

学习率优化是深度学习训练中的关键环节。合适的学习率策略可以显著提高模型性能并加速收敛。建议从自适应策略(如ReduceLROnPlateau)开始,逐步尝试更先进的组合策略(如余弦退火+Warmup)。记住,没有"一刀切"的最佳学习率,需要根据具体任务和数据进行实验和调整。

参考资源:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐