Caffe中的优化方法

2023-11-04

在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的经验法则

例子

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Caffe中的优化方法 的相关文章

  • Mysql:多个表还是一张大表?

    这个问题已经被问过 但我还没有找到 1 个语音答案 最好这样做 1 张大桌子 其中 用户 ID 属性 1 属性 2 属性 3 属性 4 或 4 个小桌子 其中 用户 ID 属性 1 用户 ID 属性 2 用户 ID 属性 3 用户 ID 属
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 字符串文字会被编译器优化吗?

    C 编译器或 NET CLR 是否对字符串文字 常量进行了任何巧妙的内存优化 我可以发誓我听说过 字符串内化 的概念 因此在程序中的任何两位代码中 文字 这是一个字符串 实际上会指代同一个对象 大概是安全的 对于字符串来说是这样的 不可变
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 如何加速我的 Perl 程序?

    这确实是两个问题 但它们非常相似 为了简单起见 我想我应该把它们放在一起 Firstly 给定一个已建立的 Perl 项目 除了简单的代码优化之外 还有哪些不错的方法可以加速它 Secondly 用Perl从头开始编写程序时 有哪些好的方法
  • 优化正则表达式以过滤数千个 HTML 选择选项

    背景 我开发了一个基于 jQuery 的穿梭小部件 https stackoverflow com a 13557000 59087对于 HTMLselect元素 因为我找不到一个经过最低限度编码并提供正则表达式过滤器来补偿的元素变音符号
  • 删除大量记录需要很长时间

    我有一个包含约 60 000 行的数据库表 在 SQL Server 2012 Express 上运行 我使用以下代码来清除旧行 Deleting CPU measurements older than oldestAllowedTime
  • R 中的约束优化

    我正在尝试使用http rss acs unt edu Rdoc library stats html constrOptim html http rss acs unt edu Rdoc library stats html constr
  • 批量大小不适用于带有deploy.prototxt的caffe

    我正在努力让我的分类过程更快一些 我想增加我的deploy prototxt中的第一个input dim 但这似乎不起作用 甚至比对每张图像进行分类还要慢一点 部署 prototxt input data input dim 128 inp
  • VBA 代码基准测试

    对 VBA 代码进行基准测试最准确的方法是什么 在我的例子中 我正在 Excel 中测试代码 除了下面的 2 种之外 还有其他对代码进行基准测试的技术吗 如果有 该方法的优点 缺点是什么 这里有两种流行的方法 First Timer Sub
  • 具有查找功能的优先级队列 - 最快的实现

    我正在考虑实现一个带有附加要求的优先级队列 一个查找 搜索功能 它将告诉一个项目是否在队列中的任何位置 所以函数将是 insert del min 和 find 我不确定是否应该使用堆或自平衡二叉搜索树 看来 PQ 通常是用堆实现的 但我想
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 编译器是否允许优化堆内存分配?

    考虑以下使用以下简单代码new 我知道没有delete 但这与这个问题无关 int main int mem new int 100 return 0 编译器是否允许优化new call 在我的研究中 g 5 2 0 https gcc g
  • 在 Actionscript-3 中优化 2D Flash 游戏的动态背景引擎

    编辑2 根据缺乏回复来判断 我开始怀疑我的问题是否足够清楚 请告诉我是否需要详细说明 注意 请参阅底部以获取代码更新 简短介绍 我正在用 ActionScript 编写一个二维 Flash 空间游戏 宇宙无限大 由于这个特性 背景必须动态渲
  • 快速平方根优化?

    如果你检查这个非常好的页面 http www codeproject com Articles 69941 Best Square Root Method Algorithm Function Precisi http www codepr
  • 在调用函数两次和将返回值存储在变量中之间选择哪一个?

    我有以下场景 并且我多次遇到类似的场景 以下两个选项中哪一个更可取 选项 1 String result getDetails null getDetails 选项2 String returnValue getDetails String
  • 计算 [1..N] 中前导 1 下面有 K 个零位的整数? (没有 HW POPCNT 的连续范围的 popcount)

    I have following task Count how many numbers between 1 and N will have exactly K zero non leading bits e g 710 1112 will
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 使用实际值检查 cvxpy 中的约束是否正确

    在 cvxpy 中解决优化问题时 是否有一种好方法可以通过用实际值替换优化变量来检查约束是否有效 我有一个复杂的优化问题 100 多个约束 但我知道最佳解决方案应该是什么 但是 cvxpy 失败并显示错误消息ValueError Rank
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use

