Deep Learning Note: 2-4 优化算法

1. 小批量梯度下降

  前文 给出的向量化计算 $m$ 个样本的梯度下降和反向传播的方法,通过将所有 $m$ 个样本水平叠加,得到:

\begin{equation}
X = \begin{bmatrix}x^{(1)} & x^{(2)} &…&x^{(m)} \end{bmatrix}
\end{equation}

使用 $X$ 一次性计算全部样本,得到的网络输出 $Y$ 为 $m$ 个样本输出水平叠加的结果:

\begin{equation}
Y = \begin{bmatrix}y^{(1)} & y^{(2)} &…&y^{(m)} \end{bmatrix}
\end{equation}

  向上面那样,在梯度下降的每一次迭代中都计算全部样本,称为批量梯度下降(Batch Gradient Descent)。当样本数量 $m$ 非常大时,计算全部样本非常耗时,导致梯度下降的每一次迭代都很慢。

  小批量梯度下降(Mini-Batch Gradient Descent)通过将整个样本集合分割为若干个小批量,梯度下降的每次迭代都只计算一个小批量的样本,可以缩短梯度下降每次迭代的时间,加快学习速度。

  例如对于有 500 万个样本的训练集,按照每个小批量 5000 个样本,可以划分为 1000 个小批量,即:

\begin{equation}
X = \begin{bmatrix}X^{\{1\}} & X^{\{2\}} &…& X^{\{1000\}}\end{bmatrix} \\
Y = \begin{bmatrix}Y^{\{1\}} & Y^{\{2\}} &…& Y^{\{1000\}}\end{bmatrix}
\end{equation}

其中 $X^{\{i\}}$ 、$Y^{\{i\}}$ 表示一个小批量,例如:
\begin{equation}
X^{\{1\}} = \begin{bmatrix}x^{(1)} & x^{(2)} &…&x^{(5000)} \end{bmatrix} \\
Y^{\{1\}} = \begin{bmatrix}y^{(1)} & y^{(2)} &…&y^{(5000)} \end{bmatrix}
\end{equation}

  小批量梯度下降的计算过程如下:

\begin{align}
for \; & t=1 \; to \; T: \\
& 计算前向传播,即 X^{\{t\}} 的输出 \hat{Y}^{\{t\}} \\
& 计算代价函数,即 \hat{Y}^{\{t\}} 产生的代价 \\
& 计算反向传播,更新参数 \\
\end{align}

上面 $T$ 为小批量的数量,即遍历所有小批量,在每个小批量上进行梯度下降。完整执行一次上面的流程,称为一个 Epoch,表示完整遍历了一遍训练集。再通过对整个训练集的迭代,不断进行梯度下降,找到最佳的参数。可见,批量梯度下降遍历一遍训练集只能完成一步梯度下降,而小批量梯度下降遍历一遍训练集可以完成 $T$ 步梯度下降。

  使用批量梯度下降时,代价函数的值随迭代次数单调递减,如图 1 左图。而使用小批量梯度下降时,代价函数的值不一定会随着迭代的小批量数量的增加而单调递减,而是会出现一些噪声,如图 1 右图,因为每一个最小批的数据不同,对某一个小批量的优化不一定适用于下一个小批量,但整体趋势上,代价函数还是逐渐下降的。

图 1

图 1

  使用小批量梯度下降时,需要选择合适的小批量的大小。当小批量大小与样本相同时,只有一个小批量,得到的就是批量梯度下降,当数据量很大时,批量梯度下降每个迭代的计算会很慢;当小批量大小为 1 时,每一个样本都是一个小批量,此种算法称为随机梯度下降(Stochastic Gradient Descent),因为每个最小批只有 1 个样本,丧失了向量化带来的计算性能提升(随机梯度下降的过程会有很大噪声,即每次梯度下降的方向有一定随机性,但可以通过降低学习速率来弥补)。在实际应用中,需要选择适中的最小批大小,既可以从向量化中得到性能提升,又可以提高迭代和梯度下降的速度,以得到最快的学习速度。

  选择小批量大小的方式是:如果训练集比较小,比如小于 2000 个样本,则直接使用批量梯度下降。对于较大的训练集,小批量大小的典型值为 64 到 512,通常选择 2 的指数,即 64、128、256、512。此外还要确保一个最小批的数据能被内存存储,避免在一个最小批的计算中发生硬盘读写。小批量大小也是一个超参数,可以通过测试不同的大小,找到使梯度下降效率最高的数值。

