深度神经网络训练中的快速优化器与学习率规划
立即解锁
发布时间: 2025-09-03 00:41:42 阅读量: 8 订阅数: 45 AIGC 

# 深度神经网络训练中的快速优化器与学习率规划
## 1 引言
在深度神经网络的训练过程中,当网络规模非常大时,训练速度可能会变得极其缓慢。为了加速训练并获得更好的解决方案,我们可以采用多种方法,如良好的连接权重初始化策略、合适的激活函数、批量归一化以及复用预训练网络的部分内容。此外,使用比普通梯度下降优化器更快的优化器,也能显著提升训练速度。接下来,我们将介绍一些常见的优化器。
## 2 快速优化器介绍
### 2.1 动量优化(Momentum Optimization)
动量优化的灵感来源于保龄球在轻微倾斜的光滑表面上滚动的过程。保龄球起初滚动缓慢,但很快会加速,直至达到最大速度。而传统的梯度下降则是沿着斜坡缓慢而规律地前进,到达终点所需的时间更长。
传统梯度下降更新权重的公式为:$\theta \leftarrow \theta - \eta\nabla_{\theta}J(\theta)$,它没有考虑之前的梯度信息。如果局部梯度非常小,它的前进速度就会很慢。
动量优化则非常关注之前的梯度:在每次迭代中,它将局部梯度从惯性向量 $m$ 中减去(乘以学习率 $\eta$),然后通过简单地加上这个惯性向量来更新权重 $\theta$。公式如下:
1. $m \leftarrow \beta m - \eta\nabla_{\theta}J(\theta)$
2. $\theta \leftarrow \theta + m$
为了模拟摩擦并防止速度过快,该算法引入了一个新的超参数 $\beta$,称为惯性(momentum),其值应介于 0(高摩擦)和 1(无摩擦)之间,常用值为 0.9。
如果梯度保持不变,最终速度(即权重更新的最大幅度)等于该梯度乘以学习率 $\eta$ 再乘以 $1/(1 - \beta)$。例如,当 $\beta = 0.9$ 时,最终速度是梯度乘以学习率的 10 倍,这意味着动量优化比梯度下降快达 10 倍。它能够更快地跳出虚假平坦区域,尤其在输入尺度差异较大的情况下,函数的代价看起来像一个细长的碗,梯度下降在陡峭斜坡上下降较快,但在山谷中下降则需要很长时间,而动量优化则会越来越快地向山谷底部前进,直至到达最优解。
不过,由于惯性的存在,优化器有时可能会走过头,然后返回,再走过头,多次振荡后才会稳定在最小值处。因此,在系统中设置一定的摩擦是有益的,它可以避免这些振荡,加速收敛。
在 Keras 中实现动量优化非常简单,只需使用 SGD 优化器并设置其 momentum 超参数即可:
```python
optimizer = keras.optimizers.SGD(lr=0.001, momentum=0.9)
```
动量优化的缺点是增加了一个需要调整的超参数,但在实践中,0.9 这个值通常效果较好,几乎总能比梯度下降更快。
### 2.2 涅斯捷罗夫加速梯度(Nesterov Accelerated Gradient,NAG)
涅斯捷罗夫加速梯度是动量优化的一个小变体,通常比原始版本更快。它不是在当前位置 $\theta$ 处测量代价函数的梯度,而是在惯性方向上稍微向前的位置 $\theta + \beta m$ 处测量梯度。公式如下:
1. $m \leftarrow \beta m - \eta\nabla_{\theta + \beta m}J(\theta)$
2. $\theta \leftarrow \theta + m$
由于惯性向量通常指向最优解的方向,因此在这个方向上稍微向前测量梯度会更准确。随着时间的推移,这些小的改进会累积起来,使得 NAG 比普通的动量优化快得多。此外,当惯性推动权重穿过山谷时,普通动量优化的梯度会继续推动穿过山谷,而 NAG 的梯度会将权重推回山谷底部,从而减少振荡,更快地收敛。
在 Keras 中使用 NAG 很简单,只需在创建 SGD 优化器时指定 `nesterov=True`:
```python
optimizer = keras.optimizers.SGD(lr=0.001, momentum=0.9, nesterov=True)
```
### 2.3 AdaGrad
考虑细长碗的问题,梯度下降首先会快速沿着最陡峭的斜坡下降,但这个方向并不直接指向全局最优解,然后它会缓慢地向山谷底部前进。AdaGrad 算法通过减小最陡峭维度上的梯度向量来解决这个问题。
算法步骤如下:
1. $s \leftarrow s + \nabla_{\theta}J(\theta) \otimes \nabla_{\theta}J(\theta)$
2. $\theta \leftarrow \theta - \frac{\eta}{\sqrt{s + \epsilon}} \odot \nabla_{\theta}J(\theta)$
第一步将梯度的平方累积到向量 $s$ 中,即对于向量 $s$ 的每个元素 $s_i$,$s_i \leftarrow s_i + (\frac{\partial J(\theta)}{\partial \theta_i})^2$。如果代价函数在第 $i$ 个维度上有陡峭的斜坡,那么 $s_i$ 在每次迭代中都会增加。
第二步与梯度下降类似,但梯度向量会被 $\sqrt{s + \epsilon}$ 减小。$\epsilon$ 是一个平滑项,用于避免除以零,通常取值为 $10^{-10}$。
AdaGrad 算法逐渐降低学习率,并且在陡峭维度上的降低速度比平缓维度上更快,因此具有自适应学习率的特点。这使得更新结果更直接地指向全局最优解,并且对学习率超参数 $\eta$ 的调整要求较低。
然而,AdaGrad 在训练神经网络时往往过早停止,因为学习率下降得太快,导致算法在到达全局最优解之前就完全停止。因此,虽然 Keras 提供了 Adagrad 优化器,但不建议用于训练深度神经网络,不过它对于一些简单任务,如线性回归,仍然可能有效。
### 2.4 RMSProp
AdaGrad 的缺点是收敛速度过快,最终无法收敛到全局最优解。RMSProp 算法通过仅累积最近迭代的梯度(而不是从训练开始的所有梯度)来解决这个问题。它在第一步使用指数移动平均:
1. $s \leftarrow \beta s + (1 - \beta)\nabla_{\theta}J(\theta) \otimes \nabla_{\theta}J(\theta)$
2. $\theta \leftarrow \theta - \frac{\eta}{\sqrt{s + \epsilon}} \odot \nabla_{\theta}J(\theta)$
衰减率 $\beta$ 通常固定为 0.9,这是一个新的超参数,但默认值通常适用,很少需要调整。
在 Keras 中使用 RMSProp 优化器的代码如下:
```python
optimizer = keras.optimizers.RMSprop(lr=0.001, rho=0.9)
```
除了非常简单的问题,RMSProp 优化器的性能几乎总是优于 AdaGrad。在 Adam 优化器出现之前,它是许多研究人员首选的优化算法。
### 2.5 Adam 和 Nadam 优化
Adam(Adaptive Moment Estimation)结合了动量优化和 RMSProp 的思想。它像动量优化一样维护梯度的指数移动平均,像 RMSProp 一样维护过去梯度平方的指数移动平均。算法步骤如下:
1. $m \leftarrow \beta_1 m + (1 - \beta_1)\nabla_{\theta}J(\theta)$
2. $s \leftarrow \beta_2 s + (1 - \beta_2)\nabla_{\theta}J(\theta) \ot
0
0
复制全文
相关推荐










