選自arXiv
作者:Shuai Li等
機器之心編譯
參與:張倩、黃小天
近日,澳大利亞伍倫貢大學聯合電子科技大學提出一種新型的循環(huán)神經網絡 IndRNN,不僅可以解決傳統 RNN 所存在的梯度消失和梯度爆炸問題,還學習長期依賴關系;此外,借助 relu 等非飽和激活函數,訓練之后 IndRNN 會變得非常魯棒,并且通過堆疊多層 IndRNN 還可以構建比現有 RNN 更深的網絡。實驗結果表明,與傳統的 RNN 和 LSTM 相比,使用 IndRNN 可以在各種任務中取得更好的結果。同時本文還給出了 IndRNN 的 TensorFlow 實現,詳見文中 GitHub 鏈接。
循環(huán)神經網絡 (RNN) [16] 已在動作識別 [8]、場景標注 [4] 、語言處理 [5] 等序列學習問題中獲得廣泛應用,并且成果顯著。與卷積神經網絡 ( CNN ) 等前饋網絡相比,RNN 具有循環(huán)連接,其中最后的隱藏狀態(tài)是到下一狀態(tài)的輸入。狀態(tài)更新可描述如下:
其中 和
分別為時間步 t 的輸入和隱藏狀態(tài)。
、
和
分別為當前輸入的權重、循環(huán)輸入以及神經元偏差,σ 是神經元的逐元素激活函數,N 是該 RNN 層中神經元的數目。
由于循環(huán)權重矩陣不斷相乘,RNN 的訓練面臨著梯度消失和梯度爆炸的問題。長短期記憶 ( LSTM ) [ 10,17 ] 和門控循環(huán)單元 ( GRU ) [5] 等若干 RNN 模型可用來解決這些梯度問題。然而,在這些變體中使用雙曲正切和 Sigmoid 函數作為激活函數會導致網絡層的梯度衰減。因此,構建和訓練基于 RNN 的深度 LSTM 或 GRU 其實存在困難。
相比之下,使用 relu 等非飽和激活函數的現有 CNN 可以堆棧到非常深的網絡中 (例如,使用基本卷積層可以堆疊到 20 層以上;使用殘差連接可以到 100 層以上 [12]),并且仍然在接受高效的訓練。雖然在若干研究 [44, 36] 中已經嘗試把殘差連接用于 LSTM 模型,但情況并沒有明顯改善 (上述使用雙曲正切和 sigmoid 函數的 LSTM 的梯度衰減是主要原因)。
此外,現有的 RNN 模型在 ( 1 ) 中使用相同的 ,其中的循環(huán)連接連通所有神經元。這使得解釋和理解已訓練的神經元 (如每個神經元響應哪種模式) 的作用變得困難,因為單個神經元 [18] 的輸出的簡單可視化很難在不考慮其它神經元的情況下確定一個神經元的功能。
本文提出了一種新型循環(huán)神經網絡——獨立循環(huán)神經網絡(IndRNN)。在 IndRNN 中,循環(huán)輸入用 Hadamard 乘積處理為
。與傳統 RNN 相比,它有許多優(yōu)點,其中包括:
通過調節(jié)基于時間的梯度反向傳播,可以有效地解決梯度消失和爆炸問題。
利用 IndRNN 可以保留長期記憶,處理長序列。實驗表明,IndRNN 可以很好地處理 5000 步以上的序列,而 LSTM 能夠處理的序列還不到 1000 步。
IndRNN 可以很好地利用 relu 等非飽和函數作為激活函數,并且訓練之后非常魯棒。
IndRNN 可以實現高效的多層堆疊以增加網絡的深度,尤其是在層上具有殘差連接的情況下。語言建模實驗給出了一個 21 層 IndRNN 的實例。
由于各層神經元相互獨立,就很容易解釋每層 IndRNN 神經元的行為。
實驗表明,IndRNN 在加法問題、序貫 MNIST 分類、語言建模和動作識別等方面的性能明顯優(yōu)于傳統的 RNN 和 LSTM 模型。
3. 獨立循環(huán)神經網絡(IndRNN)
本文提出了一種獨立循環(huán)神經網絡 ( IndRNN ),具體描述如下:
其中循環(huán)權重 u 是向量,表示 Hadamard 乘積。每一層的每個神經元各自獨立,神經元之間的連接可以通過堆疊兩層或更多層的 IndRNNs 來實現(見下文)。對于第 n 個神經元,隱藏狀態(tài) h_n,t 可以通過下式得出:
其中 w_n 和 u_n 分別是輸入權重和循環(huán)權重的第 n 行。每個神經元僅在前一時間步從輸入和它自己的隱藏狀態(tài)中接收信息。也就是說,IndRNN 中的每個神經元獨立地處理一種類型的時空模型。傳統上,RNN 被視為時間上的、共享參數的多層感知器。與傳統的 RNN 不同的是,本文提出的 IndRNN 神經網絡為循環(huán)神經網絡提供了一個新視角,即隨著時間的推移 (即通過 u ) 獨立地聚集空間模式 (即通過 w )。不同神經元之間的相關性可以通過兩層或多層的堆疊來加以利用。在這種情況下,下一層的每個神經元處理上一層所有神經元的輸出。
4. 多層 IndRNN
如上所述,同一 IndRNN 層中的神經元彼此獨立,時間上的跨通道信息通過多層 IndRNN 進行探索。
IndRNN 基本架構如圖 1(a) 所示,其中「weight」和「Recurrent+ ReLU」表示以 relu 作為激活函數的每個步驟的輸入處理和循環(huán)處理。通過堆疊此基本架構,可以構建深度 IndRNN 網絡。
基于 [13] 中殘差層的「預激活」類型的殘差 IndRNN 實例見圖 1(b)。在每個時間步,梯度都可以從恒等映射直接傳播到其他層。由于 IndRNN 解決了隨時間累積的梯度爆炸和消失的問題,所以梯度可以在不同的時間步上有效地傳播。因此,網絡可以更深更長。
圖 1:( a ) 為 IndRNN 基本架構圖解;( b ) 為殘差 IndRNN 架構圖解。
5. 實驗
圖 2:不同序列長度情況下解決相加問題的結果。所有圖的圖例相同,因此僅在 ( a ) 中示出。
表 1:序貫 MNIST 和置換 MNIST(誤差率 ( % ) ) 結果。
表 2:IndRNN 模型的 PTB-c 結果與文獻記錄結果的對比(基于 BPC)。
表 3:所有基于骨架的方法在 NTU RGB+D 數據集上的結果。
論文:Independently Recurrent Neural Network (IndRNN): Building A Longer and Deeper RNN
論文鏈接:https://arxiv.org/abs/1803.04831
摘要:循環(huán)神經網絡 ( RNN ) 已廣泛應用于序列數據的處理。然而,由于眾所周知的梯度消失和爆炸問題以及難以保持長期學習的模式,RNN 通常難以訓練。長短期記憶 ( LSTM ) 和門控循環(huán)單元 ( GRU ) 被用來解決這些問題,但是雙曲正切函數和 sigmoid 函數的使用會導致層上梯度衰減。因此,構建可有效訓練的深度網絡頗具挑戰(zhàn)性。此外,每層 RNN 中的所有神經元都連接在一起,它們的運行狀況很難解釋。針對這些問題,本文提出了一種新的循環(huán)神經網絡——獨立循環(huán)神經網絡 ( IndRNN ),即同一層的神經元相互獨立,跨層連接。我們指出,IndRNN 可以通過簡單的調節(jié)避免梯度爆炸和消失問題,同時允許網絡學習長期依賴關系。此外,IndRNN 可以使用 relu 等非飽和激活函數,訓練之后可變得非常魯棒。通過堆疊多層 IndRNN 可以構建比現有 RNN 更深的網絡。實驗結果表明,本文中的 IndRNN 能夠處理很長的序列 (超過 5000 個時間步),可以用來構建很深的網絡 (實驗中使用了 21 層),并且經過訓練還可以更加魯棒。與傳統的 RNN 和 LSTM 相比,使用 IndRNN 可以在各種任務中取得更好的結果。
GitHub實現
上文是 IndRNN 具體的論文簡介,論文作者其實還提供了該循環(huán)架構的 TensorFlow 實現代碼和試驗結果。我們發(fā)現架構代碼中有非常詳盡的參數解釋,因此各位讀者可參考 ind_rnn_cell.py 文件詳細了解 IndRNN 的基本架構。此外,作者表示該實現使用 Python 3.4 和 TensorFlow 1.5 完成,所以我們可以在該環(huán)境或更新的版本測試。
項目地址:https://github.com/batzner/indrnn
1. 用法
將 ind_rnn_cell.py 文件復制到你的項目目錄中,如下展示了 IndRNN 單元的簡單調用過程:
from ind_rnn_cell import IndRNNCell
# Regulate each neuron's recurrent weight as recommended in the paper
recurrent_max = pow(2, 1 / TIME_STEPS)
cell = MultiRNNCell([IndRNNCell(128, recurrent_max_abs=recurrent_max),
IndRNNCell(128, recurrent_max_abs=recurrent_max)])
output, state = tf.nn.dynamic_rnn(cell, input_data, dtype=tf.float32)
...
2. 原論文中提到的實驗
有關本文中重構「相加問題」的相關腳本,請參見示例 examples/addition_rnn.py。更多實驗(如 Sequential MNIST)將在今后幾天進行更新與展示。
本文為機器之心編譯,轉載請聯系本公眾號獲得授權。