学习率决定了每步权重更新对当前权重的改变程度:

                                                                          ,

其中E(w)为我们优化的损失函数,是学习率。


学习率太小,更新速度慢;学习率过大,可能跨过最优解。因此,在刚开始训练,距离最优解较远时可以采用稍大的学习率,随着迭代次数增加,在逼近最优解的过程中,逐渐减小学习率。

在caffe的solver文件中,lr_policy不推荐fixed (保持base_lr不变),可以选择如下方案:

1、阶跃式的:

* multistep: 根据后面设定的stepvalue,每次达到stepvalue,新的学习率变为之前的学习率*gamma,如
base_lr: 0.005
lr_policy: "multistep"
gamma: 0.1
stepvalue: 18750
stepvalue: 37500
stepvalue: 56250

则[0,18750)步迭代的学习率为base_lr:0,005;

 [18751,37500)的学习率为0.005*gamma=5e-4;

[37500,56250)的学习率为5e-4*gamma=5e-5;

56250步之后学习率为5e-5*gamma=5e-6。

multistep的好处是可以当loss不再降低时,手动设定stepvalue,降低学习率,继续训练,以便利用更精细的迭代继续降低loss.


经验:base_lr不宜过小,可以试着从0.0001~0.01之间选取值开始;充分迭代,等到loss不再下降(或者accuracy不再上升)时再将学习率降低一个量级。如此反复,直到学习率降到~1e-6,再迭代很难有明显的loss下降或accuracy提升了,完成训练。

提示:需要检测loss或accuracy,
因为过早地将学习率降低1个量级会使收敛太慢(10步相当于原来的1步)。如果batchsize不大,train过程的loss(或accuracy)波动剧烈,由于读取图片不同导致随机性较强,监测train过程的loss(或accuracy)意义不大;可设定test_interval为1个或多个epoch,并设定test_iter遍历整个validation数据集,看对整个validation数据集的loss是否在降低(或accuracy是否在升高);如果loss在降低,保持学习率继续迭代,如果已经保持不变,将学习率降低一个数量级再继续迭代。

* step:   每次达到固定迭代步长stepsize后降低学习率: base_lr * gamma ^ (floor(iter /
stepsize)),其中iter表示当前的迭代次数

2、连续式的。除了上述两种阶跃的衰减策略,连续衰减的策略看起来更加合理,但是很难调整到loss的降低速度与lr的衰减完美匹配,下面几种连续的衰减策略可供调试选择: 

* poly:   lr=base_lr (1 - iter/max_iter) ^ (power),
学习率与最大迭代步数max_iter关联,lr从最初的base_lr,连续衰减到max_iter时的0. (衰减先慢后快,)
* exp:     lr=base_lr * gamma ^ iter (衰减先快后慢);
* inv:   lr=base_lr * (1 + gamma * iter) ^ (- power)
(衰减先快后慢,但增加了power参数控制学习率的衰减);
* sigmoid: lr=base_lr ( 1/(1 + exp(-gamma * (iter - stepsize)))) 
(开始和结束衰减慢,中间衰减快)
这几种曲线的衰减形状可以自己画一下,以便获得直观认知,或者参见 langb2014的博客:Caffe傻瓜系列(11):caffe中的lr_policy选择
<https://blog.csdn.net/langb2014/article/details/51274376>
 (注意,那篇博文中sigmoid的形状画反了)。