深度學習之神經網路結構 RNN 理解LSTM

2021-07-15 04:17:57 字數 3885 閱讀 6853

本篇部落格移動到中。

rnn

我們不是在大腦一片空白的情況下開始思考。當你讀這篇文章的時候,你是基於對前面單詞的理解來理解當前的單詞。你不會把所有的東西丟開,讓大腦每次都一片空白地思考。我們的思想是持久的。

傳統的神經網路做不到這一點,這看起來是它的主要缺點。舉個例子,假設你正在看電影,你想對每個時間點的事件型別進行分類。傳統的神經網路無法對電影中前面的事件進行推理,得到後續事件。

rnn可以解決這個問題。rnn中有迴圈結構,允許資訊的持久化。

在上面的圖中,神經網路的乙個分塊,a的迴圈可以讓資訊從網路中的乙個step傳遞到下乙個step。

這些迴圈讓rnn看起來有些神秘。但是如果你仔細想想,會發現rnn和傳統的神經網路的也有相通之處。乙個rnn可以看成同一網路的多個拷貝,每個拷貝網路都向後面的網路傳遞資訊。如果將迴圈展開,就可以得到:

這個鏈式結構表明rnn和序列、列表之間密切相關。用這種神經網路處理這些資料是很自然的一件事。

長時依賴問題

有時,我們只用鄰近的資訊就可以解決當前任務。比如語言模型**給予前面的單詞**下乙個單詞,如果我們想要**「the clouds are in the sky」的最後乙個單詞,不需要更多的上下文,就可以看出最後乙個單詞顯然是sky。這種情況下,相關資訊和當前**單詞距離不遠,rnn可以學會使用過去的資訊。

但是也存在需要更多上下文的情況。如果想要**「i grew up in france… i speak fluent french.」鄰近的資訊表明最後乙個單詞很可能是一種語言,但如果想要確定是那一種語言,需要找到france。這種情況下,和相關資訊之間的距離非常大。

但是,當距離增加時,rnn會喪失學習到連線如此遠的資訊的能力。

理論上,rnn絕對可以處理這種長時依賴,可以仔細的挑選引數解決這種形式的簡單問題。但是,在實踐中,rnn不能學到這些知識。在hochreiter(1991)和bengio(1994)都深入**過這個問題,給出了一些使訓練rnn變得困難的根本原因。

lstm

long short memory network – 通常稱作lstm,是一種特殊的rnn,可以學習到長時依賴。lstm由hochreiter(1997) 提出,並且後面有很多任務作對其進行修改。lstm在很多問題上都取得了相當大的成功,並得到廣泛使用。

lstm通過刻意的設計來避免長時依賴問題。記住長期資訊是lstm的預設能力,不需要花費很多代價去學習。

所有的rnn都是重複神經網路模組的鏈式形式。在傳統的rnn中,這些重複的模組結構很簡單,比如乙個單tanh層。

lstm也有鏈式的結構,但是重複模組有不同的結構,包含四個單神經網路層,用一種特殊的方式進行互動。

不要擔心細節。我們接下來會一步步的剖析lstm。現在,我們嘗試熟悉一下用到的符號。

在上圖中,每條線傳遞乙個向量,從乙個節點的輸出到另乙個節點的輸入。粉色圓圈表示pointwise操作,如向量之和。黃色的矩形表示學習到的神經網路層。匯聚的線表示連線,分開的線表示內容被拷貝成兩份。

lstm的核心思想

lstm的關鍵點是cell狀態,也就是貫穿上圖的水平線。

cell狀態像傳送帶,在整個鏈上執行,資訊在上面流動並保持不變是件容易的事情。

lstm通過門的控制可以向cell狀態中新增或者刪除資訊。

門是一種讓資訊選擇式通過的方法,包含乙個sigmoid神經網路層和乙個pointwise乘法操作。

sigmoid層輸出0-1之間的值,表示每個元件有多少資訊可以通過。值為0表示「不讓任何資訊通過」,值為1表示「讓所有資訊通過」。

乙個lstm有三個這樣的門,保護以及控制cell狀態。

一步步深入剖析lstm

lstm的第一步是決定要將cell狀態中的什麼資訊丟棄掉。這個決定是遺忘門完成的。以ht-1和xt為輸入,為cell狀態ct-1的每個數字,輸出乙個0-1之間的值。1表示完整地保留,0表示完全丟棄。

以語言模型為例:基於前面所有的單詞**下乙個單詞。在這個問題中,cell狀態可能包含當前主語的性別,所以可以**到正確的代詞。當看到乙個新的主語時,想要忘記舊主語的性別。

下一步是決定將要在cell狀態中新增什麼新資訊。這包含兩部分:首先,稱作輸入門的sigmoid層決定要更新哪些值。然後,乙個tanh層建立新的候選值向量,會被加入狀態中。在下一步,通過組合這兩項產生對狀態的更新。

在語言模型的例子中,希望向cell狀態中加入新主語的性別,以代替我們忘記的那個。