2. 动量梯度下降

  动量梯度下降(Gradient Descent with Momentum)使用梯度的指数加权平均(Exponentially weighted Average)来更新参数,其性能通常会优于传统的梯度下降算法。

  梯度下降的过程中,可能会如图 2 所示,经过多次反复的震荡,最后到达最佳点。

图 2

图 2

  在动量梯度下降算法中,对于每一次迭代,首先计算参数的偏导 $dW$、$db$,然后计算二者的指数加权平均 $V_{dW}$、$V_{db}$,并使用 $V_{dW}$ 和 $V_{db}$ 来更新参数 $W$ 和 $b$,即:

\begin{align}
在第 \; t \; &次循环: \\
& 计算当前小批量的 \; dW \; 和 \; db\\
& V_{dW} := \beta V_{dW} + (1 – \beta)dW \\
& V_{db} := \beta V_{db} + (1 – \beta)db \\
& W := W – \alpha V_{dW} \\
& b := b – \alpha V_{db}
\end{align}

  使用参数偏导的指数加权平均来更新参数,可以让梯度下降更平缓。如图 3 所示,垂直方向的震荡被抵消,而水平方向的运动被累积,可以更顺畅地抵达最佳点。

图 3

图 3

  指数加权平均有两个超参数,学习率 $\alpha$ 和指数加权平均的参数 $\beta$。通常取 $\beta = 0.9$,相当于平均最近的 10 次迭代(使用 $\frac{1}{1 – \beta}$ 计算)。通常不会在计算指数加权平均时进行偏差修正,即计算:

\begin{equation}
V_{dW} := \frac{V_{dW}}{1-\beta^t}
\end{equation}

因为训练的迭代次数往往很大,比如使用 $\beta = 0.9$,只要经过 10 次迭代,平均值就已经预热,不再需要修正。

3. RMSprop

  RMSprop 全称为 Root Mean Square Prop,其计算过程为:

\begin{align}
在第 \; t \; &次循环: \\
& 计算当前小批量的 \; dW \; 和 \; db\\
& S_{dW} := \beta S_{dW} + (1 – \beta)(dW ** 2) \\
& S_{db} := \beta S_{db} + (1 – \beta)(db ** 2) \\
& W := W – \alpha \frac{dW}{\sqrt{S_{dW}}} \\
& b := b – \alpha \frac{db}{\sqrt{S_{db}}}
\end{align}

上式中 $dW ** 2$ 和 $db ** 2$ 分别表示 $dW$ 和 $db$ 逐元素的平方。

  仍以图 2 所示的梯度下降过程为例,假设图中水平方向表示参数 $W$,垂直方向表示参数 $b$,由图可见,在垂直方向,即 $b$ 的方向存在震荡,我们希望降低 $b$ 方向上的速度,加快 $W$ 方向上的速度。

  对应于上面 RMSprop 的计算过程,若水平方向的变化较小,即 $dW$ 较小,则 $S_{dW}$ 较小,$W$ 的更新较大,有利于加快在 $W$ 方向的前进;若垂直方向上的变化较大,即 $db$ 较大,则 $S_{db}$ 较大,$b$ 的更新较小,有利于减慢在 $b$ 方向的前进。由此就达到了我们降低 $b$ 方向上的速度,加快 $W$ 方向上的速度的目的。此时可以选择较大的学习率,而不必担心在垂直方向上出现发散。

  在实现中,$S_{dW}$ 和 $S_{db}$ 可能很小,为了保证数值稳定性,会在计算其平方根时加上一个很小的值 $\epsilon$,例如 $10^{-8}$,防止分母接近于零的情况,即:

\begin{equation}
W := W – \alpha \frac{dW}{\sqrt{S_{dW}} + \epsilon} \\
b := b – \alpha \frac{db}{\sqrt{S_{db}} + \epsilon}
\end{equation}

4. Adam 优化算法

  Adam 的全称为 Adaptive Moment Estimation,它结合了动量和 RMSprop,适用性很强,对各种结构的网络都具有很好的性能,其过程为:

