Caffe源码解读之Solver(五)

机器学习 2017-01-24

  Solver是Caffe的最优求解过程,也是Caffe在进行运算过程中的最重要一步,下面来详细介绍。详细请参考官方链接

 1. 简介   Solver负责对模型优化,让损失函数(loss function)达到全局最小。   Solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,实际上就是一种迭代的优化算法。   在每一次的迭代过程中,Solver做了这几步工作:   1、调用forward算法来计算最终的输出值,以及对应的loss   2、调用backward算法来计算每层的梯度   3、根据选用的slover方法,利用梯度进行参数更新   4、记录并保存每次迭代的学习率、快照,以及对应的状态。   Solver的重点是最小化损失函数的全局最优问题,对于数据集D,优化目标是在全数据集D上损失函数平均值:1.png

  其中,fW(X(i))是在数据实例X(i)上的损失函数,r(W)为规整项,λ为规整项的权重。数据集D一般都很大,工程上在每次迭代中使用这个目标函数的随机逼近,即小批量数据N<<|D|个数据实例: 2.png

模型向前传播计算损失函数fW,反向传播计算梯度∇fW。权值增量ΔW由求解器通过误差梯度 ∇fW、规整项梯度∇r(W),以及其他与方法相关的项求解得到。

  Solver可配置的参数项在https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto 中查看。

  2.优化方法   Solver优化方法有六种:   tochastic Gradient Descent (type: "SGD"),   AdaDelta (type: "AdaDelta"),   Adaptive Gradient (type: "AdaGrad"),   Adam (type: "Adam"),   Nesterov’s Accelerated Gradient (type: "Nesterov"),   RMSprop (type: "RMSProp").

  其中最常用到的是SGD(随机梯度下降算法)   SGD在通过负梯度∇L(W)和上一次的权重更新值Vt的线性组合来更新W,迭代公式如下:

    3.png

  其中,α 是负梯度的学习率,μ 是上一次梯度值的权重,用来加权之前梯度方向对现在梯度下降方向的影响。这两个参数需要通过tuning来得到最好的结果,一般是根据经验设定的。如果你不知道如何设定这些参数,可以参考相关的论文。   在深度学习中使用SGD,比较好的初始化参数的策略是把学习率设为0.01左右(base_lr: 0.01),在训练的过程中,如果loss开始出现稳定水平时,对学习率乘以一个常数因子(gamma),这样的过程重复多次。   对于momentum,一般取值在0.5--0.99之间。通常设为0.9,momentum可以让使用SGD的深度学习方法更加稳定以及快速。   更多问题,请参考Stochastic Gradient Descent Tricks

  对于RMSProp,AdaGrad, AdaDelta and Adam , 还可以设置delta参数。   对于Adam solver, 设置momentum2   对于RMSProp, 设置rms_decay

   4.png


本文由 Tony 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!