之前我们的优化,主要是聚焦于对梯度下降运动方向的调整,而在参数迭代更新的过程中,除了梯度,还有一个重要的参数是学习率α,对于学习率的调整也是优化的一个重要方面。
 

01
—
学习率衰减
首先我们以一个例子,来说明一下我们为什么需要学习率α衰减(learning rate decay)。如果学习率不衰减的话,如下图蓝线所示,由于噪音影响,代价函数更新路径相对不规则,但总体朝着最低点方向移动,但是移动到最低点附近时,由于学习率较大,每一次会移动相对较远的距离,容易直接跨过最低点,导致代价函数在更新完毕后距离最低点仍然相对较远;当我们随着迭代的次数逐渐降低学习率,那么便如绿线所示,一开始学习率较大,前进速度较快,到达最低点附近后,学习率降低到更小的值,于是最终更新完成后代价函数离最低点更近,也就是模型更加优化,预测值与实际值差距更小。





02
—
学习率衰减的pytorch实现
指数衰减
我们首先需要确定需要针对哪个优化器执行学习率动态调整策略,也就是首先定义一个优化器:optimizer_ExpLR = torch.optim.SGD(net.parameters(), lr=0.1)ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)
固定步长衰减
即离散型衰减,学习率每隔一定步数(或者epoch)就减少为原来的gamma分之一,使用固定步长衰减依旧先定义优化器,再给优化器绑定StepLR对象:optimizer_StepLR = torch.optim.SGD(net.parameters(), lr=0.1)StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)
多步长衰减
有时我们希望不同的区间采用不同的更新频率,或者是有的区间更新学习率,有的区间不更新学习率,这就需要使用MultiStepLR来实现动态区间长度控制:optimizer_MultiStepLR = torch.optim.SGD(net.parameters(), lr=0.1)torch.optim.lr_scheduler.MultiStepLR(optimizer_MultiStepLR,\                milestones=[200, 300, 320, 340, 200], gamma=0.8)
余弦退火衰减
严格的说,余弦退火策略不应该算是学习率衰减策略,因为它使得学习率按照周期变化,其定义方式如下:optimizer_CosineLR = torch.optim.SGD(net.parameters(), lr=0.1)CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)
为网络的不同层设置不同的学习率
定义一个简单的网络结构:class net(nn.Module):    def __init__(self):        super(net, self).__init__()        self.conv1 = nn.Conv2d(3, 64, 1)        self.conv2 = nn.Conv2d(64, 64, 1)        self.conv3 = nn.Conv2d(64, 64, 1)        self.conv4 = nn.Conv2d(64, 64, 1)        self.conv5 = nn.Conv2d(64, 64, 1)    def forward(self, x):        out = conv5(conv4(conv3(conv2(conv1(x)))))        return outnet = net()lr = 0.001conv5_params = list(map(id, net.conv5.parameters())) # 1 base_params = filter(lambda p: id(p) not in conv5_params,                     net.parameters()) # 2,3optimizer = torch.optim.SGD([            {'params': base_params},            {'params': net.conv5.parameters(), 'lr': lr * 100}], lr=lr, momentum=0.9)Reference
深度学习课程 --吴恩达
https://zhuanlan.zhihu.com/p/93624972