整理自:《Caffe学习系列(7):solver及其配置》
同时参考《Caffe中的优化方法》、《Caffe中learning rate 和 weight decay 的理解》 和 《深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)》
alexnet 默认 solver 参数
net: "models/bvlc_alexnet/train_val.prototxt"
test_iter: 1000
test_interval: 1000
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "models/bvlc_alexnet/caffe_alexnet_train"
solver_mode: GPU
net
训练-测试网络的位置,也可以分别设定:
train_net: "xxx_train.prototxt"
test_net: "xxx_test.prototxt"
test_iter 和 test_interval
test_iter 需要与 test layer 里的 batch_size 结合
假设 test 总样本数为 10000,取 batch_size=200,那么总共需要 test_iter=50 次才能测试完全
test_interval=1000 表示每 1000次训练才测试一次
base_lr、lr_polocy、gamma、stepsize、momentum 和 weight_decay
caffe 实现了6种优化算法,在 solver 中可以通过 type: 来选择。默认为 “SGD”
- Stochastic Gradient Descent(type:”SGD”)
- AdaDelta(type:”AdaDelta”)
- Adaptive Gradient(type:”AdaGrad”)
- Adam(type:”Adam”)
- Nesterov’s Accelerated Gradient(type:”Nesterov”)
- RMSprop(type:”RMSProp”)
以SGD为例(后面有几种优化算法的分析)
base_lr:基础学习率,上式中的 α
momentum:动量,上式中的 μ ,保留上一次修正的量,一般设为0.9
lr_policy: lr 更新的策略,有以下几种
- “fixed”:保持 base_lr不变
- “step”:还需要设置一个 stepsize,返回 base_lr∗gammaiterstepsize
- “exp”:返回 base_lr∗gammaiter
- “inv”:还需要设置一个 power,返回 base_lr∗(1+gamma∗iter)−power
- “multistep”:还需要设置一个 stepvalue,与“step”类似,取代 stepsize
lr_policy: "multistep"
gamma: 0.9
stepvalue: 5000
stepvalue: 7000
stepvalue: 8000
stepvalue: 9000
stepvalue: 9500
- “poly”:lr 进行多项式误差,返回 base_lr∗(1−itermax_iter)power
- “sigmoid”:lr 进行 sigmod 衰减,返回 base_lr∗(1(1+e−gamma∗(iter−stepsize)))
weight_decay:权重衰减项,为了防止发生过拟合
几种优化方法的比较
摘自《深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)》
SGD
一般都是指的 mini-batch gradient descent,每一次迭代计算 mini-batch 的梯度,然后对参数进行更新(式1),是最常见的优化方法
缺点:
- 选择合适的 lr 比较困难。因为往往对于不同的特征,选择不同的 lr 会更合理(常出现的特征更新速度慢,不常出现的特征更新速度快)
- 容易收敛到局部最优。不过在合适的初始化和 stepsize 下,鞍点影响并不是很大
Nesterov
在梯度更新时做一个校正,避免前进太快,同时提高灵敏度
Adagrad
自适应学习率,对 lr 进行了一个约束
优点:
- 前期 gt 较小的时候,梯度被放大
- 后期 gt 较大的时候,梯度被约束
- 适合处理稀疏梯度
缺点:
- 仍然需要人工设置一个全局学习率
- 学习率 α 过大会使梯度调节的响应过于敏感
- 学习率 α 过小会使后期梯度接近0,训练提前结束
Adadelta
Adadelta 是 Adagrad 的扩展,思路依然是对学习率进行自适应约束,但是进行了计算上的简化
其中 E() 是求期望
特点:
- 不再需要人工给出全局学习率
- 训练初中期加速效果不错
- 训练后期,反复在局部最小值附近抖动
RMSprop
可以算 Adadelta 的一个特例:取
ρ=0.5
,这样
E|g2|t+1−−−−−−−√
就变成RMS(均方根)
特点:
- RMSprop 依然需要人工设置全局学习率
- 是 Adagrad 的一种改进,效果趋于其和 Adadelta 之间
- 适合处理非平稳目标,对 RNN 效果很好
Adam
本质上是带有动量项的 RMSprop,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率
其中
mt+1
和
nt+1
分别是对梯度的一阶矩估计和二阶矩估计;
m′t+1
和
n′t+1
是对
mt+1
和
nt+1
的校正
特点:
- 结合了 Adagrad 善于处理稀疏梯度和 RMSprop 善于处理非平稳目标的有点
- 对内存需求较小
- 为不同参数计算不同的自适应学习率
- 也适用于大多非凸优化(大数据集和高维空间)
Adamax
是 Adam 的一种变体,给学习率的上限提供了一个更简单的范围
Nadam
类似于带有 Nesterov 动量项的 Adam
总结
- 稀疏数据尽量使用学习率可自适应的优化方法
- SGD通常训练时间更长,但往往结果更可靠
- 对较深较复杂的网络,如果想要更快的收敛,推荐用学习率可自适应的方法
- Adadelta,RMSprop,Adam 表现差不多
一般而言,在可以使用 RMSprop 和 Adam 的地方,用 Nadam 可以取得更好的效果