在进行深度学习时,学习率的调整策略是我们躲不开的问题,那么咋样才能设计才能找到比较适合的学习率呢????一般我们会采用三种方法来设计学习率:
1,直接使用固定的学习率,但是存在当模型初始化时,如果我们选择较大的学习率可能会带来模型的不稳定(振荡)。下面是最简单的学习率设置方法。
model.compile(loss=MyLoss(), optimizer=optim.Adam(model.parameters(), lr=2e-5))
2,学习率预热(warmup)
什么是warmup?
warmup是针对学习率learning rate优化的一种策略,主要过程是在预热期间,学习率从0线性(也可非线性)增加到优化器中的初始预设lr,之后使其学习率从优化器中的初始lr线性降低到0。如下图所示:(图是网上找的,如有侵权请联系删除)
warmup的作用
由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能会造成模型的不确定性,选择Warmup预热学习率的方式,可以使得开始训练的几个epoch或者一些step内学习率较小,在预热阶段的小学习率下,模型在训练的过程中慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。下面是学习率预热的代码实现,为部分代码。
optimizer = optim.Adam(params, lr=learning_rate, weight_decay=weight_decay)
updates_total = (len(train_dataloader) if steps_per_epoch is None else steps_per_epoch) * epochs
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=warm_factor * updates_total,
num_training_steps=updates_total)
model.compile(loss=Loss(), optimizer=optimizer, scheduler=scheduler, clip_grad_norm=5.0)
3,学习率衰减
什么是学习率衰减?
一般来说,我们在进行模型训练的时候参数的更新一般使用的梯度下降法来更新模型的参数,梯度下降法一般会选取一个学习率来控制步幅下降到快慢,如下图:当我们的学习率过大时,他会导致来回摆动,当过小时,下降的又慢,我么希望在开始时使用大的学习率,在梯度快接近0时使用较小的学习率,如下图那样。
学习率衰减的策略,如StepLR (Step Learning Rate),MultiStepLR等库来快速的实现。使用SteoLR实现的代码:还有其他的参数大家可以自行探索。
torch.optim.lr_scheduler.StepLR(self.optimizer, step_size=8, gamma=0.9)
#optimizer: 神经网络训练中使用的优化器,
#step_size(int): 学习率下降间隔数,单位是epoch,而不是iteration.
#gamma(float):学习率调整倍数,默认为0.1