To What Extent Can We Train Neural Networks

神经网络的训练算法起源于很简单的思路:使用梯度下降方法优化参数,使得代理函数在观测集上整体最小。这种朴素直接的思想就是神经网络优化算法的根源。这种算法被包含在各大深度学习框架中,并被广泛使用。

神经网络优化算法

标准的梯度下降算法的更新公式,根据损失函数$J(\theta)$更新$\theta$具有以下形式:
$$\theta = \theta - \alpha \nabla_{\theta} E[J(\theta)]$$
这是对全体观测数据-标签对的平均梯度进行估计,然后用这个梯度来更新参数$\theta$。随机梯度下降(SGD)只是简单地用minibatch梯度代替整体的梯度估计,一轮一轮地更新参数。在SGD中,典型的学习率$\alpha$的取值比批梯度下降要小得多,以便为最初的一轮提供一定的收敛性。通常使用minibatch进行训练时,需要将样本打乱,保证每个minibatch拥有不同的数据,避免不好的收敛性质。

如同其他的一阶方法一样,SGD在狭长的区域里收敛并不稳定。因为梯度方向与预期的下降方向不总是一样。SGD在遇到鞍点时下降也不是特别好。所以在SGD的基础上加入动量,试图通过之前minibatch与当前梯度的差异性,使得算法能摆脱这些问题点的影响。

变种方法

神经网络的训练过程充满艰险,每个参数都有可能掉入陷阱。借助启发式或者是有一定自动化的方法,能够帮助网络训练少走点弯路。于是出现了一些自适应的方法。

AdaGrad对每个参数更新都应用的不同的步长,步长取决于这个参数下降的历史。更新公式具有如下的形式:
$$w^{t+1} \leftarrow w^t - \frac{\eta}{\sqrt{\sum_{i=1}^t(g^i)^2}} g^t$$
随着训练的持续,每个参数的实际学习率会不断降低。

面对AdaGrad学习率下降过快的问题,引入RMSProp方法,该方法与AdaGrad的区别仅在于对累计梯度二阶矩的计算上。相比于AdaGrad的历史梯度
$$r\leftarrow r + g^Tg$$
RMSProp对历史进行了指数级衰减
$$r\leftarrow \rho r + (1-\rho) r$$。

Adam(Adaptive Moment Estimation, 自适应矩估计)对历史梯度进行了动量估计:
$$ g_t\leftarrow \nabla_{\theta} J(\theta_{t-1}) \\
m_t\leftarrow \beta_1 \cdot m_{t-1} + (1-\beta_1)\cdot g_t \\
v_t\leftarrow \beta_1 \cdot v_{t-1} + (1-\beta_1)\cdot g_t^2 \\
\hat{m_t}\leftarrow m_t / (1-\beta_1^t) \\
\hat{v_t}\leftarrow v_t / (1-\beta_2^t) \\
\theta_t\leftarrow \theta_{t-1} - \alpha \cdot \hat{m_t} / ( \sqrt{\hat{v_t} + \epsilon} ) $$
其中$\hat{m}$与$\hat{v}$是对一阶矩与二阶矩的无偏估计。

通常在视觉与语音这类包含大量稀疏特征的情景下,采用Adam能取得不错的效果。通常$\beta_1$取0.9,$\beta_2$取0.999。

其它加速训练的策略

打乱数据和课程学习

基于minibatch的梯度下降算法具有一个特性:利用每一个minibatch的平均梯度方向来近似全局梯度方向。可以想象到,每个minibatch(批次)的梯度总是会有少许不同。在同一轮训练结束前,总有一些训练集中的数据没有输入到网络中进行训练。如果连续若干个批次数据趋同,那么网络参数会先向局部最优的方向前进好几轮。显然,没有打乱的数据会极大影响参数优化的路径——一条弯路。

用于训练神经网络的数据质量总是参差不齐的,尽管这些模型对数据噪声有不错的抗性,但是这仍然影响网络训练的收敛效率和性能。如果将高质量地数据筛选出来,那么网络又将面临数据不足的问题。如何用不同质量的数据,找到一个更好的模型呢?课程学习(Curriculum Learning)由此引入。这项技术将“简单”的样本在训练过程中自动识别出来,并加大简单样本的权重,用来使网络快速收敛。然后再用那些困难(潜在的低质量)数据来训练网络。这也是一种不错的策略。

批归一化

批归一化(Batch Normalization, BN)是一种用于改善网络梯度方向的策略。由于深度神经网络在每一层的输出未必总是均值为0,方差为1。它作为下一层的输入为下一层的训练带来了不好的性质,并且这种偏差随着网络变深会被放大。不好的均值和方差会导致网络参数收敛变慢,引入BN层可以将每层的输入以批次为单位进行归一化后求解梯度,使得参数训练更快。

梯度爆炸与梯度衰减

