caffe学习-第三天

来源:互联网 发布:人工智能 图书 编辑:程序博客网 时间:2024/06/05 22:53

solver是传说中的核心中的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为

caffe train --solver=*_slover.prototxt

在Deep Learning中很少能算出解析解,所以一般是用数学方法找到最优解就好。所以主要是通过前向算法和后向算法分别计算结果和反向推到梯度,以此来减小误差。从数学的角度上讲就是用一系列线性非线性的函数去拟合一个复杂函数,和傅里叶拉普拉斯的思路很像,不过这个更为复杂。

caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择。

  • Stochastic Gradient Descent (type: “SGD”),
  • AdaDelta (type: “AdaDelta”),
  • Adaptive Gradient (type: “AdaGrad”),
  • Adam (type: “Adam”),
  • Nesterov’s Accelerated Gradient (type: “Nesterov”)
  • RMSprop (type: “RMSProp”)

稍微讲解一下,
solver的目的其实就是为了让损失函数这里写图片描述最小化,对于数据集,需要优化的是整个loss的平均值.其中 r(W)是正则项(weight_decay).
实际中不可能将所有数据都拿来训练,太麻烦而且没必要,一半是 分成几个batch,batch_size 远小于数据总量.

在caffe中默认使用SGD,但是也有一些其他的方法.这里讲理解不讲原理.

  1. SGD:学习方向是之前梯度的方向和当前梯度方向的线性组合,一般来说设置base_lr设置为 0.01,如果loss开始出现稳定水平时,对学习率乘以一个常数因子(gamma)重复多次.一般设定momentum0.9.一切的设定都要随经验来,loss过高可以增加学习率这种东西也是很棒的.
base_lr: 0.01 lr_policy: "step"gamma: 0.1   stepsize: 1000  max_iter: 3500 momentum: 0.9
  1. AdaDelta、AdaGrad、Adam、NAG(收敛最快)、RMSprop比较:

浅层的模型(比如lr,fm),并且输入是稀疏的,adagrad会比sgd效果要好。如果问题的输入是dense的,比如深度学习模型,我想adagrad可能帮助不大。
其实一般用sgd都能有很好的结果,搞那么复杂做甚么。

实例:

#网络结构文件所在的位置,从根目录caffe/开始计算#test和train模型可以分别设定两个结构net: "examples/mnist/lenet_train_test.prototxt"#这个要和之前的网络中batch_size结合起来理解,数据量太大,我们不可能全部去一口气理解,必须要分批次来执行,批每个批次的数量就是batch_size。所以要是所有batch_size*test_iter=总的数据量(**大概是这个意思,存疑,莫非不自动设置的吗?**),执行完一个轮回的数据就称为一个epoch.test_iter: 100#测试间隔:500次训练进行一次测试test_interval: 500#上一次梯度更新的权重,动量momentum: 0.9#下降法有六种,之前提到过type: SGD#防止过拟合的参数,权重衰减项(**为啥**)weight_decay: 0.0005#四行一起理解,用于学习率的设置,就是梯度下降的步长,base_lr用于设置基础学习率,在迭代的过程中,可以对基础学习率进行调整。怎么样进行调整,就是调整的策略,由lr_policy来设置(具体设置方案在下面)这里使用的inv策略。lr_policy: "inv"base_lr: 0.01gamma: 0.0001power: 0.75#每训练100次,在屏幕上显示一次。display: 100#最大迭代次数。这个数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。max_iter: 20000#snapshot用于设置训练多少次后进行保存,默认为0,不保存。snapshot_prefix设置保存路径。此处默认保存类型为BINARYPROTOsnapshot: 5000snapshot_prefix: "examples/mnist/lenet"solver_mode: CPU

lr_policy可以设置为下面这些值,相应的学习率的计算为:

  • fixed:   保持base_lr不变.
  • step:    如果设置为step,则还需要设置一个stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
  • exp:   返回base_lr * gamma ^ iter, iter为当前迭代次数
  • inv:   如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
  • multistep: 如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据
    stepvalue值变化
  • poly:    学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
  • sigmoid: 学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
0 0