网上对优化器的描述是动态调节学习率,根据我调试代码的经验:
优化器是优化不同参数导数的大小,在计算的时候会赋值调整导数值,对其学习率并不会改变。
查看学习率的代码:
optimizer.param_groups[0]['lr']
简略介绍一下三种优化器
动量法(momentum)
假设中心是loss函数的最低点,横轴为w,纵轴为b
dw明显小于db(相同距离下,b值变化更大)
正常情况下:行进路线
加入动量法(公式如下):db较大,且有正有负,故dB会变小;dw虽小,但方向一直为正,故累积后会变大。
经过动量法的变化(红线):
RMSprop算法
拿上面的图用,因为两种算法目的相同,更快收敛,朝最优点以最快的速度行进。
公式如下
是防止除数为零,dw2是dw的平方,实际的dW和dB和上面方法效果差不多。
实际类似一个缩放的过程(normalization?),将一个椭圆变成了圆。
adam算法
上面两种方法的结合
从最后一行的公式,可以看到V来自动量法,分母来自RMSprop算法。
最后还是提示一下,优化器并不能改变学习率,优化器是针对每一个参数进行的优化,最后改变的只是导数的大小,当然还是应用的梯度下降的方法。至少当你去pytorch检查学习率时,发现它是没有变化的。
详细内容可参考:
【[双语字幕]吴恩达深度学习deeplearning.ai】 中关于优化器的章节
pytorch调整学习率
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.9)
#可以根据epoch,或者batch数选择步长,放在相应的代码位置
for epoch in range(num_epochs):
for data in dataloader:
#训练代码
optimizer.step()
scheduler.step()#将step放在opimezer之后,这个位置是每两个batch更新一次学习率
可参考官网进行学习(有不同的学习率调节器)