学习率调度策略
大约 3 分钟
余弦衰减(Cosine Decay)
📌 适用于:长时间训练,避免学习率下降过快,提高最终收敛性能。
import paddle
# 初始学习率
initial_lr = 0.1
# 总训练步数
total_steps = 10000
# 余弦衰减
lr_scheduler = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=initial_lr, T_max=total_steps)
# 绑定到优化器
optimizer = paddle.optimizer.Adam(learning_rate=lr_scheduler, parameters=model.parameters())
参数:initial_lr
特点:
- 学习率会按照 余弦曲线 下降,前期下降较快,后期逐渐趋于平缓。
- 适用于 大规模数据集 和 深度网络 训练。
指数衰减(Exponential Decay)
📌 适用于:希望学习率指数级下降,以较快速度降低学习率的情况。
import paddle
# 初始学习率
initial_lr = 0.1
# 衰减率
gamma = 0.99
# 衰减间隔(每隔 step_size 进行一次衰减)
step_size = 1000
# 指数衰减
lr_scheduler = paddle.optimizer.lr.ExponentialDecay(learning_rate=initial_lr, gamma=gamma, verbose=True)
# 绑定到优化器
optimizer = paddle.optimizer.Adam(learning_rate=lr_scheduler, parameters=model.parameters())
特点:
- 每经过一定步数,学习率按照
指数形式
递减。 - gamma 控制衰减速度(通常在 0.9~0.99 之间)。
- 适用于简单任务,或者需要快速调整学习率的情况。
预热 + 余弦衰减(Warmup + Cosine Decay)
📌 适用于:训练初期需要稳定优化,防止初始梯度过大导致不稳定。
import paddle
start_lr = 0.001 # 预热起始学习率
max_lr = 0.1 # 预热结束后的初始学习率
warmup_steps = 1000 # 预热步数
total_steps = 10000 # 训练总步数
eta_min = 1e-6 # 余弦衰减的最小学习率
# 余弦衰减
cosine_decay = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=max_lr, T_max=total_steps - warmup_steps, eta_min=eta_min)
# 预热阶段
warmup = paddle.optimizer.lr.LinearWarmup(learning_rate=cosine_decay, warmup_steps=warmup_steps, start_lr=start_lr, end_lr=max_lr)
# 绑定优化器
optimizer = paddle.optimizer.Adam(learning_rate=warmup, parameters=model.parameters())
特点:
训练初期
先线性增长(Warmup)
,防止初始梯度过大。训练后期
使用余弦衰减
,逐步降低学习率。- 适用于大规模深度学习模型,如 OCR、CV、NLP 任务。
分段衰减(Step Decay)
📌 适用于:按固定周期降低学习率,如 epoch 10/20/30 逐步降低。
import paddle
# 设定不同的学习率阶段
boundaries = [1000, 5000, 8000]
values = [0.1, 0.05, 0.01, 0.001]
lr_scheduler = paddle.optimizer.lr.PiecewiseDecay(boundaries=boundaries, values=values)
# 绑定到优化器
optimizer = paddle.optimizer.SGD(learning_rate=lr_scheduler, parameters=model.parameters())
特点:
- 训练在
某些步数
(如 1000, 5000, 8000)后降低学习率。 - 适用于
逐步调整训练策略
,如预训练 - 迁移学习 - 微调
。
手动动态调整学习率
如果想自定义学习率调整,可以在 每个 epoch 或 step 里手动修改:
for epoch in range(num_epochs):
if epoch % 10 == 0:
new_lr = 0.1 * (0.9 ** (epoch // 10)) # 每 10 个 epoch 下降
optimizer.set_lr(new_lr)
print(f"Epoch {epoch}, Learning Rate: {optimizer.get_lr()}")
适用于:
- 需要
自定义调整策略
的情况,如训练后期 fine-tuning。
总结
调度策略 | 适用场景 | 适用任务 |
---|---|---|
Cosine Decay | 适用于长时间训练,防止学习率下降过快 | 适用于 OCR、CV、NLP |
Exponential Decay | 需要快速衰减学利率 | 适用于小规模或简单任务 |
Warmup + Cosine Decay | 训练初期防止梯度爆炸,后期平稳收敛 | 适用于大型 OCR、CV 任务 |
Step Decay | 逐步降低学习率,如 10/20/30 轮 | 适用于与训练-微调模式 |
手动调整 | 需要自定义策略 | 适用于实验性调优 |