|
系列的第一篇概覽了一下深度學(xué)習(xí)中的基本概念。第二篇介紹了深度學(xué)習(xí)的歷史背景,以及如何高效地訓(xùn)練神經(jīng)網(wǎng)絡(luò)。而這一篇當(dāng)中,我們將一起認(rèn)識自然語言處理領(lǐng)域的核心:序列學(xué)習(xí)。 圖1:長短期記憶(LSTM)單元。LSTM有四個輸入權(quán)重和四個循環(huán)權(quán)重。Peepholes是記憶細(xì)胞和門之間的額外連接,但他們對性能提升幫助不到,所以常被忽略。 序列學(xué)習(xí) 生活中的所有事物都是與時間相關(guān)的,也就形成了一個序列。為了對序列數(shù)據(jù)(文本、演講、視頻等)我們可以使用神經(jīng)網(wǎng)絡(luò)并導(dǎo)入整個序列,但是這樣我們的數(shù)據(jù)輸入尺寸是固定的,局限性就很明顯。如果重要的時序特征事件恰好落在輸入窗以外,就會產(chǎn)生更大的問題。所以我們需要的是:
循環(huán)神經(jīng)網(wǎng)絡(luò)Discovery 若我們想讓一個常規(guī)的神經(jīng)網(wǎng)絡(luò)解決兩個數(shù)相加的問題,那我們只需要輸入兩個數(shù)字,再訓(xùn)練兩數(shù)之和的預(yù)測即可。如果現(xiàn)在有3個數(shù)要相加,那么我們可以:
方案(2)顯然更好,因為我們希望避免重新訓(xùn)練整個網(wǎng)絡(luò)(網(wǎng)絡(luò)已經(jīng)“知道”如何將兩個數(shù)相加)。如果我們的任務(wù)變成:先對兩數(shù)做加法,再減去兩個不同的數(shù),那這個方案又不好使了。即使我們使用額外的權(quán)重,也不能保證正確的輸出。相反,我們可以嘗試“修改程序”,把網(wǎng)絡(luò)由“加法”變成“減法”。通過隱藏層的加權(quán)可以實現(xiàn)這一步(見圖2),如此便讓網(wǎng)絡(luò)的內(nèi)核隨著每個新的輸入而變化。網(wǎng)絡(luò)將學(xué)習(xí)著在相加兩個數(shù)之后,把程序從“加法”變成“減法”,然后就解決了問題。 我們甚至可以泛化這一方法,傳遞給網(wǎng)絡(luò)兩個數(shù)字,再傳入一個“特殊”的數(shù)字——代表著數(shù)學(xué)運算“加法”,“減法”或“乘法”。實踐當(dāng)中這樣或許不盡完美,但也能得到大體正確的結(jié)果了。不過這里的主要問題倒不在于得到正確結(jié)果,而是我們可以訓(xùn)練循環(huán)神經(jīng)網(wǎng)絡(luò),使之能夠?qū)W習(xí)任意輸入序列所產(chǎn)生的特殊輸出,這就威力大了。 例如,我們可以教網(wǎng)絡(luò)學(xué)會詞語的序列。Soumith Chintala和Wojciech Zaremba寫了一篇優(yōu)秀的博客講述用RNN做自然語言處理。RNN也可以用于生成序列。Andrej Karpathy寫了這篇[有趣而生動的博客],展示了字詞級別的RNN,可以模仿各種文風(fēng),從莎士比亞,到Linux源碼,再到給小孩兒起名。 長短期記憶(Long Short Term Memory, LSTM)Discovery 長短期記憶單元使用自連接的線性單元,權(quán)重為常數(shù)1.0。這使得流入自循環(huán)的值(前向傳播)或梯度(反向傳播)可以保持不變(乘以1.0的輸入或誤差還是原來的值;前一時間步的輸出或誤差也和下一時間步的輸出相同),因而所有的值和梯度都可以在需要的時候準(zhǔn)確回調(diào)。這個自循環(huán)的單元,記憶細(xì)胞,提供了一種可以儲存信息的記憶功能,對之前的若干個時間步當(dāng)中有效。這對很多任務(wù)都極其有效,比如文本數(shù)據(jù),LSTM可以存儲前一段的信息,并對當(dāng)前段落的序列應(yīng)用這些信息。 另外,深度網(wǎng)絡(luò)中一個很普遍的問題叫作“梯度消失”問題,也即,梯度隨著層數(shù)增多而越來越小。有了LSTM中的記憶細(xì)胞,就有了連續(xù)的梯度流(誤差保持原值),從而消除了梯度消失問題,能夠?qū)W習(xí)幾百個時間步那么長的序列。 然而有時我們會想要拋掉舊有信息,替換以更新、更相關(guān)的信息。同時我們又不想釋放無效信息干擾其余部分的網(wǎng)絡(luò)。為了解決這個問題,LSTM單元擁有一個遺忘門,在不對網(wǎng)絡(luò)釋放信息的情況下刪除自循環(huán)單元內(nèi)的信息(見圖1)。遺忘門將記憶細(xì)胞里的值乘以0~1之間的數(shù)字,其中0表示遺忘,1表示保持原樣。具體的數(shù)值宥當(dāng)前輸入和上一時間步的LSTM單元輸出決定。 在其他時間,記憶細(xì)胞還需要保持多個時間步內(nèi)不變,為此LSTM增加了另一道門,輸入門(或?qū)懭腴T)。當(dāng)輸入門關(guān)閉時,新信息就不會流入,原有信息得到保護。 另一個門將記憶細(xì)胞的輸出值乘以0(抹除輸出)~1()之間的數(shù),當(dāng)多個記憶相互競爭時這很有用:一個記憶細(xì)胞可能說:“我的記憶非常重要!所以我現(xiàn)在就要釋放”,但是網(wǎng)絡(luò)卻可能說:“你的記憶是很重要,不過現(xiàn)在又其他更重要的記憶細(xì)胞,所以我給你的輸出門賦予一個微小的數(shù)值,給其他門大數(shù)值,這樣他們會勝出”。 LSTM單元的連接方式初看可能有些復(fù)雜,你需要一些時間去理解。但是當(dāng)你分別考察各個部件的時候,會發(fā)現(xiàn)其結(jié)構(gòu)其實跟普通的循環(huán)神經(jīng)網(wǎng)絡(luò)沒啥兩樣——輸入和循環(huán)權(quán)重流向所有的門,連接到自循環(huán)記憶細(xì)胞。 如果你想要學(xué)習(xí)更多詞嵌入的內(nèi)容,以及如何應(yīng)用于創(chuàng)建模型“理解”語言,推薦閱讀:Understanding Natural Language with Deep Neural Networks Using Torch,作者:Soumith Chintala和Wojciech Zaremba。 |
|
|
來自: taotao_2016 > 《計算機》