上文提到,到目前为止,caffe总共提供了六种优化方法:

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

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

其中,fW(x(i))计算的是数据x(i)上的loss, 先将每个单独的样本x的loss求出来,然后求和,最后求均值。 r(W)是正则项(weight_decay),为了减弱过拟合现象。

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

在实际中,通过将整个数据集分成几批(batches), 每一批就是一个mini-batch,其数量(batch_size)为N<<|D|,此时的loss 函数为:
 

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

在caffe中,默认采用的Stochastic Gradient Descent(SGD)进行优化求解。后面几种方法也是基于梯度的优化方法(like SGD),因此本文只介绍一下SGD。其它的方法,有兴趣的同学,可以去看文献原文。

1、Stochastic gradient descent(SGD)

随机梯度下降(Stochastic gradient descent)是在梯度下降法(gradient descent)的基础上发展起来的,梯度下降法也叫最速下降法,具体原理在网易公开课《机器学习》中,吴恩达教授已经讲解得非常详细。SGD在通过负梯度和上一次的权重更新值Vt的线性组合来更新W,迭代公式如下:


 
其中,  是负梯度的学习率(base_lr),是上一次梯度值的权重(momentum),用来加权之前梯度方向对现在梯度下降方向的影响。这两个参数需要通过tuning来得到最好的结果,一般是根据经验设定的。如果你不知道如何设定这些参数,可以参考相关的论文。

在深度学习中使用SGD,比较好的初始化参数的策略是把学习率设为0.01左右(base_lr: 0.01),在训练的过程中,如果loss开始出现稳定水平时,对学习率乘以一个常数因子(gamma),这样的过程重复多次。

对于momentum,一般取值在0.5--0.99之间。通常设为0.9,momentum可以让使用SGD的深度学习方法更加稳定以及快速。

关于更多的momentum,请参看Hinton的《A Practical Guide to Training Restricted Boltzmann Machines》。

实例:

[cpp] view plaincopy
  1. base_lr: 0.01
  2. lr_policy: "step"
  3. gamma: 0.1
  4. stepsize: 1000
  5. max_iter: 3500
  6. momentum: 0.9

lr_policy设置为step,则学习率的变化规则为 base_lr * gamma ^ (floor(iter / stepsize))

即前1000次迭代,学习率为0.01; 第1001-2000次迭代,学习率为0.001; 第2001-3000次迭代,学习率为0.00001,第3001-3500次迭代,学习率为10-5

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

2、AdaDelta

AdaDelta是一种”鲁棒的学习率方法“,是基于梯度的优化方法(like SGD)。

具体的介绍文献:

M. Zeiler ADADELTA: AN ADAPTIVE LEARNING RATE METHOD. arXiv preprint, 2012.

示例:

[cpp] view plaincopy
  1. net: "examples/mnist/lenet_train_test.prototxt"
  2. test_iter: 100
  3. test_interval: 500
  4. base_lr: 1.0
  5. lr_policy: "fixed"
  6. momentum: 0.95
  7. weight_decay: 0.0005
  8. display: 100
  9. max_iter: 10000
  10. snapshot: 5000
  11. snapshot_prefix: "examples/mnist/lenet_adadelta"
  12. solver_mode: GPU
  13. type: "AdaDelta"
  14. delta: 1e-6

从最后两行可看出,设置solver type为Adadelta时,需要设置delta的值。

3、AdaGrad

自适应梯度(adaptive gradient)是基于梯度的优化方法(like SGD)

具体的介绍文献:

Duchi, E. Hazan, and Y. Singer. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. The Journal of Machine Learning Research, 2011.

示例:

[cpp] view plaincopy
  1. net: "examples/mnist/mnist_autoencoder.prototxt"
  2. test_state: { stage: 'test-on-train' }
  3. test_iter: 500
  4. test_state: { stage: 'test-on-test' }
  5. test_iter: 100
  6. test_interval: 500
  7. test_compute_loss: true
  8. base_lr: 0.01
  9. lr_policy: "fixed"
  10. display: 100
  11. max_iter: 65000
  12. weight_decay: 0.0005
  13. snapshot: 10000
  14. snapshot_prefix: "examples/mnist/mnist_autoencoder_adagrad_train"
  15. # solver mode: CPU or GPU
  16. solver_mode: GPU
  17. type: "AdaGrad"
4、Adam

是一种基于梯度的优化方法(like SGD)。

具体的介绍文献:

D. Kingma, J. Ba. Adam: A Method for Stochastic Optimization. International Conference for Learning Representations, 2015.

5、NAG

Nesterov 的加速梯度法(Nesterov’s accelerated gradient)作为凸优化中最理想的方法,其收敛速度非常快。

具体的介绍文献:

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.

示例:

[cpp] view plaincopy
  1. net: "examples/mnist/mnist_autoencoder.prototxt"
  2. test_state: { stage: 'test-on-train' }
  3. test_iter: 500
  4. test_state: { stage: 'test-on-test' }
  5. test_iter: 100
  6. test_interval: 500
  7. test_compute_loss: true
  8. base_lr: 0.01
  9. lr_policy: "step"
  10. gamma: 0.1
  11. stepsize: 10000
  12. display: 100
  13. max_iter: 65000
  14. weight_decay: 0.0005
  15. snapshot: 10000
  16. snapshot_prefix: "examples/mnist/mnist_autoencoder_nesterov_train"
  17. momentum: 0.95
  18. # solver mode: CPU or GPU
  19. solver_mode: GPU
  20. type: "Nesterov"
