还是要看具体任务来用,市面上已有的学习率策略其实很多,但是大部分很难有效….
阶梯式学习率衰减(Step Decay)
通过每隔一定的epoch数降低学习率,常见的做法是每隔几个epoch将学习率减小一个固定的比率
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
指数衰减学习率(Exponential Decay)
通过每个epoch进行指数衰减,学习率按指数下降,适用于模型需要逐渐减缓学习过程的情况
lr_scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)
ReduceLROnPlateau
ReduceLROnPlateau
是一种基于验证集性能的自适应学习率调整策略。当模型的验证集损失在若干个epoch内没有改善时,自动减少学习率
optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=5, factor=0.5)
参数解释:
patience
:如果验证集损失在多少个epoch内没有改善,则减少学习率factor
:每次减少学习率的倍数'min'
:表示当验证集损失下降时进行学习率衰减- 由于过程中用到了Validation集的测试结果,所以在scheduler.step()里面需要传入val_loss
循环学习率(Cyclical Learning Rates)
循环学习率(CLR)是一种动态调整学习率的策略,它通过在一定的范围内循环调整学习率,可以让模型跳出局部最优解,适合防止过拟合
3.1 CyclicLR
通过设定一个学习率范围(最小值到最大值),让学习率在这个范围内不断循环变动,避免了过早学习率过低导致的过拟合
lr_scheduler = optim.lr_scheduler.CyclicLR(optimizer, base_lr=1e-5, max_lr=1e-2, step_size_up=5)