大家都喜愛的神經(jīng)網(wǎng)絡(luò)系列之LSTM

Neil Zhu,簡書ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist,致力于推進世界人工智能化進程。制定并實施 UAI 中長期增長戰(zhàn)略和目標(biāo),帶領(lǐng)團隊快速成長為人工智能領(lǐng)域最專業(yè)的力量。
作為行業(yè)領(lǐng)導(dǎo)者,他和UAI一起在2014年創(chuàng)建了TASA(中國最早的人工智能社團), DL Center(深度學(xué)習(xí)知識中心全球價值網(wǎng)絡(luò)),AI growth(行業(yè)智庫培訓(xùn))等,為中國的人工智能人才建設(shè)輸送了大量的血液和養(yǎng)分。此外,他還參與或者舉辦過各類國際性的人工智能峰會和活動,產(chǎn)生了巨大的影響力,書寫了60萬字的人工智能精品技術(shù)內(nèi)容,生產(chǎn)翻譯了全球第一本深度學(xué)習(xí)入門書《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》,生產(chǎn)的內(nèi)容被大量的專業(yè)垂直公眾號和媒體轉(zhuǎn)載與連載。曾經(jīng)受邀為國內(nèi)頂尖大學(xué)制定人工智能學(xué)習(xí)規(guī)劃和教授人工智能前沿課程,均受學(xué)生和老師好評。

本文介紹 LSTM 基本原理,和在 torch 以及 Theano 下給出兩個例子。
LSTM 本質(zhì)上是一種 RNN。人們發(fā)現(xiàn) RNN 在訓(xùn)練中會遇到較為嚴(yán)重的梯度消失問題(誤差梯度隨重要事件的時間差的大小指數(shù)級下降)。使用 LSTM 模塊后,當(dāng)誤差從輸出層反向傳播回來時,可以使用模塊的記憶元記下來。所以 LSTM 可以記住比較長時間內(nèi)的信息。

LSTM 現(xiàn)在應(yīng)用非常廣泛:

  1. Robot control[8]
  2. Time series prediction[9]
  3. Speech recognition[10][11][12]
  4. Rhythm learning[13]
  5. Music composition[14]
  6. Grammar learning[15][16][17]
  7. Handwriting recognition[18][19]
  8. Human action recognition[20]
  9. Protein Homology Detection[21]

我們的例子是訓(xùn)練一個基于字符的 LSTM 語言模型,使用中文的古詩詞數(shù)據(jù)來訓(xùn)練。

在語言建模中,我們的任務(wù)是對詞的序列的出現(xiàn)概率進行建模,通常是使用詞,但這里使用的字符(為了看看實驗的情況)。更加準(zhǔn)確地說,就是對一個 T 長的詞列表 $$w_1,w_2,...,w_T$$,我們定義概率如下:
$$P(w_1,w_2,...,w_T) = \prod_{t=1}^T P(w_t | w_{1:(t-1)})$$
其中 $$1 : (t - 1)$$ 表示從 $$1$$ 到 $$t-1$$。因此我們希望模型能夠給高的概率給更加合理的字符序列,而非亂序的組合。

在我之前幾篇譯文里面介紹了很多神經(jīng)網(wǎng)絡(luò)的知識,其中也包含了 LSTM 網(wǎng)絡(luò)。比如說梯度的消失和爆炸的情況。這里我再順手貼上幾個公式,顯得很專業(yè)一下。
其實這兩種關(guān)于梯度的問題,本質(zhì)上很簡單。梯度消失就是將一個導(dǎo)數(shù)的序列相乘,由于其中的某些導(dǎo)數(shù)變的很小 $$< 1$$,這樣最終的乘積就變成接近 $$0$$ 的值了。反過來,若是梯度非常大,那乘積就是變得無比的大,也就爆炸了。
這樣會導(dǎo)致梯度下降的快于在輸入的兩個相關(guān)事件的距離。

LSTM 通過在傳播導(dǎo)數(shù)的時候,保證其能夠傳播得盡可能遠而不會明顯的改變。下面會解釋。所以 LSTM 就能夠?qū)W得更長的依賴關(guān)系。