6、RMSprop

RMSprop是Tieleman在一次 Coursera课程演讲中提出来的,也是一种基于梯度的优化方法(like SGD)

具体的介绍文献:

T. Tieleman, and G. Hinton. RMSProp: Divide the gradient by a running average of its recent magnitude. COURSERA: Neural Networks for Machine Learning.Technical report, 2012.

示例:

[cpp] view plaincopy
  1. net: "examples/mnist/lenet_train_test.prototxt"
  2. test_iter: 100
  3. test_interval: 500
  4. base_lr: 1.0
  5. lr_policy: "fixed"
  6. momentum: 0.95
  7. weight_decay: 0.0005
  8. display: 100
  9. max_iter: 10000
  10. snapshot: 5000
  11. snapshot_prefix: "examples/mnist/lenet_adadelta"
  12. solver_mode: GPU
  13. type: "RMSProp"
  14. rms_decay: 0.98
最后两行,需要设置rms_decay值。

Caffe傻瓜系列(7):solver优化方法相关推荐

  1. Caffe学习系列(8):solver优化方法

    Caffe学习系列(8):solver优化方法 上文提到,到目前为止,caffe总共提供了六种优化方法: Stochastic Gradient Descent (type: "SGD&qu ...

  2. CAFFE源码学习之优化方法solver

    一.前言 solver就是来计算损失函数最小化的优化方法,在caffe中,提供了六种不同的优化方法: (1)SGD: (2)AdaGrad: (3)AdaDelta: (4)Adam: (5)RMSP ...

  3. Caffe 学习系列

    学习列表: Google protocol buffer在windows下的编译 caffe windows 学习第一步:编译和安装(vs2012+win 64) caffe windows学习:第一 ...

  4. Caffe源码中Solver文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/solver.hpp文件的 ...

  5. CPU CACHE优化 性能优化方法和技巧

    转载来源:性能优化方法和技巧 系列目录 性能优化方法和技巧 性能优化的方法和技巧:概述 性能优化的方法和技巧:代码 性能优化的方法和技巧:工具 这是一个可以用一本书来讲的话题,用一系列博客来讲,可能会 ...

  6. Caffe学习系列(7):solver及其配置

    solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 # caffe train --solver=*_slover ...

  7. Caffe新手教程傻瓜系列(9):训练和测试自己的图片

    在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致.而在caffe中经常使用的数据类型是lmdb或leveldb,因 ...

  8. 为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)

    @Author:Runsen @Date:2020/9/17 多重背包有三层循环,如果数据非常的大,那么程序就会变得非常悲伤.在多重背包的问题,其实更多的是考查多重背包的二进制优化方法.学习二进制优化 ...

  9. 机器学习案例系列教程——优化方法总结(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)

    梯度下降法 梯度下降法是最早最简单,也是最为常用的最优化方法.梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解.一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的.梯度 ...

  10. 一维搜索方法c语言,优化方法基础系列-非精确的一维搜索技术

    选择最优步长的精确搜索方法往往计算量大,特别是当迭代点远离最优解时,效率很低,而且很多最优化算法的收敛速度并不依赖于精确的一维搜索过程.这促使一些研究者放宽了一维搜索的精确要求,而去保证目标函数在每次 ...

最新文章

  1. CICC《城市大脑建设规范》标准建设启动会在京召开
  2. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
  3. Java高级开发必会的50个性能优化的细节(珍藏版)
  4. 完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第1部分
  5. 定时器--STM32f4--HAL
  6. 12.history的用法
  7. python中的tkinter_基于python中tkinter的计算机实现
  8. android ios mp4格式转换,ios格式转换器
  9. python连接sqlserver 多条sql语句后提交_利用python操作sqllite
  10. 含HTML标记的内容分页 (C#)
  11. java成员变量除了方法传递_JAVA类与对象(四)----成员变量与局部变量 、成员方法、构造方法...
  12. Ubuntu18.04之微信中文乱码解决
  13. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究
  14. Java-Swing编程介绍
  15. Xcode8 解决控制台输出
  16. linux下安装点歌系统,V8点歌系统
  17. 课设:指纹签到系统-支持PC网页端查看
  18. 印度和印度尼西亚有什么关系吗?
  19. 无烦恼厨房android版,无烦恼厨房安卓版
  20. javaScript(ES5)中想方设法继承家产的方式详解

热门文章

  1. 介绍一下python getopt 模块
  2. SylixOS SylixOS CAN总线驱动之三
  3. 使用Python和Perl绘制北京跑步地图
  4. 主机网络切换后,docker toolbox里的容器网络不通了,解决方法
  5. edx : Permission denied
  6. WPF Summary:XAML的介绍
  7. 中国产品质量协会AAA等级企业限定为500家
  8. 《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数...
  9. C++函数和函数的调用
  10. 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现