Caffe Solver里参数解释

整理自:《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为例(后面有几种优化算法的分析)

{Wt+1=Wt+Vt+1Vt+1=μVtαL(Wt)(1)

base_lr:基础学习率,上式中的 α
momentum:动量,上式中的 μ ,保留上一次修正的量,一般设为0.9
lr_policy: lr 更新的策略,有以下几种

  • “fixed”:保持 base_lr不变
  • “step”:还需要设置一个 stepsize,返回 base_lrgammaiterstepsize
  • “exp”:返回 base_lrgammaiter
  • “inv”:还需要设置一个 power,返回 base_lr(1+gammaiter)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(1itermax_iter)power
  • “sigmoid”:lr 进行 sigmod 衰减,返回 base_lr(1(1+egamma(iterstepsize)))

weight_decay:权重衰减项,为了防止发生过拟合


几种优化方法的比较

摘自《深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)》

SGD

一般都是指的 mini-batch gradient descent,每一次迭代计算 mini-batch 的梯度,然后对参数进行更新(式1),是最常见的优化方法

缺点:

  • 选择合适的 lr 比较困难。因为往往对于不同的特征,选择不同的 lr 会更合理(常出现的特征更新速度慢,不常出现的特征更新速度快)
  • 容易收敛到局部最优。不过在合适的初始化和 stepsize 下,鞍点影响并不是很大
Nesterov

在梯度更新时做一个校正,避免前进太快,同时提高灵敏度

Vt+1=αmt+1mt+1=μmt+gt+1gt+1=L(Wtαμmt)(2)

Adagrad

自适应学习率,对 lr 进行了一个约束

Vt+1=αnt+1+εgt+1nt+1=nt+g2t+1gt+1=L(Wt)

优点:

  • 前期 gt 较小的时候,梯度被放大
  • 后期 gt 较大的时候,梯度被约束
  • 适合处理稀疏梯度

缺点:

  • 仍然需要人工设置一个全局学习率
  • 学习率 α 过大会使梯度调节的响应过于敏感
  • 学习率 α 过小会使后期梯度接近0,训练提前结束
Adadelta

Adadelta 是 Adagrad 的扩展,思路依然是对学习率进行自适应约束,但是进行了计算上的简化

Vt+1=tr=1VtE|g2|t+1+εE|g2|t+1=ρE|g2|t+(1ρ)g2t+1

其中 E() 是求期望

特点:

  • 不再需要人工给出全局学习率
  • 训练初中期加速效果不错
  • 训练后期,反复在局部最小值附近抖动
RMSprop

可以算 Adadelta 的一个特例:取 ρ=0.5 ,这样 E|g2|t+1 就变成RMS(均方根)

Vt+1=αRMS|g|t+1gt+1RMS|g|t+1=E|g2|t+1+ε

特点:

  • RMSprop 依然需要人工设置全局学习率
  • 是 Adagrad 的一种改进,效果趋于其和 Adadelta 之间
  • 适合处理非平稳目标,对 RNN 效果很好
Adam

本质上是带有动量项的 RMSprop,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率

Vt+1=mt+1nt+1+εαmt+1=mt+11μt+1nt+1=nt+11νt+1mt+1=μmt+(1μ)gt+1nt+1=νnt+(1ν)g2t+1

其中 mt+1 nt+1 分别是对梯度的一阶矩估计和二阶矩估计;
mt+1 nt+1 是对 mt+1 nt+1 的校正

特点:

  • 结合了 Adagrad 善于处理稀疏梯度和 RMSprop 善于处理非平稳目标的有点
  • 对内存需求较小
  • 为不同参数计算不同的自适应学习率
  • 也适用于大多非凸优化(大数据集和高维空间)
Adamax

是 Adam 的一种变体,给学习率的上限提供了一个更简单的范围

Vt+1=mt+1nt+1+εαnt+1=max(νnt,|gt+1|)

Nadam

类似于带有 Nesterov 动量项的 Adam

Vt+1=αmt+1nt+1+εmt+1=mt+11t+1i=1μint+1=(1μt+1)gt+1+μt+1mt+1mt+1=μt+1mt+(1μt+1)gt+1nt+1=νnt+(1ν)g2t+1gt+1=gt+11t+1i=1μi

总结
  • 稀疏数据尽量使用学习率可自适应的优化方法
  • SGD通常训练时间更长,但往往结果更可靠
  • 对较深较复杂的网络,如果想要更快的收敛,推荐用学习率可自适应的方法
  • Adadelta,RMSprop,Adam 表现差不多

一般而言,在可以使用 RMSprop 和 Adam 的地方,用 Nadam 可以取得更好的效果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值