solver.prototxt参数说明(一)

转载 2016年05月31日 21:13:25

http://blog.csdn.net/achaoluo007/article/details/43773903


在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。Caffe通过协调的进行整个网络的前向传播推倒以及后向梯度对参数进行更新,试图减小损失。

 Caffe已经封装好了三种优化方法,分别是Stochastic Gradient Descent (SGD), AdaptiveGradient (ADAGRAD), and Nesterov’s Accelerated Gradient (NAG)。


 Solver的流程:

1.     设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。

2.     通过forward和backward迭代的进行优化来跟新参数

3.     定期的评价测试网络

4.     在优化过程中显示模型和solver的状态

 每一步迭代的过程

1.     通过forward计算网络的输出和loss

2.     通过backward计算网络的梯度

3.     根据solver方法,利用梯度来对参数进行更新

4.     根据learning rate,history和method来更新solver的状态

 

和Caffe模型一样,Caffe solvers也可以CPU / GPU运行。


1. Methods

Solver方法一般用来解决loss函数的最小化问题。对于一个数据集D,需要优化的目标函数是整个数据集中所有数据loss的平均值。


其中, r(W)是正则项,为了减弱过拟合现象。

如果采用这种Loss 函数,迭代一次需要计算整个数据集,在数据集非常大的这情况下,这种方法的效率很低,这个也是我们熟知的梯度下降采用的方法。


在实际中,会采用整个数据集的一个mini-batch,其数量为N<<|D|,此时的loss 函数为:
 


有了loss函数后,就可以迭代的求解loss和梯度来优化这个问题。在神经网络中,用forward pass来求解loss,用backward pass来求解梯度。


1.1 SGD

类型:SGD
随机梯度下降(Stochastic gradient descent)通过negative梯度和上一次的权重更新值V_t的线性组合来更新W,迭代公式如下:


 
其中,learning rate  是negative梯度的权重,momentum是上一次更行的权重。这两个参数需要通过tuning来得到最好的结果,一般是根据经验设定的。如果你不知道如何设定这些参数,可以参考下面的经验法则,如果需要了解更多的参数设置技巧可以参考论文Stochastic Gradient Descent Tricks [1]。


设置learningrate和momentum的经验法则

例子

[plain] view plain copy
  1. base_lr: 0.01     # begin training at a learning rate of0.01 = 1e-2 lr_policy: "step" # learning ratepolicy: drop the learning rate in "steps"                  # by a factor of gamma everystepsize iterations gamma: 0.1        # drop the learning rate by a factor of10                  # (i.e., multiply it by afactor of gamma = 0.1) stepsize: 100000  # drop the learning rate every 100K iterations max_iter: 350000  # train for 350K iterations total momentum: 0.9  

在深度学习中使用SGD,好的初始化参数的策略是把learning rate设为0.01左右,在训练的过程中,如果loss开始出现稳定水平时,对learning rate乘以一个常数因子(比如,10),这样的过程重复多次。此外,对于momentum,一般设为0.9,momentum可以让使用SGD的深度学习方法更加稳定以及快速,这次初始参数参论文ImageNet Classification with Deep Convolutional Neural Networks [2]。

上面的例子中,初始化learning rate的值为0.01,前100K迭代之后,更新learning rate的值(乘以gamma)得到0.01*0.1=0.001,用于100K-200K的迭代,一次类推,直到达到最大迭代次数350K。

Note that the momentum setting μ effectively multiplies the size of your updates by a factor of 11−μ after many iterations of training, so if you increase μ, it may be a good idea to decrease α accordingly (and vice versa).

For example, with μ=0.9, we have an effective update size multiplier of 11−0.9=10. If we increased the momentum to μ=0.99, we’ve increased our update size multiplier to 100, so we should drop α (base_lr) by a factor of 10.

上面的设置只能作为一种指导,它们不能保证在任何情况下都能得到最佳的结果,有时候这种方法甚至不work。如果学习的时候出现diverge(比如,你一开始就发现非常大或者NaN或者inf的loss值或者输出),此时你需要降低base_lr的值(比如,0.001),然后重新训练,这样的过程重复几次直到你找到可以work的base_lr。


1.2 AdaGrad

类型:ADAGRAD

自适应梯度(adaptive gradient)[3]是基于梯度的优化方法(like SGD),以作者的话说就是,“find needles in haystacks in the form of very predictive but rarely seen features”。给定之前所有迭代的更新信息,每一个W的第i个成分的更新如下:


 
在实践中需要注意的是,权重,AdaGrad的实现(包括在Caffe中)只需要使用额外的存储来保存历史的梯度信息,而不是的存储(这个需要独立保存每一个历史梯度信息)。(自己没有理解这边的意思)


