学习率对整个函数模型的优化起着至关重要的作用。
如下图所示
上图的第一个图表明,若设置的learning rate较小,可能需要大量的计算时间才能将函数优化好。第二个图表明若设置的learning rate刚刚好,则比第一个图需要较少的时间就可完成优化。第三个图表明若设置的learning rate过大,则有可能造成整个函数loss忽大忽小,一直无法完成整个的优化。
由此看出选择合适的learning rate是很讲究技巧和偶然性的。但如果如下图所示,设置一个可以自动衰减的learning rate可能会在一定程度上加快优化。
学习率衰减(learning rate decay)对于函数的优化是十分有效的,如下图所示
loss的巨幅降低就是learning rate突然降低所造成的。
在进行深度学习时,若发现loss出现上图中情况时,一直不发生变化,不妨就设置一下学习率衰减(learning rate decay)。
具体到代码中
代码语言:javascript复制class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10,
verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-8)
# patience=10代表的是耐心值为10,
# 当loss出现10次不变化时,即开始调用learning rate decat功能
optimizer = torch.optim.SGD(model.parameters(),
args.lr,
momentum=args.momentum,
weight_decay=args.weight_decay)
scheduler = ReduceLROnPlateau(optimizer, 'min')
# min代表希望的目标减少的loss
scheduler.step(loss_val)
# 设置监听的是loss
另外也可以根据进行的epoch来设置learning rate decay
假设想
epoch进行小于20次时,learning rate 为0.05。
epoch进行到20次至40次时,learning rate 为0.005。
epoch进行到40次至60次时,learning rate 为0.0005。
...
则代码为
代码语言:javascript复制scheduler = StepLR(optimizer, step_size=20, gama=0.1)
# StepLR为步进,step_size=20表示没20个epoch,步进为原来的gama=0.1
for epoch in range(100):
scheduler.step()