【译】RNN的正交初始化insight

【译】RNN的正交初始化insight

引言

rnn网络在使用过程中最受影响的问题就是其梯度消失和梯度爆炸,同时现在又很多方法来应对这两个缺陷,比如通过梯度裁剪来解决梯度爆炸问题,以及使用更复杂的单元结构像GRU和LSTM来缓解梯度消失,除此之外,正交初始化是一个简单但非常有趣的方法。

为了便于理解正交初始化的工作机理,我们会从基础线代和稳定性理论的角度来阐述。

https://www.zhihu.com/video/887000383099113472


特征值 稳定性理论 重复矩阵乘法

在深度学习中最常见的基础操作就是反复的矩阵乘法。这种反复的矩阵乘法会导致矩阵在多层神经网络中是指数形式的。这回造成严重的数值不稳定问题,即迅速的膨胀或者衰减。这也是影响RNN使用效果的罪魁祸首之一,RNN使用单个权重矩阵重复更新内部状态,有时甚至超过数百或数千个时间步长。

稳定性理论解释了一个系统经过很长时间之后的动态变化,在这个方面可以用来推测一些内在机理。稳定性理论包含了很多种方法,我们主要集中在怎么使用特征值去快速计算重复矩阵乘法中。

我们暂时先把rnn放一边,来看一些基础知识。

重复矩阵乘法和斐波那契

假设你想用矩阵乘法来计算斐波那契数列。实际上我们就是要找到一个矩阵F,当你使用它来进行重复矩阵乘法的时候,你就可以持续的获得斐波那契数列。


我们通过上述方法计算第四个斐波那契数列的值,使用单位矩阵作为初始矩阵,并且在每个step都乘以矩阵F。我们发现对角线上的中间值都是斐波那契序列的一部分 - 0,1,1,2,3。

通过上面的展开方式,我们可以发现 F^4 可以通过 (F^2)^2 来计算,这样我们可以再logn的时间复杂度情况下计算出斐波那契数列。


在接下来的小节中可以看到,事实上我们可以做到在O(1)的时间内计算出斐波那契数列的第n个元素(如果假设pow()操作是常数时间的话),同时在随着其增长的过程中,对于其变化可以获取一些直觉上的认识。

Eigenvalues特征值

接下来复习下基础线代,特征值分解将一个矩阵分解为特征值以及对应的特征向量的形式。因此之前的矩阵F就可以被因式分解为 F=Q\Lambda Q^{-1} ,其中 \Lambda 是对角线上是特征值的对角矩阵,Q是特征值对应的特征向量组成的矩阵。

那这时候你要问了,为啥要吧矩阵表示成这种形式呢,我们可以尝试使用新的矩阵去计算下一个斐波那契数列的值。

除了2个常数矩阵相乘,唯一需要额外计算的就是对角矩阵的n次幂!这在所有的矩阵幂运算中都可以使用,即 F^n=Q\Lambda^n Q^{-1}

这表明了我们在进行重复的矩阵乘法的时候,导致结果爆炸增长和消失的原因就在于特征值。

回到上面的斐波那契的的例子,我们可以看到一个特征值在增长同时另一个特征值会消失,当我们取一个较大的n时,例如n=10,我么可以发现矩阵的某一个特征值基本失去了相关性。

事实上,如果你使用一个相当大的斐波那契数乘上一个大的特征值,你可以获得下一个斐波那契数,最大的特征值事实上就是一个黄金比例 \varphi ,或者说是连续斐波那契序列的收敛比例。

>>> [np.round(13 * 1.618 ** i) for i in range(5)]
[13, 21, 34, 55, 89]

上文说明,随着重复矩阵乘法的次数N的逐渐增大:

  • 如果所有的特征值的绝对值都小于1,那么矩阵F会逐渐消失。
  • 如果所有的特征值的绝对值都等于1,那么矩阵F会保持在相应的常数范围内。
  • 如果所有的特征值的绝对值都大于1,那么矩阵F会逐渐爆炸。

正交矩阵回顾

正交矩阵有许多有意思的特性,最重要的就是正交矩阵的特征值绝对值等于1。这意味着,无论我们重复多少次矩阵乘法,矩阵的结果既不会爆炸也不会消失。

比较有意思的是特征值绝对值被限制在1的意义。如果我们只使用实数,这意味着特征值等于+1或-1,我们可以拓展到复数领域,这样会得到更有意思的结果。

甚至当特征值是复数,我们任然可以获得实数的结果。最简单的例子就是2*2的rotation matrix(相乘表示90度的旋转)。下方的旋转矩阵是个实数矩阵,但是其特征值和特征向量都是复数。

RNN的正交初始化

接下来我们会开始面向更复杂的RNN模型。我们先简单的假设没有输入,没有bias,确定的激活函数f,同时RNN的初始状态 h_0 是单位矩阵。

当我们在RNN内执行重复矩阵乘法并且结果爆炸或消失时,我们也进入梯度消失或爆炸的领域。如果梯度消失,训练就会很接近停顿,因为没有信息被反向传播。如果梯度爆炸,训练可能永远不会收敛,因为梯度更新剧烈波动。这两个都是非常有问题的,同时他们会在非常短的时间步长内发生。

在初始化RNN中的权重矩阵时,使用随机均匀或随机正常初始化并不罕见。该方法不能保证权重矩阵的特征值,并且可能导致爆炸或消失的结果。

如果我们使用正交矩阵来初始化权重,则所得到的矩阵既不会爆炸也不消失。这样可以使梯度更有效地反向传播。

为了构建正交矩阵,我们可以使用奇异值分解,如 Lasagne init.py. 所示。

不同初始化的可视化

让我们看看当在64个时间步上执行重复的矩阵乘法时,得到的矩阵会发生什么。RNN运行数百甚至数千个时间戳也是很常见的。神经网络通常还具有其他额外的问题,例如非线性激活函数和变化的输入。

小特征值导致的矩阵消失:

https://www.zhihu.com/video/887719871704612864

特征值大于1的矩阵爆炸:


https://www.zhihu.com/video/887720010435403776

正交矩阵初始化:

https://www.zhihu.com/video/887720144380510208

总结:

正交初始化是一种简单但相对有效的对抗梯度爆炸或者消失的方法,特别是与其他方法(如梯度裁剪和更高级的架构)配合时。虽然我们没有详细介绍梯度的数学推导,但是上述的不同初始化的可视化说明了正交初始化的有效性。当我们添加实际的激活功能和输入时,情况会变得复杂得多。


原文:

Explaining and illustrating orthogonal initialization for recurrent neural networks

编辑于 2017-09-03

文章被以下专栏收录