机器学习的常见优化方法在最近的学习中经常遇到,但是还是不够精通.将自己的学习记录下来,以备不时之需

基础知识:

机器学习几乎所有的算法都要利用损失函数 lossfunction 来检验算法模型的优劣,同时利用损失函数来提升算法模型.

这个提升的过程就叫做优化(Optimizer)

下面这个内容主要就是介绍可以用来优化损失函数的常用方法

常用的优化方法(Optimizer):

  • 1.SGD&BGD&Mini-BGD:

    SGD(stochastic gradient descent):随机梯度下降,算法在每读入一个数据都会立刻计算loss function的梯度来update参数.假设loss function为L(w),下同.\[w-=\eta \bigtriangledown_{w_{i}}L(w_{i}) \]

    Pros:收敛的速度快;可以实现在线更新;能够跳出局部最优

    Cons:很容易陷入到局部最优,困在马鞍点.

    BGD(batch gradient descent):批量梯度下降,算法在读取整个数据集后累加来计算损失函数的的梯度
    \[w-=\eta \bigtriangledown_{w}L(w)\]

    Pros:如果loss function为convex,则基本可以找到全局最优解

    Cons:数据处理量大,导致梯度下降慢;不能实时增加实例,在线更新;训练占内存

    Mini-BGD(mini-batch gradient descent):顾名思义,选择小批量数据进行梯度下降,这是一个折中的方法.采用训练集的子集(mini-batch)来计算loss function的梯度.\[w-=\eta \bigtriangledown_{w_{i:i+n}}L(w_{i:i+n})\]

    这个优化方法用的也是比较多的,计算效率高而且收敛稳定,是现在深度学习的主流方法.

    上面的方法都存在一个问题,就是update更新的方向完全依赖于计算出来的梯度.很容易陷入局部最优的马鞍点.能不能改变其走向,又保证原来的梯度方向.就像向量变换一样,我们模拟物理中物体流动的动量概念(惯性).引入Momentum的概念.

  • 2.Momentum

    在更新方向的时候保留之前的方向,增加稳定性而且还有摆脱局部最优的能力\[\Delta w=\alpha \Delta w- \eta \bigtriangledown L(w)\] \[w=w+\Delta w\]

    若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。一种形象的解释是:我们把一个球推下山,球在下坡时积聚动量,在途中变得越来越快,\(\eta\)可视为空气阻力,若球的方向发生变化,则动量会衰减。
  • 3.Adagrad:(adaptive gradient)自适应梯度算法,是一种改进的随机梯度下降算法.
    以前的算法中,每一个参数都使用相同的学习率\(\alpha\). Adagrad算法能够在训练中自动对learning_rate进行调整,出现频率较低参数采用较大的\(\alpha\)更新.出现频率较高的参数采用较小的\(\alpha\)更新.根据描述这个优化方法很适合处理稀疏数据.\[G=\sum ^{t}_{\tau=1}g_{\tau} g_{\tau}^{T}  其中 s.t. g_{\tau}=\bigtriangledown L(w_{i})\] 对角线矩阵\[G_{j,j}=\sum _{\tau=1}^{t} g_{\tau,j\cdot}^{2}\] 这个对角线矩阵的元素代表的是参数的出现频率.每个参数的更新\[w_{j}=w_{j}-\frac{\eta}{\sqrt{G_{j,j}}}g_{j}\]
  • 4.RMSprop:(root mean square propagation)也是一种自适应学习率方法.不同之处在于,Adagrad会累加之前所有的梯度平方,RMProp仅仅是计算对应的平均值.可以缓解Adagrad算法学习率下降较快的问题.\[v(w,t)=\gamma v(w,t-1)+(1-\gamma)(\bigtriangledown L(w_{i}))^{2} ,其中 \gamma 是遗忘因子\]  参数更新\[w=w-\frac{\eta}{\sqrt{v(w,t)}}\bigtriangledown L(w_{i})\]
  • 5.Adam:(adaptive moment estimation)是对RMSProp优化器的更新.利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率.
    优点:每一次迭代学习率都有一个明确的范围,使得参数变化很平稳.
    \[m_{w}^{t+1}=\beta_{1}m_{w}^{t}+(1-\beta_{1}) \bigtriangledown L^{t} ,m为一阶矩估计\]
    \[v_{w}^{t+1}=\beta_{2}m_{w}^{t}+(1-\beta_{2}) (\bigtriangledown L^{t})^{2},v为二阶矩估计\]
    \[\hat{m}_{w}=\frac{m_{w}^{t+1}}{1-\beta_{1}^{t+1}},估计校正,实现无偏估计\]
    \[\hat{v}_{w}=\frac{v_{w}^{t+1}}{1-\beta_{2}^{t+1}}\]
    \[w^{t+1} \leftarrow=w^{t}-\eta \frac{\hat{m}_{w}}{\sqrt{\hat{v}_{w}}+\epsilon}\]
    Adam是实际学习中最常用的算法

