該放棄正在墮落的“RNN和LSTM”了
遞迴神經網路(RNN),長期短期記憶(LSTM)及其所有變體:
現在是放棄它們的時候了!
在2014年,LSTM和RNN重新復活。我們都閱讀過Colah的部落格和Karpathy對RNN的讚賞。但那個時候我們都很年輕,沒有經驗。隨著這幾年的技術的發展,我們才慢慢發現序列變換(seq2seq)才是真正求解序列學習的真正模型,它在語音識別領域創造了驚人的結果,例如:蘋果的Siri,Cortana,谷歌語音助手Alexa。還有就是我們的機器翻譯,它可以將文件翻譯成不同的語言。
然後在接下來的15年、16年,ResNet和Attention模型出現了。人們可以更好地認識到了LSTM其實就是一種巧妙的搭橋技術。注意,
通過兩年的發展,今天我們可以肯定地說:“放棄你的RNN和LSTM!”
有證據表明,谷歌,Facebook,Salesforce等企業正在越來越多地使用基於注意力模型的網路。所有的這些公司已經取代了RNN和基於注意力模型的變體,而這只是一個開始,因為RNN相較於注意力模型需要更多的資源來訓練。
為什麼?
RNN和LSTM及其變體主要是隨著時間的推移使用順序處理,請參閱下圖中的水平箭頭:
這個箭頭意味著,資料必須在到達當前處理單元之前順序穿過所有單元,這意味著它可以很容易出現梯度消失的問題。
為此,人們推出了LSTM模組,它可以被看作是多個開關門的組合,
但並不是完全解決,正如你從上圖所看到的那樣。儘管如此,我們仍然有一條從過去的單元到現在的單元的順序路徑,實際上,現在這些路徑甚至變得更加複雜,因為路徑上還連線了加如記憶的分支和遺忘記憶的分支。毫無疑問,LSTM和GRU及變體能夠學習大量長期的資訊!但他們只是可以記住100s的序列,而不是1000s或10000s甚至更多。
並且RNN的另一個問題是需要消耗大量的計算資源。在雲中執行這些模型也需要大量資源,並且由於語音到文字的需求正在迅速增長,雲能提供的計算能力慢慢的滿足不了它了。
我們應該怎麼辦?
如果要避免順序處理,那麼我們可以找到
為了結合多個神經注意力模組,我們可以使用來自下圖所示的“ 層級神經注意力編碼器”:
觀察過去資訊的更好方式是使用注意力模組將過去編碼向量彙總到上下文向量 C_t。請注意上面有一個層級注意力模組,它和層級神經網路非常相似。這也類似於下面的備註3中的時間卷積網路(TCN)。
在層級神經注意力編碼器中,多層級關注可以檢視最近過去的一小部分,比如說100個向量,而上面的層可以檢視這100個關注模組,有效地整合100 x 100個向量的資訊。這將層級神經注意力編碼器的能力擴充套件到10,000個以前的向量。但更重要的是查看錶示向量傳播到網路輸出所需的路徑長度:在分層網路中,它與log(N)成正比,其中N是層次結構層數。這與RNN需要做的T步驟形成對比,其中T是要記住的序列的最大長度,並且T >> N。
簡單的說就是回顧更多的歷史資訊並預測未來!
這種架構跟神經圖靈機很相似,但可以讓神經網路通過注意力決定從記憶體中讀出什麼。這意味著一個實際的神經網路將決定哪些過去的向量對未來決策的重要性。
但是儲存到記憶體呢?上述體系結構將所有先前的表示儲存在記憶體中,這可能是相當低效的。我們可以做的是新增另一個單元來防止相關資料被儲存。例如,不儲存與以前儲存的向量太相似的向量。最好的辦法就是讓應用程式指導哪些載體應該儲存或不儲存,這是當前研究的重點。
我們看到很多公司仍然使用RNN / LSTM來完成自然語言處理和語音識別等任務模型,但很多人不知道這些網路如此低效且無法擴充套件。
總結:
關於訓練RNN / LSTM:RNN和LSTM很難訓練,因為它們需要記憶體、頻寬、這些因素限制計算的效率,這對於硬體設計師來說是最糟糕的噩夢,並且最終限制了神經網路解決方案的適用性。簡而言之,每個LSTM單元需要的4個線性層(MLP層)在每個序列時間步上執行。線性層需要計算大量的記憶體頻寬,事實上,他們並不能經常使用很多計算單元,因為系統沒有足夠的記憶體頻寬來提供計算單元。新增更多計算單元很容易,但很難增加更多的記憶體頻寬。因此,RNN / LSTM和變體與硬體加速不太匹配,我之前曾討論過這個問題在這裡和這裡。
注:
注1:層級神經注意力與WaveNet中的想法類似。但是我們不使用卷積神經網路,而是使用層級神經注意力模型。
注2:層級神經注意力模型也可以是雙向的。
注3:這是一篇比較CNN和RNN的論文。時間卷積網路(TCN)“在不同範圍的任務和資料集上優於經典的經常性網路,如LSTM,同時展示更大的有效記憶體。”
原文連結