优化算法

梯度

梯度就是高度变化率最大的方向

\[gradf(x,y)=\frac{\partial f}{\partial x}\vec i + \frac{\partial f}{\partial y}\vec j \]

所以一般优化方向选梯度的反方向

BGD

batch gradient descent:

一次迭代是对所有样本进行计算,算出总的梯度,并进行梯度下降

  • 优点

    • 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
  • 缺点

    • 对显存要求高(可以用梯度累计解决)
    • 每迭代一步都要计算所有样本,训练速度慢

SGD

stochastic gradient descent:

每次参数更新只使用一个样本

\[\theta_{t+1}=\theta_t-\eta *g_t\\ \eta :学习率 \]

  • 优点

    • 迭代速度快
  • 缺点

    • 准确度低,抗干扰能力差

    • 不易并行

Mini-Batch GD

mini-batch gradient descent:

每次参数更新使用一小批样本

  • 融合了BGD,SGD
    • 速度比BGD快,比SGD慢
    • 精度比BGD低,比SGD高
  • 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
  • 可并行

SGD-Momentum

SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum,加速 SGD 在正确方向的下降并抑制震荡。

\[m_t=\gamma m_{t-1}+ (1-\gamma) g_t\\ \theta_{t}=\theta_{t-1}- \eta m_t \]

SGD-M 在原步长之上,增加了与上一时刻步长相关的 \(\gamma m_{t-1}\)\(\gamma\) 通常取 0.9 左右。

作用:加速收敛,减小震荡

Nesterov

提前预判下一步位置,算梯度,来矫正当前梯度

\[g_t=gradf( \theta_{t-1}-\eta m_{t-1}) \\ m_t=\gamma m_{t-1}+ (1-\gamma) g_t\\ \theta_{t}=\theta_{t-1}- \eta m_t \]

Adagrad

自适应学习率

SGD、SGD-M、Nesterov 均是以相同的学习率去更新参数 \(\theta\) 的各个分量。而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。对于更新不频繁的参数(典型例子:更新 word embedding 中的低频词),我们希望单次步长更大,多学习一些知识;对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多。

于是引入二阶动量

\[r_t=r_{t-1}+ g_t \odot g_t\\ \theta_{t}=\theta_{t-1}- \frac{\eta}{\sqrt {r_t+\varepsilon }} g_t \]

作用:加速收敛慢的参数,减缓剧烈变换的参数

缺点是 学习率很快就会接近0

RMSprop

Adagrad中的 \(r\) 单调递增,导致学习率很快会接近0。RMSprop选择只关注一段时间内的梯度信息,越老的信息权重越小。

\[r_t=\rho r_{t-1}+(1-\rho )g_t \odot g_t\\ \theta_{t}=\theta_{t-1}- \frac{\eta}{\sqrt {r_t+\varepsilon }} g_t \]

一般 \(\rho=0.9\)

Adam

Momentum+RMSProp

\[m_t=\rho_1 m_{t-1}+ (1-\rho_1) g_t\\ r_t=\rho_2 r_{t-1}+(1-\rho_2 )g_t \odot g_t\\ \theta_{t}=\theta_{t-1}- \frac{\eta}{\sqrt {r_t+\varepsilon }} m_t \]

一般 $ \rho_1=0.9, \rho_2=0.999$

posted @   shiiiilong  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示