博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
优化器,sgd,adam等
阅读量:5331 次
发布时间:2019-06-14

本文共 976 字,大约阅读时间需要 3 分钟。

https://zhuanlan.zhihu.com/p/32230623

 

 

首先定义:待优化参数: w ,目标函数: f(w) ,初始学习率 \alpha

而后,开始进行迭代优化。在每个epoch t :

  1. 计算目标函数关于当前参数的梯度: g_t=\nabla f(w_t)
  2. 根据历史梯度计算一阶动量和二阶动量:m_t = \phi(g_1, g_2, \cdots, g_t); V_t = \psi(g_1, g_2, \cdots, g_t)
  3. 计算当前时刻的下降梯度: \eta_t = \alpha \cdot m_t / \sqrt{V_t}
  4. 根据下降梯度进行更新: w_{t+1} = w_t - \eta_t

sgd:

先来看SGD。SGD没有动量的概念,也就是说:

m_t = g_t; V_t = I^2

代入步骤3,可以看到下降梯度就是最简单的

\eta_t = \alpha \cdot g_t

SGD缺点:下降速度慢,而且可能会在沟壑的两边持续震荡,停留在一个局部最优点。

SGD with Momentum

sgd引入一阶动量,为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些

m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1)\cdot g_t

t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定    0.9

AdaGrad

怎么样去度量历史更新频率呢?那就是二阶动量——该维度上,迄今为止所有梯度值的平方和:

V_t = \sum_{\tau=1}^{t} g_\tau^2

我们再回顾一下步骤3中的下降梯度:

\eta_t = \alpha \cdot m_t / \sqrt{V_t}

可以看出,此时实质上的学习率由 \alpha 变成了 \alpha / \sqrt{V_t} ,这也是为什么叫自适应学习率

这一方法在稀疏数据场景下表现非常好。但也存在一些问题:因为\sqrt{V_t} 是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。

AdaDelta / RMSProp

 由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。其实只关注了上一个时刻

 

 

 

V_t = \beta_2 * V_{t-1} + (1-\beta_2) g_t^2

这就避免了二阶动量持续累积、导致训练过程提前结束的问题了。

 

Adam

 

谈到这里,Adam和Nadam的出现就很自然而然了——它们是前述方法的集大成者。我们看到,SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。

 

SGD的一阶动量:

m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1)\cdot g_t

加上AdaDelta的二阶动量:

V_t = \beta_2 * V_{t-1} + (1-\beta_2) g_t^2

 

优化算法里最常见的两个超参数 \beta_1, \beta_2 就都在这里了,前者控制一阶动量,后者控制二阶动量。

转载于:https://www.cnblogs.com/ymjyqsx/p/9527560.html

你可能感兴趣的文章
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Maven之setting.xml配置文件详解
查看>>
SDK目录结构
查看>>
malloc() & free()
查看>>
HDU 2063 过山车
查看>>
高精度1--加法
查看>>
String比较
查看>>
Django之Models
查看>>