译者 | 黄小凡
来源 | 云溪社区
自1994年开始,大家都认为深度神经网络难以训练的原因是由于梯度消失,然而本文作者通过深度线性网络的例子证明网络性能变差的原因并不是梯度消失,而是由于权重矩阵的退化导致模型的有效自由度减少,从而使得深度神经网络难以训练。
在这篇文章中,我将解释在深度神经网络训练中一个常见的误解。似乎大家都认为,训练深度神经网络很难的原因主要是因为梯度消失(或爆炸)的问题。“梯度消失”是指通过隐藏层从后向前看,梯度会变的越来越小。这也意味着,前面层的学习会显著慢于后面层的学习,所以学习会卡住,除非梯度变大。这个想法至少可以追溯到Bengio等人(1994年),如今这仍然被用于解释为什么很难训练深度神经网络。
我们首先考虑一个简单的情景:训练一个深度线性网络学习一个线性映射。从计算的角度来看,深度线性网络并不令人感兴趣,但是Saxe等人?(2013)认为,在线性网络学习仍然可以提供有关非线性网络学习的信息。因此,我们从这个简单的场景开始。下图是30层网络的学习曲线和初始梯度范数。
这些结果在图中标记为“Fold 0”。这里的梯度是关于层激活值的,网络权重通过进行初始化。训练损失开始时迅速下降,但不会消失(或爆炸),随后达到一个稳定的次优值。随着训练的进展,他们变得越来越小,但是这是可以预料的,而且从某种意义上说,这里的梯度“太小”并不清楚:
为了说明收敛到局部最优解的现象和梯度范数的大小本身没有任何关系,现在我将介绍一个会增加梯度范数的方法,但会恶化性能。如下图(蓝色):
那么,我做了什么?我只是简单地改变了初始化。原始网络中的每个初始权重矩阵是一个64X64的矩阵(使用标准初始化进行初始化)。在以蓝色显示的网络中,我将每个初始权重矩阵的前半部分复制到后半部分(初始权重矩阵被“Fold”一次,所以我将它们表示为“Fold 1”网络)。这降低了初始权重矩阵的秩,并使其更加退化。请注意,这种运算仅
应用于初始权重矩阵,并没有加上其它对学习过程的约束,训练过程将保持不变。以下是梯度范数经过训练之后的效果:
这个方法总体上增大了梯度范数,但是性能明显变差了。接下来我将介绍另一种缩小梯度范数,但会大大提高性能的方法。这里是(绿色):
这种新的方法将权重矩阵初始化为正交。正交矩阵是固定(Frobenius)范数的矩阵中退化程度最低的,其中退化度可以用不同的方式来衡量,例如奇异值小于给定常数的比例。以下是梯度范数经过训练之后的效果:
如果梯度范数的大小不是训练困难的原因,那原因是什么呢?答案是模型的退化总体上决定了训练性能。为什么退化会损害训练性能?因为参数空间中学习的退化速度大大减慢,导致减少了模型的有效维数,就像上面的例子一样。所以,上面的“Fold 0”网络和“Fold 1”网络虽然梯度范数值很好,但网络的可用自由度对这些梯度范数的贡献极其不均衡:绝大多数(退化的)自由度根本没有任何贡献。正如 Saxe 等人的论文表明,随着相乘矩阵的数量(即网络深度)的增加,这种矩阵的乘积变得越来越退化。这里分别是1层,10层和100层网络的一个例子:
随着深度的增加,积矩阵的奇异值变得越来越集中0。这个结果不仅与线性网络有关,类似的事情也发生在非线性网络中:随着深度的增加,给定层中隐藏单元的维度变得越来越低维化,即越来越退化。事实上,在有硬饱和边界的非线性网络中(例如 ReLU 网络),随着深度增加,退化过程会变得越来越快。Duvenaud 等人 2014 年的论文里展示了关于该退化过程的可视化:
随着深度的增加,输入空间(左上角所示)会在输入空间中的每个点处被扭曲成越来越细的单丝,只有一个与细丝正交的方向影响网络的响应。沿着这个方向,网络实际上对变化变得非常敏感。
最后,在这一点上,我忍不住要提起我的论文。在本文中,通过一系列的实验,我认为退化问题严重地影响了非线性网络的训练,采用跳过连接(ResNet 中采用的重要方法)的方式训练深度网络可以打破这种退化。我怀疑像Batch Normalization或 layer normalization等方法除了其他潜在的独立机制外(如减少最初提出的内部变量转换),在一定程度上是通过类似的打破退化机制训练深层网络的。众所周知,分裂归一化是一种有效处理隐藏单元响应的方法,而这也可以被看作是一种打破退化的机制。