現在是將cell狀態從ct-1更新到ct的時候了!前面的幾步已經明確了要做什麼,現在只需要真的去做。

將舊狀態和ft相乘,忘掉希望忘記的資訊。然後加入it*ct。這是新的候選值,根據決定的每個狀態值的更新程度,進行變化。

在語言模型的例子中,就是真正丟棄舊主語性別的資訊並增加新資訊的過程。

最後,我們需要決定將要輸出什麼。這個輸出是基於cell狀態的,但是需要經過過濾。首先,執行乙個sigmoid層決定cell狀態的哪些部分是要輸出的。然後,對cell狀態進行tanh計算(將值限制在-1到1之間)並和sigmoid門的輸出相乘,這樣就只輸出了想要輸出的部分。

對於語言模型的例子,因為看到乙個主語,可能想輸出一些和動詞相關的資訊,因為下乙個單詞極有可能是動詞。舉個例子,可能輸出主語是單數還是複數的資訊,這樣如果下乙個單詞是動詞的話我們就知道動詞的形式。

lstm的變體

目前為止介紹的都是正常的lstm。但不是所有的lstm和上面介紹的一樣。實際上,似乎每篇用到lstm的文章使用的lstm都有一點變化。這種變化是細微的,但其中一些也值得提一提。

乙個最流行的變體,是由gers(2000)提出的,加入「peephole connections」。這意味著我們可以讓門接受細胞狀態的輸入。

上面的圖中對每個門都加了peephole,但很多文章只給部分門加peephole。

另乙個變體是把遺忘門和輸入門結合,相對於傳統lstm分開決定忘記什麼、新增什麼資訊,現在將這兩個決策同時完成。只有在輸入一些東西的時候才會進行遺忘;只有忘記cell狀態中舊的資訊時才會向其中輸入新值。

乙個變化比較大的變體是cho(2014)提出的門限迴圈單元gru。將遺忘門和輸入門組合成乙個單個的更新門。也合併了細胞狀態和隱藏狀態,並做了其他改變。gru比lstm簡單,也變得越來越流行。

這裡只是部分的lstm的變體,還有很多沒有提到的,比如yao(2015)提出的depth gated rnns。也有完全不同的用於解決長時依賴的方法,比如koutnik(2014)提出的clockwork rnn。

哪乙個變體是最好的?不同變體之間的差異有關係嗎?greff(2015)做了乙個實驗,用於比較流行的lstm變體,發現他們都是一樣的。jozefowicz(2015)測試了一萬多種rnn結構,發現有些變體在特定任務上比lstm要好。

總結

前面,我提到過用rnn得到的出色的結果。本質上,這些都是用lstm得到的。對大多數任務效果都很好!

把lstm寫成一組公式,看起來確實讓人費解,希望通過本文一步一步的深入lstm結構,能更容易理解lstm。

lstm是rnn的乙個大飛躍。很自然的會想到:下乙個飛躍在哪?在研究人員中,乙個普遍的觀點是:下一步飛躍有了,就是attention。attention是讓rnn的每一步都從大量資訊中抽取最重要的部分。比如,如果你在用rnn產生乙個的描述,在輸出每乙個單詞的時候可能只關注的一部分。xu(2015)做的就是這個——如果你想深入**attention的話,這可能是乙個比較有意思的起點。還有一些用attention取得的振奮人心的成果,而且有很多問題亟待探索。

attention不是rnn研究中僅有的方向。kalchbrenner(2015)提出的grid lstm看起來很有前景。在生成模型中使用rnn,如gregor(2015),chung(2015),orbayer(2015),看起來也很有意思。

深度學習 神經網路結構

線性可分 線性不可分 判斷一堆資料是否能夠線性可分的關鍵在於所在維度。從線性不可分 線性可分,可採用公升高維度的方式。線性可分和線性不可分的辯證統一思想 在低維空間中資料線性不可分,通過對映到高維空間是線性可分,回到低維空間又是線性不可分的,兩者統一而矛盾。線性不可分 線性可分 同時參考 深度學習領...

深度學習之神經網路

神經網路由輸入層 隱藏層 輸出層組成 1 單層神經網路 感知機 類似邏輯回歸,線性分類,全連線 沒有啟用函式 2 兩層神經網路 多層感知機 帶乙個隱層,非線性分類,全連線 3 多層神經網路 深度學習 全連線 4 卷積神經網路 cnn 非全連線 5 迴圈神經網路 rnn 處理序列資料 作非線性變換 s...

深度學習(二) 常用神經網路結構

2.記憶網路 3.圖網路 特點 每一層神經元接收前一層神經元的輸出,相當於有向無環圖 實現方式 前饋網路包括全連線前饋網路和卷積神經網路 a.多個全連線層可以從不同角度提取特徵 b.全連線層作為輸出層有分類和數值 的功能 也經常用於卷積神經網路。缺點 權重多,計算量大。應用 所有的神經網路均可以利用...