仔細(xì)看看,其實 LSTM 就是下面幾個方程:

  • 輸入門:控制當(dāng)前輸入 $$x_t$$ 和前一步輸出 $$h_{t-1}$$ 進入新的 cell 的信息量:
  • 忘記門:決定是否清楚或者保持單一部分的狀態(tài)
  • cell 更新變換:變換輸出和前一狀態(tài)到最新狀態(tài)
  • cell 狀態(tài)更新步驟:計算下一個時間戳的狀態(tài)使用經(jīng)過門處理的前一狀態(tài)和輸入:


  • 輸出門:計算 cell 的輸出

  • 最終 LSTM 的輸出:使用一個對當(dāng)前狀態(tài)的 tanh 變換進行重變換:

現(xiàn)在可以看看為何這樣的設(shè)計能夠解決梯度消失問題,對于 $$k<t$$,因為:


這里我們可以看到一條清晰的路徑,讓梯度無阻礙地進行流動(也就是說,不會下降到 $$0$$),除非對來自忘記門的常量(wrt $$c_{t-1}$$)乘法因子這會總在 $$1$$ 的附近,所以不會導(dǎo)致太大的下降,除了忘記門清除了 cell 的狀態(tài),這樣的話梯度也不會回流了。

對比 RNN 的梯度流動的路徑,就可以看到不少 sigmoid 函數(shù)和權(quán)重矩陣的導(dǎo)數(shù),這兩類都更加可能遠離 $$1$$。

前向傳播

我們現(xiàn)在描述前向傳播如何進行。
模型有 3 個組成部分

  1. LSTM 模塊
  2. 映射詞(這里是字符)到連續(xù)值向量的嵌入模塊
  3. 線性模型加上一個 softmax,將 LSTM 的輸出 $$h_t$$ 映射到概率分布

準(zhǔn)備動作:我們將 LSTM 展開到 T 個時間步,每次都有 LSTM 共享權(quán)重的副本($W_{xi}$、$W_{xo}$、$X_{xf}$ 等等)。我們按照同樣的操作完成 T 步的共享權(quán)重。

前向傳播

  1. 將輸入通過嵌入層,來獲得 T 個嵌入
  2. 對每一步:
  3. 運行 LSTM 的一個時間步,使用時間 t 的嵌入作為輸入
  4. 獲得時間 t 處的輸出,這個就是在時間 t 的預(yù)測結(jié)果

反向傳播

現(xiàn)在反向傳播就是很簡單了:我們首先進行前向傳播,然后完全反序執(zhí)行,調(diào)用 backward 而非 forward,保持每步 backward() 返回的 gradInput 的記錄
,將其傳遞給下一個 backward 調(diào)用。細(xì)節(jié)請參考 train.lua。

LSMT 中采樣

在每個時間步,LSTM 都使用了 softmax 輸出了一個在字符集上的概率分布。

給定每個時間步的分布,有幾種方法來獲得單個的字符,每個字符獲得其相應(yīng)的嵌入然后傳遞給 LSTM 作為下一步的輸入:

  1. 獲得當(dāng)前時間步最大的值(試試運行不加 -samplesample.lua看看)
  2. 從分布中使用 softmax 采樣
  3. 獲取前 k 個結(jié)果,使用 beam 搜索(這里并沒有實現(xiàn))

評價采樣的質(zhì)量

最簡單的方法:可視化數(shù)據(jù)!諸如“the”或者“and”這樣的詞出現(xiàn)得非常頻繁,即使就是訓(xùn)練很多的時間。隨著訓(xùn)練的繼續(xù),樣本會越來越像真的英語。

而更加形式化的性能評估就是測量 perplexity 在一個新的測試集合上。Perplexity 是測試集的逆概率,使用詞的數(shù)目正規(guī)化。最小化 perplexity 和最大化概率是一樣的,所以一個更低的 perplexity 模型能夠更好地描述數(shù)據(jù)。Perplexity 是一種常用的度量語言模型的測度,其定義如下:


其中的 $$w_1, ..., w_N$$ 是訓(xùn)練數(shù)據(jù)的整個序列;我們將整個這些看成是一個序列。在 bigram 模型中,條件是截斷的,

在實踐中,我們沒有測試集,所以就不會測量 perplexity,我們訓(xùn)練的字符層的模型。perplexity 通常用在詞層的語言模型上。

參考牛津大學(xué)機器學(xué)習(xí)課程

[待續(xù)]

“忽如寄,壽無金酒固枝思, 歲上泰隨鳴餘娥, 采良隔逝閣附悲, 蟀箕袍德舉指鳥, 花有疏生佳柱蟀, 下佳能度”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容