4. 学习率调优策略:固定学习率、Step Decay、Cosine Annealing、Warmup

学习率,说白了就是模型每次更新参数时迈的步子大小。步子太大,容易在最优解附近震荡;步子太小,训练慢得让人抓狂。在去噪任务里,这个平衡尤其微妙——噪声的分布往往很复杂,学习率调不好,模型要么学不到细节,要么直接发散。

我个人习惯把学习率策略分成两类:固定策略和动态策略。固定策略简单粗暴,动态策略则更灵活。下面我结合去噪任务,聊聊几种常见策略的实战表现。

核心观点:没有万能的学习率策略。去噪任务中,我建议优先尝试 Cosine Annealing + Warmup,它在大多数场景下表现最稳定。

4.1 固定学习率:最朴素,也最考验耐心

固定学习率就是整个训练过程用一个恒定的值。比如 lr = 0.001,从头到尾不变。这种做法在简单任务上还行,但去噪任务往往需要精细调整。

我曾经在一个图像去噪项目里试过固定学习率。刚开始 loss 降得挺快,但到了后期,loss 曲线就像心电图一样上下抖动,始终无法收敛到理想值。后来我意识到,固定学习率在接近最优解时缺乏自适应能力,容易在局部最优附近来回震荡。

小技巧:如果非要用固定学习率,建议先用一个很小的值(如 1e-4)跑几个 epoch,观察 loss 下降趋势。如果下降太慢,再逐步调大。

固定学习率的优缺点很明显:

  • 优点:实现简单,不需要额外调参;适合小规模数据或快速验证。
  • 缺点:难以兼顾训练初期和后期;在去噪任务中容易陷入局部最优。

4.2 Step Decay:分段下降,稳扎稳打

Step Decay 的思路是每隔一定步数,把学习率乘以一个衰减因子。比如每 30 个 epoch,学习率乘以 0.1。这种做法比固定学习率灵活,但需要手动设定衰减点和衰减率。

我记得有一次做语音去噪,用了 Step Decay,每 20 个 epoch 衰减 0.5。效果比固定学习率好不少,但问题在于:衰减点设得太早,模型还没学到足够特征;设得太晚,又浪费了训练时间。说白了,Step Decay 对超参数比较敏感。

# Step Decay 示例
def step_decay(epoch, lr=0.01, drop=0.5, epochs_drop=10):
    return lr * (drop ** (epoch // epochs_drop))

注意:Step Decay 的衰减因子不宜太小。我见过有人设 0.1,结果学习率骤降,模型直接“冻住”了。建议从 0.5 或 0.8 开始试。

4.3 Cosine Annealing:余弦退火,平滑过渡

Cosine Annealing 是我个人比较喜欢的一种策略。它让学习率按照余弦函数周期性地变化,从高到低平滑下降,然后重置。这种策略的好处是:训练初期学习率大,快速探索;后期学习率小,精细收敛。

在去噪任务中,Cosine Annealing 的表现通常优于 Step Decay。为什么呢?因为去噪模型需要同时学习噪声分布和信号特征,余弦退火的平滑下降能更好地平衡这两者。我曾经在图像去噪对比实验中,用 Cosine Annealing 比 Step Decay 的 PSNR 高了 0.3 dB 左右。

# Cosine Annealing 示例(PyTorch)
import torch.optim.lr_scheduler as scheduler
scheduler = scheduler.CosineAnnealingLR(optimizer, T_max=50, eta_min=1e-6)

关键参数:T_max 是周期长度,eta_min 是最小学习率。我建议 eta_min 设为初始学习率的 1/100 到 1/1000。

4.4 Warmup:预热起步,避免震荡

Warmup 的思路是训练初期用很小的学习率“预热”,然后逐渐增加到目标值。这种做法在 Transformer 类模型中很常见,但在去噪任务中同样有效。

为什么需要 Warmup?你想想看,模型刚开始训练时,参数是随机初始化的,梯度方向可能很不稳定。如果一上来就用大学习率,很容易导致 loss 爆炸。Warmup 相当于给模型一个“热身”阶段,让参数先稳定下来。

我曾经在训练一个深度去噪网络时,没用 Warmup,结果前 10 个 epoch loss 直接飞到 NaN。后来加了 5 个 epoch 的线性 Warmup,问题就解决了。

# Warmup 示例(线性预热)
def warmup_lr(epoch, warmup_epochs=5, base_lr=0.001):
    if epoch < warmup_epochs:
        return base_lr * (epoch + 1) / warmup_epochs
    else:
        return base_lr

建议:Warmup 的 epoch 数一般设为总 epoch 的 5%-10%。比如训练 100 个 epoch,Warmup 用 5-10 个 epoch 就够了。

4.5 四种策略在去噪任务中的对比

下面这张表是我在图像去噪任务中做的对比实验。数据集是 BSD68,模型是 DnCNN,训练 100 个 epoch。

策略 最终 PSNR (dB) 收敛速度 稳定性 调参难度
固定学习率 (0.001) 29.12 慢 低 低
Step Decay (每30 epoch ×0.5) 29.85 中 中 中
Cosine Annealing (T_max=50) 30.21 快 高 低
Warmup (5 epoch) + Cosine Annealing 30.35 快 高 中

从表中可以看出,Warmup + Cosine Annealing 的组合在去噪任务中表现最好。PSNR 比固定学习率高了 1.23 dB,而且训练过程更稳定。

实战建议:如果你刚开始调参,我建议直接上 Cosine Annealing + Warmup。如果训练不稳定,可以适当增加 Warmup 的 epoch 数或降低初始学习率。

4.6 知识体系图:学习率调优策略总览

下面这张图总结了四种策略的核心逻辑和适用场景。你可以把它当作调参时的参考地图。

学习率调优策略总览 学习率策略 固定学习率 Step Decay Cosine Annealing Warmup 简单但易震荡 适合快速验证 分段下降 需手动调衰减点 平滑下降 去噪任务首选 预热起步 防止梯度爆炸 推荐组合:Warmup + Cosine Annealing

嗯,到这里你应该对学习率调优有了比较清晰的认识。记住,没有银弹,但 Warmup + Cosine Annealing 是一个很好的起点。下次训练去噪模型时,不妨试试这个组合,说不定会有惊喜。