\begin{align}
初始 & 化 \; V_{dW} = 0, \; S_{dW} = 0, \; V_{db} = 0, \; S_{db} = 0 \\
在第 & \; t \; 次循环: \\
& 计算当前小批量的 \; dW \; 和 \; db\\
& V_{dW} := \beta_1 V_{dW} + (1 – \beta_1)dW \\
& V_{db} := \beta_1 V_{db} + (1 – \beta_1)db \\
& S_{dW} := \beta_2 S_{dW} + (1 – \beta_2)(dW ** 2) \\
& S_{db} := \beta_2 S_{db} + (1 – \beta_2)(db ** 2) \\
& V_{dW}^{corrected} := \frac{V_{dW}}{1 – \beta_1^t} \\
& V_{db}^{corrected} := \frac{V_{db}}{1 – \beta_1^t} \\
& S_{dW}^{corrected} := \frac{S_{dW}}{1 – \beta_2^t} \\
& S_{db}^{corrected} := \frac{S_{db}}{1 – \beta_2^t} \\
& W := W – \alpha \frac{V_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}} + \epsilon} \\
& b := b – \alpha \frac{V_{db}^{corrected}}{\sqrt{S_{db}^{corrected}} + \epsilon}
\end{align}

Adam 的典型实现中会对指数加权平均进行了误差修正,即上面的 $V_{dW}^{corrected}$、$V_{db}^{corrected}$、$S_{dW}^{corrected}$、$S_{db}^{corrected}$。$V$ 和 $S$ 分别代表了梯度下降过程中的两个 Moment,即 Adam 名称中的 “m”。

  Adam 优化算法中包含众多的超参数:

  • 学习率 $\alpha $:通常需要调优
  • 指数加权平均参数 $\beta_1$:通常取 $0.9$
  • 指数加权平均参数 $\beta_2$:Adam 的作者建议取 $0.999$
  • $\epsilon$: Adam 的作者建议取 $10^{-8}$,这个参数对性能没什么影响

  在实际训练中,通常选择默认的 $\beta_1$、$\beta_2$、$\epsilon$,并尝试一系列的 $\alpha$,只对 $\alpha$ 进行调优。

5. 学习率衰减

  学习率衰减(Learning Rate Decay)指的是在训练过程中逐渐减小学习率 $\alpha$。在训练的初始阶段,可以使用较大的学习率,提高学习速度,但随着训练的进行,梯度下降逐渐接近最优点,较大的学习率可能导致梯度下降越过最优点,在最优点附近震荡,不会收敛。因此需要随着训练的进行,逐渐降低的学习率,使得梯度下降能够收敛到一个较小的范围。

  一种学习率衰减的方法是:

\begin{equation}
\alpha = \frac{1}{1 + decay\_rate * epoch\_num} \alpha_0
\end{equation}

上式中 $decay\_rate$ 为衰减率,是一个需要调优的超参数;$epoch\_num$ 为当前迭代的 Epoch 数量,一个 Epoch 为完整遍历一遍训练集;$\alpha_0$ 为初始学习率。

  还可以使用如下的指数衰减的方式:

\begin{equation}
\alpha = \beta^{epoch\_num} \alpha_0
\end{equation}

上式中 $\beta$ 是一个小于 1 的数,比如 0.95。

  此外,常用的衰减方式还有:

\begin{equation}
\alpha = \frac{k}{\sqrt{epoch\_num}} \alpha_0
\end{equation}

或者:

\begin{equation}
\alpha = \frac{k}{\sqrt{minibatch\_num}} \alpha_0
\end{equation}

上面两式中 $k$ 是一个常数,$minibatch\_num$ 是迭代的小批量数量。

  此外还可以使用离散的学习率,即为不同的迭代次数区间设置不同的学习率。有时如果训练的模型数量不多,且训练时间比较长,也会使用手动衰减,即人工监测学习的进度,在训练过程中手动调整学习率。

6. 局部最优问题

  在深度学习领域早期,人们往往会担心优化算法陷入了很差的局部最佳,例如像图 4 所示的情况,有很多局部最佳点(蓝点),优化算法很容易陷入局部最佳,而无法抵达全局最佳(红点)。

图 4

图 4

  但上面的理解是片面的。图 4 为了方便绘图,只有两个参数,而实际问题中会涉及非常多的参数,比如有 20000 个参数,对于通过梯度下降找到的梯度为 0 的点,如果该点是一个局部最佳点,则要求所有 20000 个参数在该处都是凹函数,且得到极小值,这是一个很小概率的事件。实际情况是,通过梯度下降找到的点,一些参数在该出是凹函数,取得极小值,另一些函数在该处是凸函数,取得极大值,通过梯度下降找到的点是一个鞍点(Saddle Point),如图 5 中红点。

图 5

图 5

  在训练过程中,停滞区(Plateau)会影响学习的速度。停滞区指的是偏导为 0 的一大片区域,如图 6 所示,由于梯度很小,梯度下降算法在停滞区内缓慢移动。一些更复杂的算法,比如 Adam,可以加速在停滞区内的移动速度,尽早脱离停滞区的影响。

图 6

图 6