Life sucks, but you're gonna love it.

0%

Machine-Learning-2020| Lecture #2 New Optimization

这部分介绍的是对于当前大家在做深度学习用到的optimization的几种方法的总结介绍以及改进的方面。首先会介绍常用的几种optimization的方法,然后是对现行几种方法的总结和优劣势分析。

标注说明

  • $\theta_t$ 表示时刻 $t$ 的参数值。这个参数就是我们要训练的模型中的参数集合;
  • $\Delta L(\theta_t) / g_t$ 表示时刻 $t$ 参数的gradient,这个是我们在更新参数时需要用到的;
  • $m_t$ 表示截止到 $t$ 时刻,之前累积的 momentum的和
  • $\eta$ 表示学习率

常见的Optimization回顾

  • SGD(stochastic gradient descent)

    这里说的是随机梯度下降,也就是输入一个example之后就对这个example的梯度进行计算,然后根据公式

    表示模型中的参数会根据本次的梯度,在固定学习率$\eta$ 的状态下进行变化。

  • SGDM (stochastic gradient descent with momentum)

    这里说的是在之前随机梯度下降的基础上加上了对梯度的改进,也就是加上了Momentum对梯度的影响:

    这里若是将 $vt$ 带回第一个公式中,就变为 $\theta{t+1} = \theta{t}-\eta g_t + \lambda v{t-1}$, 和SGD的公式比起来,多加了一项 $\lambda v_{t-1}$ 这项是之前的momentum的历史。

  • Adagrad

    最理想的学习率的变化是在一开始学习的时候,学习率会比较大,这样的话可以减少寻找最佳位置的时间,但是随着我们寻找越接近最佳的点,学习率需要变小,这样的话不至于一步错过需要找寻的点。所以我们希望学习率会随着时间的变化减小,即 $\eta_t = \frac{\eta}{\sqrt{t+1}}$.

    但只做这点改变是不够的的,即使我们对学习率做了变化,它也是随着时间的变化。对于不同的参数,学习率的变化量仍旧是个定值。我们期望学习率能够在自己参数本身变化的情况下进行改变,也就是说有些参数变化的波动大,有些参数变化的波动小,我们希望学习率能根据参数本身做出变化。

    因此, 我们希望考虑过去所有计算过的梯度:

  • RMSProp

    当我们在进行Adagrad的时候,分母的梯度平方和会不停累计变大,如果在一开始我们遇到了一个比较大的梯度,那么会造成

    我们考虑的梯度变化公式为:

    如果将第二个式子带入梯度更新的式子中去,我们会得到:

    这样就可以得到,当 $\alpha$ 的值很小的时候,学习率的分母将会只记住和现在时刻离得比较近的梯度值,时间比较靠前的梯度值都被 $\alpha^n$ 给消去了。

  • Adam

    最后来说一下Adam,Adam是结合了SGDM 和 RMSProp的方法。

    主要的更新公式为:

    $m_t$ 的部分就是采用了之前SGDM对梯度的改变,而 $v_t$ 的部分采用的是RMSProp对学习率的改变。

对于SGDM和Adam的改进

在神经网络急速发展的现在,我们除了上述的几种optimization之外,还记过什么其他别的optimization的方法吗?有,但是很少。在计算机视觉任务中,我们常见到的就是Adam优化方法,和SGD优化方法。其他的很少见也很少尝试,那究竟是为什么呢?

因为SGDM和Adam占尽了先机。我们说,普通的梯度下降 $\theta{t+1} = \theta{t}-\eta g_t$, 在这其中,影响梯度下降的两个因素,一个就是学习率 $\eta$ 另一个就是 梯度 $g_t$。 SGD包括SGDM可以说是对梯度做了调整,而Ada-系是调整了学习率。所以这两种方法从两个方面改进了梯度下降时的自我调整水平。

但是SGDM和Adam分别有各自的优缺点:

  • SGDM在训练的时候下降比较慢,训练集上的精度没有Adam高,但是测试集上的精度会比较高
  • Adam在训练的时候下井比较迅速且精度较高,但是在测试时达到的精度不是很高。

那大家就像根据SGDM和Adam各自的优点和缺点来进行改进。

针对SGDM进行改进

针对Adam进行改进