引言

rnn網路在使用過程中最受影響的問題就是其梯度消失和梯度爆炸,同時現在又很多方法來應對這兩個缺陷,比如透過梯度裁剪來解決梯度爆炸問題,以及使用更復雜的單元結構像GRU和LSTM來緩解梯度消失,除此之外,正交初始化是一個簡單但非常有趣的方法。

為了便於理解正交初始化的工作機理,我們會從基礎線代和穩定性理論的角度來闡述。

【譯】RNN的正交初始化insight

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

特徵值 穩定性理論 重複矩陣乘法

在深度學習中最常見的基礎操作就是反覆的矩陣乘法。這種反覆的矩陣乘法會導致矩陣在多層神經網路中是指數形式的。這回造成嚴重的數值不穩定問題,即迅速的膨脹或者衰減。這也是影響RNN使用效果的罪魁禍首之一,RNN使用單個權重矩陣重複更新內部狀態,有時甚至超過數百或數千個時間步長。

穩定性理論解釋了一個系統經過很長時間之後的動態變化,在這個方面可以用來推測一些內在機理。穩定性理論包含了很多種方法,我們主要集中在怎麼使用特徵值去快速計算重複矩陣乘法中。

我們暫時先把rnn放一邊,來看一些基礎知識。

重複矩陣乘法和斐波那契

假設你想用矩陣乘法來計算斐波那契數列。實際上我們就是要找到一個矩陣F,當你使用它來進行重複矩陣乘法的時候,你就可以持續的獲得斐波那契數列。

【譯】RNN的正交初始化insight

【譯】RNN的正交初始化insight

我們透過上述方法計算第四個斐波那契數列的值,使用單位矩陣作為初始矩陣,並且在每個step都乘以矩陣F。我們發現對角線上的中間值都是斐波那契序列的一部分 - 0,1,1,2,3。

【譯】RNN的正交初始化insight

【譯】RNN的正交初始化insight

透過上面的展開方式,我們可以發現

F^4

可以透過

(F^2)^2

來計算,這樣我們可以再logn的時間複雜度情況下計算出斐波那契數列。

在接下來的小節中可以看到,事實上我們可以做到在O(1)的時間內計算出斐波那契數列的第n個元素(如果假設pow()操作是常數時間的話),同時在隨著其增長的過程中,對於其變化可以獲取一些直覺上的認識。

Eigenvalues特徵值

接下來複習下基礎線代,特徵值分解將一個矩陣分解為特徵值以及對應的特徵向量的形式。因此之前的矩陣F就可以被因式分解為

F=Q\Lambda Q^{-1}

,其中

\Lambda

是對角線上是特徵值的對角矩陣,Q是特徵值對應的特徵向量組成的矩陣。

【譯】RNN的正交初始化insight

【譯】RNN的正交初始化insight

那這時候你要問了,為啥要吧矩陣表示成這種形式呢,我們可以嘗試使用新的矩陣去計算下一個斐波那契數列的值。

【譯】RNN的正交初始化insight

【譯】RNN的正交初始化insight

除了2個常數矩陣相乘,唯一需要額外計算的就是對角矩陣的n次冪!這在所有的矩陣冪運算中都可以使用,即

F^n=Q\Lambda^n Q^{-1}

這表明了我們在進行重複的矩陣乘法的時候,導致結果爆炸增長和消失的原因就在於特徵值。

回到上面的斐波那契的的例子,我們可以看到一個特徵值在增長同時另一個特徵值會消失,當我們取一個較大的n時,例如n=10,我麼可以發現矩陣的某一個特徵值基本失去了相關性。

【譯】RNN的正交初始化insight

【譯】RNN的正交初始化insight

事實上,如果你使用一個相當大的斐波那契數乘上一個大的特徵值,你可以獲得下一個斐波那契數,最大的特徵值事實上就是一個黃金比例

\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的正交初始化insight

【譯】RNN的正交初始化insight

RNN的正交初始化

接下來我們會開始面向更復雜的RNN模型。我們先簡單的假設沒有輸入,沒有bias,確定的啟用函式f,同時RNN的初始狀態

h_0

是單位矩陣。

【譯】RNN的正交初始化insight

【譯】RNN的正交初始化insight

當我們在RNN內執行重複矩陣乘法並且結果爆炸或消失時,我們也進入梯度消失或爆炸的領域。如果梯度消失,訓練就會很接近停頓,因為沒有資訊被反向傳播。如果梯度爆炸,訓練可能永遠不會收斂,因為梯度更新劇烈波動。這兩個都是非常有問題的,同時他們會在非常短的時間步長內發生。

在初始化RNN中的權重矩陣時,使用隨機均勻或隨機正常初始化並不罕見。該方法不能保證權重矩陣的特徵值,並且可能導致爆炸或消失的結果。

如果我們使用正交矩陣來初始化權重,則所得到的矩陣既不會爆炸也不消失。這樣可以使梯度更有效地反向傳播。

為了構建正交矩陣,我們可以使用奇異值分解,如 Lasagne init。py。 所示。

不同初始化的視覺化

讓我們看看當在64個時間步上執行重複的矩陣乘法時,得到的矩陣會發生什麼。RNN執行數百甚至數千個時間戳也是很常見的。神經網路通常還具有其他額外的問題,例如非線性啟用函式和變化的輸入。

小特徵值導致的矩陣消失:

【譯】RNN的正交初始化insight

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

特徵值大於1的矩陣爆炸:

【譯】RNN的正交初始化insight

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

正交矩陣初始化:

【譯】RNN的正交初始化insight

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

總結:

正交初始化是一種簡單但相對有效的對抗梯度爆炸或者消失的方法,特別是與其他方法(如梯度裁剪和更高階的架構)配合時。雖然我們沒有詳細介紹梯度的數學推導,但是上述的不同初始化的視覺化說明了正交初始化的有效性。當我們新增實際的啟用功能和輸入時,情況會變得複雜得多。

原文:

Explaining and illustrating orthogonal initialization for recurrent neural networks