网络得梯度问题会影响网络的训练,尤其是深层的神经网络,这种问题一旦出现就会被放大。观察网络某一层的计算:
$$ y = z(w^Tx) $$
其中$z$是激活函数,$w$是参数,$x$是上一层的输入。此时有该层参数的梯度:
$$ \frac{\partial y}{\partial w} = \frac{\partial z}{\partial w^Tx} \frac{\partial w^Tx}{\partial w} = \frac{\partial z}{\partial w^Tx} x$$
观察到$x$实际上是上一层的输出,在对上一层计算梯度时,我们需要用链式法则,所以会包含项
$$ G = \frac{\partial y}{\partial x} = \frac{\partial z}{\partial w^Tx} \frac{\partial w^Tx}{\partial x} = \frac{\partial z}{\partial w^Tx} w$$
所以让我们来总结一下,求导过程中,由于链式法则,所以需要包含本地梯度项$G$。如果$G$普遍小于1,那么会出现梯度消失的现象,如果$G$普遍大于1,那么就会梯度爆炸。

造成梯度问题的原因就在$G$项的两项中:激活函数或者是权重初始化。

不好的激活函数和不好的层输入会导致梯度饱和,比如Sigmoid输入过大或过小的话,激活函数的导数$z’(x)$就会过小,导致$G$过小。

不好的权重$w$的初始化也可能造成梯度问题。过大的$w$使得梯度爆炸,过小的$w$使得网络激活不足,使得$\frac{\partial y}{\partial w}$项和$G$项均过小。

通常,深度神经网络的初始化要保证每一层的参数方差为1,均值相对较小。考虑到由链式求导法则带来的均值和方差的弥散/收缩,方差过大/过小都会导致前推/反向传播时数值方差的剧烈变动。

如果你的网络训练很不稳定,可以试图检查每一层激活、权重的均值和方差。使用ReLU与He Initialization可以缓解梯度问题的发生。

收敛性与泛化性能评估

事实上,神经网络通常包含海量的参数,参数空间中的代理损失函数情况极其复杂。在采用基于minibatch的优化方法时,需要注意的是,学习率一定的情况下,当网络不收敛的时候,说明到达了一个极小值区域——你的网络参数总是在该区域徘徊,因为minibatch的梯度与全局梯度并不完全一致。

此时的你应当考虑降低学习率了。通常,在损失进入平坦区后,将学习率缩小为原来的2到10分之一都会有继续下降的空间。但这是否意味着你应该继续去训练你的网络呢?

验证集,泛化性能与早停

从数学上严格证明一个参数达到数百兆的模型,拥有一个怎样的泛化界,或者是怎样的决策界,是一件困难的事情。往往更多参数的模型拥有更高的VC维,需要更多的数据对模型进行约束。然而数据总是有限的,面对复杂的任务,数据不足导致我们无法无限制地提高模型的泛化性。

好在对于复杂的模型,我们有办法来评估它的泛化性能,而不需要一个严格的界限。使用验证集。当验证集的损失与训练集损失相差甚远时,往往说明我们的模型有过拟合的问题。验证集损失提供了一个指标,帮助我们了解模型的训练是否“过于好”了。训练集和验证集loss的差距我们称为“泛化误差”(Generalization Gap),小的泛化误差意味着较好的泛化性能,如果随着训练集loss的下降,泛化误差不断提高,那么我们就可以考虑停止训练我们的模型了,因为更小的训练集loss并不能让网络学习到“有用的”“真实的”自然数据分布上的知识,而只是在寻找训练集中独有的特征。

数据增广

数据增广是一种生成真实数据集上的样本的手段。这里以图像数据为例子。

由灰度向量表示的图像并不是一个好的数据表示形式。比如在自然图像分类的任务上,我们可以生成体积庞大的噪声图像,但是这种图像是没有意义的。所以向量表示的图像不够紧凑,拥有冗余。但是我们观察到,对图像进行的某些简单的变换输出的仍然是我们想要的分布上的图像——放大、缩小、旋转、翻转、亮度和色度的微小变化、偶尔的模糊。这些都不影响人类理解这副图像。经验和直觉告诉我们,这种方法输出的图像仍然是我们想要的数据分布上的样本。

传统数据增广保证标签的正确性的同时,产生同数据分布上的不同数据,可以有效克服数据不足过早产生的泛化误差增大的现象,增强模型的泛化性能。

保证你feed进网络的数据足够丰富,可以提升你的模型的效果。

走得更远

研究过程中,我们总是想提出一些“万能”的方法,在所有数据集上都取得更好的效果。然而,提升效果的第一步是正确地训练模型。一是正确训练的模型能提供一个良好的baseline,避免在测试新模型时错误地将不显著地结果当作显著结果;二是这样能节约不少在模型调参上的时间,先做好trouble-shooting,少走一半弯路。

参考资料

  1. Stochastic Gradient Descent - Wikipedia
  2. Bottou, Léon (1998). “Online Algorithms and Stochastic Approximations”. Online Learning and Neural Networks. Cambridge University Press. ISBN 978-0-521-65263-6
  3. An overview of gradient descent optimization algoritms, Arxiv, Sebastian Ruder’s Blog
  4. Optimization: Stochastic Gradient Descent - UFLEL Tutorial
  5. Bengio, Y., Louradour, J., Collobert, R., & Weston, J. (2009, June). Curriculum learning. In Proceedings of the 26th annual international conference on machine learning (pp. 41-48). ACM.