Neil Zhu银择,簡書ID Not_GOD邮旷,University AI 創(chuàng)始人 & Chief Scientist孤里,致力于推進世界人工智能化進程伏伯。制定并實施 UAI 中長期增長戰(zhàn)略和目標,帶領(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)練中會遇到較為嚴重的梯度消失問題(誤差梯度隨重要事件的時間差的大小指數(shù)級下降)。使用 LSTM 模塊后搂誉,當誤差從輸出層反向傳播回來時徐紧,可以使用模塊的記憶元記下來。所以 LSTM 可以記住比較長時間內(nèi)的信息炭懊。
LSTM 現(xiàn)在應(yīng)用非常廣泛:
- Robot control[8]
- Time series prediction[9]
- Speech recognition[10][11][12]
- Rhythm learning[13]
- Music composition[14]
- Grammar learning[15][16][17]
- Handwriting recognition[18][19]
- Human action recognition[20]
- Protein Homology Detection[21]
我們的例子是訓(xùn)練一個基于字符的 LSTM 語言模型并级,使用中文的古詩詞數(shù)據(jù)來訓(xùn)練。
在語言建模中侮腹,我們的任務(wù)是對詞的序列的出現(xià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)系。
仔細看看督暂,其實 LSTM 就是下面幾個方程:
- 輸入門:控制當前輸入 $$x_t$$ 和前一步輸出 $$h_{t-1}$$ 進入新的 cell 的信息量:
- 忘記門:決定是否清楚或者保持單一部分的狀態(tài)
- cell 更新變換:變換輸出和前一狀態(tài)到最新狀態(tài)
-
cell 狀態(tài)更新步驟:計算下一個時間戳的狀態(tài)使用經(jīng)過門處理的前一狀態(tài)和輸入:
輸出門:計算 cell 的輸出
- 最終 LSTM 的輸出:使用一個對當前狀態(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 個組成部分
- LSTM 模塊
- 映射詞(這里是字符)到連續(xù)值向量的嵌入模塊
- 線性模型加上一個 softmax,將 LSTM 的輸出 $$h_t$$ 映射到概率分布
準備動作:我們將 LSTM 展開到 T 個時間步汉匙,每次都有 LSTM 共享權(quán)重的副本($W_{xi}$拱烁、$W_{xo}$、$X_{xf}$ 等等)噩翠。我們按照同樣的操作完成 T 步的共享權(quán)重戏自。
前向傳播:
- 將輸入通過嵌入層,來獲得 T 個嵌入
- 對每一步:
- 運行 LSTM 的一個時間步伤锚,使用時間 t 的嵌入作為輸入
- 獲得時間 t 處的輸出擅笔,這個就是在時間 t 的預(yù)測結(jié)果
反向傳播
現(xiàn)在反向傳播就是很簡單了:我們首先進行前向傳播,然后完全反序執(zhí)行,調(diào)用 backward
而非 forward
猛们,保持每步 backward()
返回的 gradInput
的記錄
念脯,將其傳遞給下一個 backward
調(diào)用。細節(jié)請參考 train.lua
弯淘。
LSMT 中采樣
在每個時間步绿店,LSTM 都使用了 softmax 輸出了一個在字符集上的概率分布。
給定每個時間步的分布庐橙,有幾種方法來獲得單個的字符假勿,每個字符獲得其相應(yīng)的嵌入然后傳遞給 LSTM 作為下一步的輸入:
- 獲得當前時間步最大的值(試試運行不加
-sample
的sample.lua
看看) - 從分布中使用 softmax 采樣
- 獲取前 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ù)]
“忽如寄恕汇,壽無金酒固枝思, 歲上泰隨鳴餘娥, 采良隔逝閣附悲, 蟀箕袍德舉指鳥, 花有疏生佳柱蟀, 下佳能度”