随机推荐

  • 谈谈Linux epoll惊群问题的原因和解决方案

    近期排查了一个问题 epoll惊群的问题 起初我并不认为这是惊群导致 因为从现象上看 只是体现了CPU不均衡 一共fork了20个Server进程 在请求负载中等的时候 有三四个Server进程呈现出比较高的CPU利用率 其余的Server
  • 如何区分成员函数和构造函数?

    在面向对象编程中 成员函数和构造函数是类中定义的两种不同类型的函数 构造函数是一个特殊的成员函数 用于创建并初始化类的对象 构造函数的名称必须与类的名称相同 它没有返回值 并且在对象创建时自动调用 构造函数可以有参数 这些参数用于初始化类的
  • 字符串查找之 KMP 算法思路讲解和代码实现

    算法介绍 KMP 算法是一种改进的字符串匹配算法 由 D E Knuth J H Morris 和 V R Pratt 提出的 KMP 算法的核心是利用匹配失败后的信息 尽量减少模式串与主串的匹配次数以达到快速匹配的目的 KMP 算法的时间
  • lab值意义_色差仪lab值如何分析

    色差仪在涂料 建材 油漆 涂料 纺织印染 油墨 塑料 染料颜料制造等表面色料工业的配色方面有着广泛的应用 也称为CIELAB均匀色空间 本文深圳京联泰科技给大家就色差仪LAB值如何分析作说明 L 亮度 轴表示黑白 0为黑 100为白 a 红
  • 树莓派常用命令

    刷系统 格式化 这样就ok了 开启ssh 刷完系统在boot盘跟目录创建文件ssh就可以了小写不需要后缀 汉化 sudo raspi config 选4 再选1 然后把 4个前面是 zh cn的 用 空格选中 然后 ok 选zh CN ut
  • 科研无人机平台P600进阶版,突破科研难题!

    随着无人机技术日益成熟 无人机的应用领域不断扩大 对无人机研发的需求也在不断增加 然而 许多开发人员面临着无法从零开始构建无人机的时间和精力压力 同时也缺乏适合的软件平台来支持他们的开发工作 为了解决这个问题 我们特别开发了科研无人机平台P
  • 访问私有变量或方法

    本文主要介绍一下如何访问类的私有成员变量以及类的私有方法 这里以下面这个类来举例 interface HomeController UIViewController NSString name2 property nonatomic cop
  • 分页插件(jquery.pagination.js)简单案例

    分页插件 jquery pagination js 前言 开发中需要展示数据操作记录 但数量是未知的 使用该插件 实现分页切换页码的功能 1 使用 引入文件 先引入jQuery 再引入pagination组件 2 具体效果 3 html代码
  • ubuntu挂载Windows共享文件夹

    1 windows下设置shared文件夹为共享文件夹 2 linux下执行命令 sudo apt get install cifs utils samba client sudo mount t cifs o username dhc p
  • linux下搭建测试环境

    linux应用服务器 腾讯云服务器 centos7 传送文件上传到 linux服务器 winscp 文件传输工具 jdk及tomcat安装 本服务器安装的是jkd1 8 tomcat8 mysql 5 7 下载jkd1 8 https ww
  • Mysql在大型网站的应用架构演变

    摘要 本文主要描述在网站的不同的并发访问量级下Mysql架构的演变历程 架构的可扩展性往往和并发是息息相关 没有并发的增长 也就没有必要做高可扩展性的架构 常用的扩展手段主要有Scale up和Scale out两种 前者为纵向扩展 主要通
  • Java八大基本数据类型

    Java八大基本数据类型 开发工具与关键技术 MyEclipse 10 java 作者 刘东标 撰写时间 2019 04 04 Java语言提供了八种基本类型 六种数字类型 四个整数型 两个浮点型 一种字符类型 还有一种布尔型 1 数据类型
  • Windows下创建进程简介

    正在执行的应用程序称为进程 进程不仅仅是指令和数据 它还有状态 状态是保存在处理器寄存器中的一组值 如当前执行指令的地址 保存在内存中的值 以及唯一定义进程在任一时刻任务的所有其他值 进程与应用程序的一个重要的区别在于 进程运行时 进程的状
  • Linux笔记:文本编辑器vi基础使用

    文章目录 目的 工作模式 命令行模式 默认模式 光标移动 屏模滚动 选择复制黏贴与删除 搜索与替换 撤销与重复 插入模式 总结 目的 vi是几乎所有Unix Linux系统下都自带的文本编辑器 有点类似于window上的记事本 如果用惯了现
  • Sophus库的安装和使用教程

    本系列文章为原创 转载请注明出处 作者 Dongdong Bai 邮箱 baidongdong nudt edu 若您觉得本博文对您有帮助 请您为我点赞并关注我 以鼓励我写出更优秀的博文 谢谢 一 Sophus库简介 Eigen库是一个开源
  • 读spi_flash的id

    读SPI FLASH的ID 在上一课中spi i2c adc OLED文件夹下添加spi flash c及spi flash h文件 并添加到si工程中 明确目的 在main函数中调用函数读取spiflash的厂家ID和设备ID 并打印 明
  • MySQL 数据表创建详细SQL语法

    Table 数据表创建 数据表创建 语法规则1 CREATE TEMPORARY TABLE IF NOT EXISTS tbl name create definition table options partion options 语法
  • gitlab 安装,libc.so.6: version `GLIBC_2.25‘ not found

    背景 ubuntu 16 04 以及 ubuntu18 05 安装 gitlab 都报错误 opt gitlab embedded bin ruby lib x86 64 linux gnu libc so 6 version GLIBC
  • 深度优先遍历(邻接矩阵,邻接表)

    深度优先遍历也称为深度优先搜索 简称为DFS 深度优先遍历的思路是从图中某个顶点V出发 访问此顶点 然后从V的未被访问过的邻接点出发深度优先遍历图 直到图中所有与V路径相通的顶点都被访问到 该遍历过程用到递归 深度优先遍历用到了一个辅助数组
  • Caffe中的优化方法

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