0%

深度学习的各种优化方法

深度学习的各种优化方法

  • 优化方法就是一种能够帮助我们最小化或最大化目标函数(损失函数)的一类方法
  • 一个好的优化方法往往能更加高效。更加精确的训练模型的内参

优化算法的种类

  • 1、一阶优化方法:常用
  • 2、二阶优化方法:计算量大,不常用

各种梯度下降法

1、Gradient Descent

梯度下降法是很多其他方法的基础
$$
\theta=\theta-\eta\Delta J(\theta)
$$

  • $J(\theta)$是整个数据集上进行计算得到的
  • 由于算的是整个数据集上的均值,所以更新的非常慢

2、随机梯度下降(SGD)

$$
\theta=\theta-\eta\Delta J(\theta;x_i;y_i)
$$

  • 随机梯度下降每次值更新一对样本
  • 因此模型更新的非常平凡,参数就会变成高方差,损失函数的波动也会有很大强度的波动—->这样或许有时候能波动到更好的局部极值点,但是模型的收敛很不稳定

3、Mini Batch Gradient Descent

  • 采用了上面两个方法的折中办法,计算loss的时候基于一个batch

$$
\theta = \theta - \eta * \frac{1}{B}\sum_{i=1}^BJ(\theta;x_i;y_i)
$$

  • 显然效果较好于上两者,使用广泛
  • 不过难以选择一个合适的学习率

4、动量法Momentum

  • 使用momentum可以减少mini-batch在更新中的震荡

  • momentum考虑了过去梯度方向以平滑更新,我们将先前收敛的方向储存在变量v中,形式上是先前梯度的指数加权平均

这里写图片描述

  • 红点表示使用动量,蓝点表示未使用动量。我们让梯度调整v的方向

动量momentum公式

$$
\begin{cases}
v_t=\gamma v_{t-1}+\eta \nabla_{\theta} J(\theta)\
\theta=\theta-v_t
\end{cases}
$$

  • 类似的有一个惯性加速度

NAG(Nesterrov accelerated gradient)

  • 我们并不满足于只有加速度,我们想不仅有加速度,而且这个加速度能在梯度上倾的时候放慢速度

$$
v_t=\gamma v_{t-1}+\eta \nabla_{\theta}J(\theta-\gamma v_{t-1})\
\theta = \theta -v_t
$$

  • 有对加速度求导的意味,防止速度变大或变小过快

Adagrad

  • 思路:让学习率自适应与参数
    • 对低频参数大幅更新,对高频参数小幅更新
    • 所以,非常适合于处理稀疏数据

$g_{t,i}$表示损失函数中参数$\theta_i$在时刻t的梯度
$$
g_{t,i}=\nabla_{\theta}J(\theta_i)\
SGD:\theta_{t+1,i}=\theta_{t,i}-\eta \cdot g_{t,i}\
Adagrad:\theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{G_{t,i,i}+\epsilon}}\cdot g_{t,i}
$$

  • $G_t \in \R^{d*d}$是一个对角矩阵,其中每个对角元素(i,i)是参数$\theta_i$到时刻t为止所有时刻梯度的平方之和,$\epsilon$是平滑项(避免分母为0)【有趣的是,不用平方根操作,算法性能会变弱很多“雾”】

  • 由于$G_t$的对角包含着所有参数过去时刻的平方之和,我们可以通过在$G_t$和$g_t$执行element-wise来向量化我们的操作

$$
\theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{G_t+\epsilon}}\circ g_t
$$

  • $g_t$左边的哪个就相当于参数自己的学习率
  • 假如之前的梯度很小,那么学习率会变大,之前梯度很大反之
  • 缺点:在模型训练的中后期,分母的梯度累加会变大,从而梯度接近0,提前结束

Adadelta

  • 缓解adagrad的学习率单调递减的问题

    • adadelta不是对过去所有的梯度累加,而是只加上一个对应的w区间的梯度

    • 累加梯度的时候使用decaying average
      $$
      E[g^2]t=\lambda E[g^2]{t-1}+(1-\lambda)g_t^2
      $$

      • decaying average能缓解累加变大问题,类似Q learning中的方法

Adam

  • Adam是根据上述方法而提出的:对于每个参数,不仅仅有自己的学习率,还有自己的momentum,在训练时,每个参数不仅有独立性,还更加稳定

$$
v(t)=\rho_1v(t-1)+(1-\rho_1)\Delta J(\theta)\
g_t=\rho_2 g_{t-1}+(1-\rho_2)\Delta J(\theta)^2\
\hat v(t)=\frac{v(t)}{1-\rho_1}\
\hat g_t=\frac{g_t}{1-\rho_2}\
\theta_t = \theta_{t-1}-\frac{\eta}{\sqrt{\hat g_t+\epsilon}}\cdot \hat v(t)
$$

  • 系数的数据,带a的优化方法表现更好,非常复杂的神经网络,带a的方法能更快收敛