优化方法在实际中的直观体验

损失曲面的轮廓和不同优化算法的时间演化。 注意基于动量的方法的“过冲”行为,这使得优化看起来像一个滚下山的球

优化环境中鞍点的可视化,其中沿不同维度的曲率具有不同的符号(一维向上弯曲,另一维向下)。 请注意,SGD很难打破对称性并陷入困境。 相反,诸如RMSprop之类的算法将在鞍座方向上看到非常低的梯度。 由于RMSprop更新中的分母术语,这将提高此方向的有效学习率,从而帮助RMSProp继续进行.

参考文献:

深度学习常见的优化方法(Optimizer)总结:Adam,SGD,Momentum,AdaGard等的更多相关文章

  1. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam) 深度学习笔记(一):logistic分类 深度学习笔记(二):简单神经网络,后向传播算法及实现 ...

  2. 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)

    前言 这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小. 本文以下内容假设读者已经了解机器学习基本知识,和梯度下降的原理. SGD SGD指stochast ...

  3. 深度学习编译与优化Deep Learning Compiler and Optimizer

    深度学习编译与优化Deep Learning Compiler and Optimizer

  4. 基于NVIDIA GPUs的深度学习训练新优化

    基于NVIDIA GPUs的深度学习训练新优化 New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs 不同行业采用 ...

  5. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

  6. 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)

    优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...

  7. 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(转)

    转自: https://zhuanlan.zhihu.com/p/22252270    ycszen 另可参考: https://blog.csdn.net/llx1990rl/article/de ...

  8. 机器学习优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)

    SGD: 此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 mi ...

  9. 几种优化方法的整理(SGD,Adagrad,Adadelta,Adam)

    参考自: https://zhuanlan.zhihu.com/p/22252270 常见的优化方法有如下几种:SGD,Adagrad,Adadelta,Adam,Adamax,Nadam 1. SG ...

随机推荐

  1. IO流总结2

    2.字节流 |-- InputStream(读) |-- OutputStream(写) 由于字节是二进制数据,所以字节流可以操作任何类型的数据,值得注意的是字符流使用的是字符数组char[]而字节流 ...

  2. 【iOS】The identity used sign the executable is no longer valid.

    之前就遇到过这个问题,如图: 今天又遇到了,证书过期的问题. 需要访问苹果开发者的官网 http://developer.apple.com 来解决. 参考:How to fix “The ident ...

  3. PHP编码风格规范

    由于PHP的灵活性,很多人写起代码来也不讲求一个好的代码规范,使得本就灵活的PHP代码看起来很乱,其实PSR规范中的PSR-1和PSR-2已经定义了在PHP编码中的一些规范,只要我们好好遵守这些规范, ...

  4. Chrome谷歌浏览器实用插件

    总结整理了一下个人平时常用的谷歌浏览器插件 Adblock Plus 广告拦截  uBlock Origin Chrono 下载管理器 Tampermonkey 油猴子(各种强大的脚本,强烈推荐) F ...

  5. [译]使用golang每分钟处理百万请求

    [译]使用golang每分钟处理百万请求 在Malwarebytes,我们正在经历惊人的增长,自从我在1年前加入硅谷的这家公司以来,我的主要职责是为多个系统做架构和开发,为这家安全公司的快速发展以及百 ...

  6. JAVA基础知识(九)Java 异常

    Throwable是Error和Exception的基类 Exception(异常) :是程序本身可以处理的异常. Error(错误): 是程序无法处理的错误.这些错误表示故障发生于虚拟机自身.或者发 ...

  7. http测试工具

    http测试工具: https://github.com/denji/awesome-http-benchmark wrk https://github.com/wg/wrk wrk2 https:/ ...

  8. eclipse插件——maven

    项目开发中遇到的问题 都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 为什么在我的机器上可以正常打包,而配置管理员却打不出来? 项目组加入了新的人员,我要给他说明编译环境如何设 ...

  9. Android实现多语言so easy

    微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521声明:本文由CodingAndroid原创,未经授权,不可随意转载! 最近,我们公 ...

  10. c++的构造和析构

    //文件名ss.h 1 #pragma once class ss { private: char*p;//利用指针来为p申请对内存 float height; ; char sex; public: ...