本文主要参考:
https://www.cnblogs.com/denny402/p/5074049.html 以及caffe官方文档
Solver的流程:
- 设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。(通过调用另外一个网络配置文件prototxt来进行)
- 通过forward和backward迭代的进行优化来跟新参数。
- 定期的评价测试网络。(可设定多少次训练后,进行一次测试)
- 在优化过程中显示模型和solver的状态
在每一次的迭代过程中,solver做了这几步工作:
- 调用forward算法来计算最终的输出值,以及对应的loss
- 调用backward算法来计算每层的梯度
- 根据选用的slover方法,利用梯度进行参数更新
- 记录并保存每次迭代的学习率、快照,以及对应的状态。
下面通过从上到下的分类说明来看看使用各中优化算法以及学习率计算方法的solver.prototxt配置方法:
1. 设置深度网络模型
- 训练网络和测试网络是一个网络:
1 | net: "examples/mnist/lenet_train_test.prototxt" |
- 训练和测试的网络不同,或者只需要训练的网络也可以只写train_net:
1 | train_net: "examples/mnist/lenet_train.prototxt" |
2. 设置测试网络的测试间隔(只在需要测试的时候需要)
- 设置测试完一次所有样本的迭代轮数test_iter:
$$test_iter = \frac{测试样本数量}{测试层batch_size大小}$$以及设置测试间隔test_interval(每训练多少次进行一次测试)1
2test_iter: 100
test_interval: 500
3. 设置学习率计算策略
对于所有的学习率计算策略都需要设置基础学习率以及最大迭代次数:1
2base_lr: 1e-2
max_iter: 20000
fixed 学习率计算策略
该学习率计算策略保持base_lr不变,所以不需要其他参数:1
lr_policy: "fixed"
step 学习率计算策略
该学习率下更新base_lr的公式为:
$$当前学习率 = base_lr * gamma^{floor(\frac{iter}{stepsize})}$$其中iter为当前迭代次数,gamma, stepsize为需要设置的超参数
1 | lr_policy: "step" |
multistep 学习率计算策略
step是均匀等间隔变化,而multistep则是根据stepvalue值变化,当迭代次数到了其中一个stepvalue,那么就根据下面的公式进行计算,在到达下一个stepvalue之前,其学习率维持不变
$$当前学习率 = base_lr * gamma^{floor(\frac{iter}{stepvalue})}$$1
2
3
4
5
6
7lr_policy: "multistep"
gamma: 0.9
stepvalue: 5000
stepvalue: 7000
stepvalue: 8000
stepvalue: 9000
stepvalue: 9500poly 学习率计算策略
该学习率计算策略是进行多项式误差,更新公式为:
$$当前学习率 = base_lr *(1 - {(\frac{iter}{max_iter})}^{power})$$
1 | lr_policy: "poly" |
4.设置优化算法类型
caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择,各种优化算法之间的关系可以参考下面的图片
SGD
caffe中默认的SGD优化算法是SGDM即SGD with momentum,所以配置方法为,此时 type: “SGD” 可以省略:1
2momentum: 0.9
type: "SGD"Nesterov
Nesterov优化算法是在SGDM的基础上结合未来的梯度信息来进行更新,没有引入新的超参数
1 | momentum: 0.9 |
- AdaGrad
AdaGrad优化算法在SGD的基础上,根据自变量在每个维度上梯度值大小来调整各个维度上的学习率,只在二阶动量上进行累加,没有使用一阶动量,所以不需要超参数
1 | type: "AdaGrad" |
- RMSProp
RMSProp优化方法在二阶动量上使用了EMA,caffe使用rms_decay来作为其超参数,而将momentum设为0.0
1 | momentum: 0.0 |
- AdaDelta
AdaDelta是针对AdaGrad后期学习率过小找不到最优解的问题,与RMSProp一样在二阶动量中引入EMA,但同时引入一个状态变量Δx来代替基础学习率,所以其可以不需要设置base_lr,但caffe中通常可以将其设置为1.0
1 | base_lr: 1.0 |
- Adam
Adam优化方法在一阶动量以及二阶动量上均进行了EMA以及偏差修正,所以需要两个动量超参数值,并且由于Adam优化算法会自动调整学习率,所以我们设置基础学习率的调整策略为fixed:
1 | # 下面是Adam作者建议的两个动量超参数取值 |
5. 设置权重衰减值以及正则化类型
1 | weight_decay: 0.0005 |
6. 其他常用参数
1 | # 每间隔多少轮迭代在终端打印loss结果 |
7.其他不常用参数
1 | # 下面这种写法表示在不同的网络上进行测试 |
1 | # test时是否计算loss,默认为false |