优化器

优化器

SGD

随机梯度下降
问题:训练轨迹会呈现锯齿状,这无疑会大大延长训练时间。同时,由于存在摆动现象,学习率只能设置的较小,才不会因为步伐太大而偏离最小值。
Momentum:将一段时间内的梯度向量进行了加权平均,分别计算得到梯度更新过程中参数的大致走向,一定程度上消除了更新过程中的不确定性因素(如摆动现象),使得梯度更新朝着一个越来越明确的方向前进。\(\beta\) 常取0.90.9 的 60 次方约等于 0.001,相当仅考虑最近的60轮迭代所产生的的梯度。

\[m_t=\beta m_{t-1}+\alpha g_t, \left(\alpha\text{取1或}1-\beta\right) \]

\[\theta_t=\theta_{t-1}-\eta*m_t \]

Adagrad

AdaGrad对学习率进行了一个约束,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。
AdaGrad引入了二阶动量。二阶动量是迄今为止所有梯度值的平方和,即\(v_t=\sum_{i=1}^{t}g_i^2\)
优点:AdaGrad消除了手动调整学习率的需要。AdaGrad在迭代过程中不断调整学习率,并让目标函数中的每个参数都分别拥有自己的学习率。
缺点:1. 分母会不断积累,这样学习率就会收缩并最终会变得非常小。2. 需要设置全局学习率

\[\theta_t=\theta_{t-1} - \frac{\eta}{\sqrt{v_t+\epsilon}}*g_t \]

Adadelta

这个算法是对 Adagrad 的改进,主要从两个方面进行改进:

  1. 解决学习率逐渐下降至 0 的问题:
    Adadelta 在一个窗口 w 中对梯度进行求和,而不是对梯度一直累加。但由于需要存储前w个状态,比较麻烦。AdaDelta使用了类似动量因子的平均方法(分母相当于使用了梯度的均方根 \(RMS\)):

    \[ v_t=\beta * v_{t-1} + (1-\beta) * g_t^2 \]

    \[ \theta_t=\theta_{t-1} - \frac{\eta}{\sqrt{v_t+\epsilon}}*g_t \]

  2. 解决依赖全局学习率的问题:
    将学习率 \(\eta\) 换成了 \(RMS[\Delta \theta]\):

    \[ \theta_t=\theta_{t-1}-\frac{RMS[\Delta \theta]_{t-1}}{RMS[g]_t}*g_t \]

    修改为动量形式(\(\beta\) 一般取 0.9):

    \[ \begin{align*} v_t&=\beta * v_{t-1}+(1-\beta)* g_t^2 \\ \theta_t&=\theta_{t-1}- \frac{\sqrt{u_{t-1}+\epsilon}}{\sqrt{v_t+\epsilon}}g_t\\ u_t&=\beta * u_{t-1}+(1-\beta)*\Delta \theta_t^2 \\ \end{align*} \]

    Adadelta

RMSprop

RMSprop是为了解决 Adagrad 学习率急剧下降问题,与 Adadelta 的第1个形式相同(\(\beta\) 常取 0.9):

\[v_t=\beta * v_{t-1} + (1-\beta) * g_t^2 \]

\[\theta_t=\theta_{t-1} - \frac{\eta}{\sqrt{v_t+\epsilon}}*g_t \]

Adam

Adam 计算每个参数的自适应学习率,相当于 RMSprop + Momentum,并进行了偏差修正

因为 \(m_t\)\(v_t\) 被初始化为 0 向量,所以在刚开始迭代的时候是有偏的,需要进行偏差修正,修正系数分别为 \(1-\beta_1^t\)\(1-\beta_2^t\) ,随着迭代的进行(\(t\) 增加),估计逐渐变为无偏估计,修正强度逐渐降低为1。

\[\begin{align*} &m_t=\beta_1 * m_{t-1} + (1-\beta_1)*g_t \\ &v_t=\beta_2 * v_{t-1} + (1-\beta_2)*g_t^2 \\ &\hat{m}_t=\frac{m_t}{1-\beta_1^t} \\ &\hat{v}_t=\frac{v_t}{1-\beta_2^t} \\ &\theta_t=\theta_{t-1}-\eta*\frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon} \end{align*} \]

Adam

分子表示在过去一段时间内各分量的平均值,即梯度更新的大致走向,分母表示在过去一段时间内各分量的平均大小。相当于分两步走,第一步是确定一个合适的下降方向(即分子项),第二步,对这个选定的方向上的各个子方向做一下微调(分母项),这样,推进较快的子方向会慢下来,推进较慢的子方向会加快速度,动态调整了各个子方向的学习率。因此,Adam结合了Momentum和RMSprop两种算法的优点。

AdamW

Adam+权重衰减
AdamW_1
AdamW_2

posted @ 2024-08-27 09:06  Un-Defined  阅读(5)  评论(0编辑  收藏  举报