深度学习中学习率调整策略详解
深度学习中学习率调整策略详解
学习率调整是深度学习优化过程中的关键环节,不同的学习率策略能够显著影响模型的收敛速度和效果。本文将详细介绍几种常见的学习率衰减策略,包括阶梯衰减、余弦退火、余弦退火重启、线性衰减和指数衰减,并通过PyTorch代码示例和可视化图表帮助读者更好地理解这些策略的特点和应用场景。
为什么需要学习率衰减?
在训练深度学习模型时,学习率的选择至关重要。通常,我们希望模型能够在训练的早期阶段较快地收敛(即较大的学习率),而在训练的后期阶段逐渐减小学习率,以便模型能够更精细地调整参数,避免错过局部最优点。
阶梯衰减(Step Decay)
这是最简单常用的学习率调整方法,每过step_size
轮,将此前的学习率乘以gamma
。
torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
余弦退火调整学习率(CosineAnnealingLR)
在每个周期内,学习率从初始学习率(lr0
)开始,经过余弦函数的逐渐衰减,最后衰减到最小学习率(eta_min
)。
torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max,
eta_min=0,
last_epoch=-1)
T_max
:指定一个完整的周期(例如,多少个训练步长或 epoch)。在T_max
的周期内,学习率会从初始学习率衰减到eta_min
。eta_min=0
:最终学习率last_epoch=-1
:指定上次训练的最后一个epoch,-1就是从头开始训练
余弦退火重启学习率(CosineAnnealingWarmRestarts)
CosineAnnealingWarmRestarts
通过将学习率沿着一个余弦曲线逐渐衰减到最小值(eta_min
),然后在周期结束时重启并回升到初始学习率(lr0
),这种周期性的重启和余弦退火帮助模型在每个阶段进行不同范围的探索,避免陷入局部最优。
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
optimizer,
T_0,
T_mult=1,
eta_min=0,
last_epoch=- 1,
verbose=False)
T_0
:第一个周期的长度,后续的长度基于T_0
和T_mult
调整T_mult
:控制后续周期的长度,例如设置为2,那则第二个周期长度会是第一个周期的2倍,第三个周期的长度会是第二个周期的2倍,设置为1则每个周期一样长。eta_min
:这是学习率的最小值。在每个周期中,学习率会从eta_max
(初始学习率)衰减到eta_min
,然后在每个周期结束时重新回升到初始学习率。verbose
:如果设置为True
,则每次学习率重启时,调度器会输出日志信息,显示学习率调整的情况。例如,输出每次重启时的学习率和当前的训练状态。
线性衰减(Linear Decay)
在线性衰减中,学习率随着训练的进展而线性地减小。学习率的减少是均匀的,每个时间步减少固定的量,直到达到预定的最小值
torch.optim.lr_scheduler.LinearLR(
optimizer,
start_factor=1,
end_factor=0.1,
total_iters=80)
LinearLR
是线性学习率,给定起始factor和最终的factor,LinearLR
会在中间阶段做线性插值,比如学习率为0.1,起始factor为1,最终的factor为0.1,那么第0次迭代,学习率将为0.1,最终轮学习率为0.01。下面设置的总轮数total_iters
为80,所以超过80时,学习率恒为0.01。
指数衰减(Exponential Decay)
学习率初期迅速下降,适合早期跳出局部最优,但可能导致后期过早收敛,适合大规模训练任务或对收敛速度有要求的情况。
torch.optim.lr_scheduler.ExponentialLR(
optimizer,
gamma=0.9)
ExponentialLR
是指数型下降的学习率调节器,每一轮会将学习率乘以gamma
,所以这里千万注意gamma
不要设置的太小,不然几轮之后学习率就会降到0。