深度学习的各种优化方法
- 优化方法就是一种能够帮助我们最小化或最大化目标函数(损失函数)的一类方法
- 一个好的优化方法往往能更加高效。更加精确的训练模型的内参
优化算法的种类
- 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的方法能更快收敛