1.3 NAG

类型:NAG
Nesterov 的加速梯度法(Nesterov’s accelerated gradient)作为凸优化中最理想的方法,其收敛速度可以达到而不是。但由于深度学习中的优化问题往往是非平滑的以及非凸的(non-smoothness and non-convexity),在实践中NAG对于某类深度学习的结构可以成为非常有效的优化方法,比如deep MNIST autoencoders[5]。


权重的更新和SGD的的非常类似:


 
不同的是在计算梯度的时候,在NAG中求解权重加上momentum的梯度,而在SGD中只是简单的计算当前权重的梯度


2. 参考:

[1] L. Bottou. Stochastic Gradient Descent Tricks. Neural Networks: Tricks of the Trade: Springer, 2012.
[2] A. Krizhevsky, I. Sutskever, and G. Hinton. ImageNet Classification with Deep Convolutional Neural Networks. Advances in Neural Information Processing Systems, 2012.
[3] J. Duchi, E. Hazan, and Y. Singer. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. The Journal of Machine Learning Research, 2011.
[4] Y. Nesterov. A Method of Solving a Convex Programming Problem with Convergence Rate O(1/k√). Soviet Mathematics Doklady, 1983.
[5] I. Sutskever, J. Martens, G. Dahl, and G. Hinton. On the Importance of Initialization and Momentum in Deep Learning. Proceedings of the 30th International Conference on Machine Learning, 2013.
[6] http://caffe.berkeleyvision.org/tutorial/solver.html

solver.prototxt参数说明(二)

http://www.cnblogs.com/denny402/p/5074049.html solver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是s...
  • u012746763
  • u012746763
  • 2016年05月31日 21:14
  • 6212

solver.prototxt参数解析

solver.prototxt的一般结构先看一个实例: train_net:"models/VGGNet/VOC0712/SSD_300x300/train.prototxt" test_net:"...
  • xygl2009
  • xygl2009
  • 2017年08月22日 19:38
  • 394

caffe中solver.prototxt参数说明

http://www.cnblogs.com/denny402/p/5074049.html solver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是so...
  • u010417185
  • u010417185
  • 2016年11月25日 20:43
  • 8237

Caffe solver.prototxt学习

这里介绍caffe 的配置文件solver.protxt里面各个参数的含义。
  • a1154761720
  • a1154761720
  • 2016年08月13日 21:04
  • 1747

Caffe学习笔记(五):使用pycaffe生成solver.prototxt文件并进行训练

转载请注明作者和出处:http://blog.csdn.net/c406495762 Python版本: Python2.7 运行平台: Ubuntu14.04...
  • c406495762
  • c406495762
  • 2017年04月20日 23:44
  • 4397

solver.prototxt解析

*_slover.prototxt net: "test.prototxt" #训练网络的配置文件 test_iter: 100 #test_iter 指明在测试阶段有多上个前向过程(也就...
  • s151506879
  • s151506879
  • 2016年08月06日 12:35
  • 601

Caffe 关于 LetNet-5 之 lenet_solver.prototxt 解析

对于 LetNet-5 这个模型,在训练和测试时涉及到一些参数, Caffe 在 lenet_solver.prototxt 这个参数描述文件定义了相关参数。# The train/test net...
  • zhangjunhit
  • zhangjunhit
  • 2016年12月13日 16:38
  • 1609

Caffe部署中的几个train-test-solver-prototxt-deploy等说明 (一)

转载地址: http://blog.csdn.net/lg1259156776/article/details/52550830 本文只是自己学习一天的总结,如有不对的地方,欢迎指正! ...
  • u011070171
  • u011070171
  • 2016年10月13日 09:07
  • 794

实用:使用caffe训练模型时solver.prototxt中的参数设置解析

笔者之前发布了关于解析caffe的层的博客,解析caffe常用层的博客正在不断更新中。本篇博客是一个插播的博客,目的在彻底解决使用caffe训练模型时的参数设置问题,为什么要发这篇博客呢?是因为笔者最...
  • jiongnima
  • jiongnima
  • 2017年03月31日 19:50
  • 3249

solver.prototxt参数说明(三)

http://www.mamicode.com/info-detail-1368127.html solver.prototxt net: "models/bvlc_alexnet/train...
  • u012746763
  • u012746763
  • 2016年05月31日 21:24
  • 2257
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:solver.prototxt参数说明(一)
举报原因:
原因补充:

(最多只允许输入30个字)