第一次接觸長短期記憶神經(jīng)網(wǎng)絡(luò)(LSTM)時(shí),我驚呆了。
原來,LSTM是神經(jīng)網(wǎng)絡(luò)的擴(kuò)展,非常簡單。深度學(xué)習(xí)在過去的幾年里取得了許多驚人的成果,均與LSTM息息相關(guān)。因此,在本篇文章中我會(huì)用盡可能直觀的方式為大家介紹LSTM——方便大家日后自己進(jìn)行相關(guān)的探索。
首先,請(qǐng)看下圖:
LSTM是不是很漂亮?
注意:如果你對(duì)神經(jīng)網(wǎng)絡(luò)和LSTM很熟悉,請(qǐng)直接跳到本文的中間部分——前半部分相當(dāng)于入門教程。
神經(jīng)網(wǎng)絡(luò)
假設(shè)我們從某部電影中截取出了一系列的圖像,并且我們想對(duì)每張圖像進(jìn)行標(biāo)記,使其成為某個(gè)事件(是打斗嗎?演員們?cè)谡f話嗎?演員們?cè)诔詵|西嗎?)
我們?cè)撛趺醋觯?/p>
其中一種方法就是,在忽視圖像連續(xù)屬性的情況下構(gòu)建一個(gè)單獨(dú)處理各個(gè)圖像的單圖像分類器。例如,提供足夠多的圖像和標(biāo)簽:
我們的算法首先可能需要學(xué)習(xí)檢測(cè)低級(jí)圖形,如形狀和棱邊等。
在數(shù)據(jù)變多的情況下,算法可能會(huì)學(xué)習(xí)將這些圖形與更為復(fù)雜的形式結(jié)合在一起,如人臉(一個(gè)橢圓形的東西的上方是一個(gè)三角形,三角形上有兩個(gè)圓形)或貓。
如果數(shù)據(jù)量進(jìn)一步增多的話,算法可能會(huì)學(xué)習(xí)將這些高級(jí)圖樣映射至活動(dòng)本身(包含嘴、肉排和餐叉的場景可能就是在用餐)
這就是一個(gè)深度神經(jīng)網(wǎng)絡(luò):輸入一張圖像而后輸出相應(yīng)的事件——這與我們?cè)趯?duì)犬類一無所知的情況下仍可能會(huì)通過幼犬行為學(xué)習(xí)檢測(cè)其各種特征是一樣的(在觀察了足夠多的柯基犬后,我們發(fā)現(xiàn)它們有一些共同特征,如蓬松的臀部和短小的四肢等;接下來,我們繼續(xù)學(xué)習(xí)更加高級(jí)的特性,如排泄行為等)——在這兩個(gè)步驟之間,算法通過隱含圖層的向量表示來學(xué)習(xí)描述圖像。
數(shù)學(xué)表達(dá)
雖然大家可能對(duì)基本的神經(jīng)網(wǎng)絡(luò)已經(jīng)非常熟悉,但是此處我們?nèi)钥焖俚鼗仡櫼幌拢?/p>
單隱含層的神經(jīng)網(wǎng)絡(luò)將向量x作為輸入,我們可以將其視作為一組神經(jīng)元。
算法通過一組學(xué)習(xí)后的權(quán)重將每個(gè)輸入神經(jīng)元連接至神經(jīng)元的一個(gè)隱含層。
第j個(gè)隱層神經(jīng)元輸出為,其中??是激活函數(shù)。
隱含層與輸出層完全連接在一起,第j個(gè)輸出神經(jīng)元輸出為,如果需要知道其概率的話,我們可以借助softmax函數(shù)對(duì)輸出層進(jìn)行轉(zhuǎn)換。
用矩陣符號(hào)表示為:
h=?(Wx)h=?(Wx)
y=Vhy=Vh
其中
matchx 是輸入向量
W是連接輸入層和隱含層的權(quán)重矩陣
V是連接隱含層和輸出層的權(quán)重矩陣
? 的激活函數(shù)通常為雙彎曲函數(shù)(sigmoid function) σ(x) ,它將數(shù)字縮小到 (0, 1)區(qū)間內(nèi);雙曲線函數(shù)(hyperbolic tangent)tanh(x),它將數(shù)字縮小至(-1, 1)區(qū)間內(nèi),修正線性單位 ReLU(x)=max(0,x)。
下圖為圖形視圖:
注意:為了使符號(hào)更加簡潔些,我假設(shè)x和h各包含一個(gè)額外的偏差神經(jīng)元,偏差設(shè)置為1固定不變,方便學(xué)習(xí)偏差權(quán)重。
利用RNN記憶信息
忽視電影圖像的連續(xù)屬性像是ML 101的做法。如果我們看到一個(gè)沙灘的場景,我們應(yīng)該在接下來的幀數(shù)中增強(qiáng)沙灘活動(dòng):如果圖像中的人在海水中,那么這個(gè)圖像可能會(huì)被標(biāo)記為“游泳”;如果圖像中的人閉著眼睛躺在沙灘上,那么這個(gè)圖像可能會(huì)被標(biāo)記為“日光浴”。如果如果我們能夠記得Bob剛剛抵達(dá)一家超市的話,那么即使沒有任何特別的超市特征,Bob手拿一塊培根的圖像都可能會(huì)被標(biāo)記為“購物”而不是“烹飪”。
因此,我們希望讓我們的模型能夠跟蹤世界上的各種狀態(tài):
在檢測(cè)完每個(gè)圖像后,模型會(huì)輸出一個(gè)標(biāo)簽,同時(shí)模型對(duì)世界的認(rèn)識(shí)也會(huì)有所更新。例如,模型可能會(huì)學(xué)習(xí)自主地去發(fā)現(xiàn)并跟蹤相關(guān)的信息,如位置信息(場景發(fā)生的地點(diǎn)是在家中還是在沙灘上?)、時(shí)間(如果場景中包含月亮的圖像,模型應(yīng)該記住該場景發(fā)生在晚上)和電影進(jìn)度(這個(gè)圖像是第一幀還是第100幀?)。重要的是,正如神經(jīng)元在未收到隱含圖像(如棱邊、圖形和臉等)的情況下可以自動(dòng)地去發(fā)現(xiàn)這些圖像,我們的模型本身可以自動(dòng)發(fā)現(xiàn)有用的信息。
在向模型輸入新的圖像時(shí),模型應(yīng)該結(jié)合它收集到的信息,更加出色地完成任務(wù)。
這就是遞歸神經(jīng)網(wǎng)絡(luò)(RNN),它不僅能夠完成簡單地圖像輸入和事件輸出行為,還能保持對(duì)世界的記憶(給不同信息分配的權(quán)重),以幫助改進(jìn)自己的分類功能。
數(shù)學(xué)表達(dá)
接下來,讓我們把內(nèi)部知識(shí)的概念添加到方程式中,我們可以將其視為神經(jīng)網(wǎng)絡(luò)長久以來保存下的記憶或者信息。
非常簡單:我們知道神經(jīng)網(wǎng)絡(luò)的隱含層已經(jīng)對(duì)關(guān)于輸入的有用信息進(jìn)行了編碼,因此,為什么不把這些隱含層作為記憶來使用呢?這一想法使我們得到了下面的RNN方程式:
ht=?(Wxt+Uht?1)
yt=Vht
注意:在時(shí)間t處計(jì)算得出的隱狀態(tài)(ht為我們的內(nèi)部知識(shí))在下個(gè)時(shí)間步長內(nèi)會(huì)被反饋給神經(jīng)網(wǎng)絡(luò)。(另外,我會(huì)在本文中交替使用隱狀態(tài)、知識(shí)、記憶和認(rèn)識(shí)等概念來描述ht)
利用LSTM實(shí)現(xiàn)更長久的記憶
讓我們思考一下我們的模型是如何更新它對(duì)世界的認(rèn)識(shí)的。到目前為止,我們并未對(duì)其更新過程施加任何限制措施,因此該認(rèn)識(shí)更新過程可能十分混亂:在某一幀,模型可能會(huì)認(rèn)為其中的人物是在美國;到了下一幀,當(dāng)它觀察到人物在吃壽司時(shí),便會(huì)認(rèn)為這些人在日本;而在下一幀,當(dāng)它觀察到北極熊時(shí),便認(rèn)為他們是在伊德拉島 ( Hydra island )。也有可能,模型收集到的大量信息表明Alice是一名投資分析師,但是在看到她進(jìn)行烹飪時(shí)又?jǐn)喽ㄋ且幻殬I(yè)殺手。
這種混亂意味著信息會(huì)快速地改變并消失,模型很難保存長期記憶。因此,我們希望神經(jīng)網(wǎng)絡(luò)能學(xué)會(huì)如何更新自己的認(rèn)識(shí)(也就是說,沒有Bob的場景不應(yīng)該改變所有與Bob相關(guān)的信息,有Alice的場景就應(yīng)該專注于收集關(guān)于她的信息),這樣神經(jīng)網(wǎng)絡(luò)就可以相對(duì)緩慢地更新它對(duì)世界的認(rèn)識(shí)。
以下是我們的實(shí)現(xiàn)方法。
添加遺忘機(jī)制。例如,如果某個(gè)場景結(jié)束了,模型就應(yīng)該忘記當(dāng)前場景的位置和時(shí)間,并且重置任何與該場景有關(guān)的信息;但是,如果某個(gè)人物在該場景中死亡了,那么模型應(yīng)該繼續(xù)記住該人物死亡的事實(shí)。因此,我們想要模型學(xué)習(xí)獨(dú)立的的遺忘/記憶機(jī)制:當(dāng)收到新的輸入時(shí),模型需要知道哪些認(rèn)識(shí)應(yīng)該保留以及哪些認(rèn)識(shí)應(yīng)該遺棄。
添加保存機(jī)制。當(dāng)模型看到新的圖像時(shí),它需要學(xué)習(xí)關(guān)于該圖像的所有信息是否值得使用以及是否值得保存。也許你媽曾給你發(fā)過一篇關(guān)于卡戴珊一家的文章,但是誰在乎呢?
因此當(dāng)收到新的輸入信息時(shí),模型首先忘記所有它認(rèn)為自己不再需要的長期信息。然后,再學(xué)習(xí)新輸入信息的哪部分具有使用價(jià)值,并且將它們保存到長期記憶中。
將長期記憶聚焦為工作記憶。最后,模型需要學(xué)習(xí)哪一部分的長期記憶能立刻發(fā)揮作用。例如,Bob的年齡可能是一條有用的信息,需要保存在長期記憶中(兒童更可能會(huì)爬行,而成人則更可能會(huì)工作),但是如果Bob并未出現(xiàn)在當(dāng)前場景中,那么這條信息就可能是不相干的信息。因此,模型并不是始終都在使用全部的長期記憶的,它只需要學(xué)習(xí)應(yīng)該集中注意力于哪部分記憶。
這就是長短期記憶網(wǎng)絡(luò)。RNN在各個(gè)時(shí)間步中改寫記憶的方式可以說是相當(dāng)無序的,而LSTM改寫自己記憶的方式是更加精確的:通過使用特定的學(xué)習(xí)機(jī)制來判斷哪些信息需要記憶、哪些信息需要更新以及哪些信息需要特別注意。這有助于LSTM對(duì)信息進(jìn)行長期跟蹤。
數(shù)學(xué)表達(dá)
讓我們用數(shù)學(xué)表達(dá)式來描述LSTM的添加機(jī)制。
在時(shí)間t時(shí),我們收到一個(gè)新的輸入xt。我們還將長期記憶和工作記憶從前兩個(gè)時(shí)間步ltmt?1和wmt?1(兩者都為n-長度向量)傳遞到當(dāng)前時(shí)間步,進(jìn)行更新。
我們先處理長期記憶。首先,我們需要知道哪些長期記憶需要繼續(xù)記憶,并且需要知道哪些長期記憶需要舍棄。因此,我們使用新的輸入和工作記憶來學(xué)習(xí)0和1之間n個(gè)數(shù)字的記憶門,各個(gè)記憶門決定某長期記憶元素需要保留的程度。(1表示保存,0表示完全遺忘)。
我們可以使用一個(gè)小型神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)這個(gè)時(shí)間門:
(請(qǐng)注意它與先前網(wǎng)絡(luò)方程式相似的地方;這只是一個(gè)淺層神經(jīng)網(wǎng)絡(luò)。另外,我們之所以使用S形激活函數(shù)是因?yàn)槲覀兯枰臄?shù)字介于0至1之間。)
接下來,我們需要計(jì)算可以從xt中學(xué)習(xí)的信息,也就是長期記憶的候選添加記憶:
?是一個(gè)激活函數(shù),通常被選作為tanh。在將候選記憶添加到長期記憶中之前,我們想要學(xué)習(xí)候選記憶的哪部分值得使用和保存:
(想象一下你在閱讀網(wǎng)頁時(shí)發(fā)生的事情。當(dāng)新的新聞可能包含關(guān)于希拉里的信息時(shí),如果該信息來自布萊巴特(Breitbart)網(wǎng)站,那么你就應(yīng)該忽視它。)
現(xiàn)在讓我們把所有這些步驟結(jié)合起來。在忘記我們認(rèn)為不再需要的記憶并保存輸入信息的有用部分后,我們就會(huì)得到更新后的長期記憶:
其中°表示以元素為單元 (Element-wise)的乘法。
接下來,讓我們更新一下工作記憶。我們想要學(xué)習(xí)如何將我們的長期記憶聚焦到能立刻發(fā)揮作用的信息上。(換句話說,我們想要學(xué)習(xí)需要將哪些數(shù)據(jù)從外接硬盤中轉(zhuǎn)移到用于工作的筆記本上)。因此,此處我們來學(xué)習(xí)一下關(guān)注/注意向量(focus/attention vector):
我們的工作記憶為:
換言之,我們注意關(guān)注向量為1的元素,忽視關(guān)注向量為0的元素。
我們完成了!希望你也將這些步驟記到了你的的長期記憶中。
總結(jié)來說,普通的RNN只利用一個(gè)方程式來更新它的隱狀態(tài)/記憶:
而 LSTM 則會(huì)利用數(shù)個(gè)方程式:
其中的每個(gè)記憶/注意子機(jī)制只是它自己的一個(gè)迷你大腦:
(注意:我使用的術(shù)語和變量名稱與常規(guī)文章中的用法不同。以下是標(biāo)準(zhǔn)名稱,我從此處起將會(huì)交替使用這些名稱:
長期記憶ltmt通常被稱為cell狀態(tài),表示為ct。
工作記憶wmt通常被稱為隱狀態(tài),表示為ht。它與普通RNN中的隱狀態(tài)類似
記憶向量remembert通常被稱為記憶門(盡管記憶門中的1仍表示保留記憶,0仍表示忘記),表示為ft。
保存向量savet通常被稱為輸入門(因?yàn)樗鼪Q定輸入信息中需要保存到cell狀態(tài)中的程度),表示為it。
關(guān)注向量focust通常被稱為輸出門,表示為ot。)
Snorlax
寫這篇文章的時(shí)間我本來可以捉到一百只Pidgey的!下面Pidgey的卡通圖像。
神經(jīng)網(wǎng)絡(luò)
遞歸神經(jīng)網(wǎng)絡(luò)
長短期記憶網(wǎng)絡(luò)
學(xué)習(xí)如何編碼
讓我們看幾個(gè)LSTM發(fā)揮作用的例子。效仿Andrej Karpathy的文章,我將使用字符級(jí)別的LSTM模型,我給模型輸入字符序列并對(duì)其進(jìn)行訓(xùn)練,使它能夠預(yù)測(cè)序列中的下個(gè)字符。
盡管這種方法似乎有點(diǎn)幼稚,但是字符級(jí)別的模型其實(shí)真的十分有用,甚至超越文字模型。例如:
想象一個(gè)可以使你在手機(jī)上進(jìn)行編碼的自動(dòng)填充編碼插件(code autocompleter)。LSTM(理論上)可以跟蹤你當(dāng)前使用的方法的返回類型,并能對(duì)應(yīng)當(dāng)返回的變量做出更好的建議;它還能在不進(jìn)行編譯的情況下通過返回錯(cuò)誤類型得知你是否犯有錯(cuò)誤。
自然語言處理應(yīng)用(如機(jī)器翻譯)在處理罕見術(shù)語時(shí)通常會(huì)有困難。該如何翻譯一個(gè)你以前從未見過的單詞?或者如何將形容詞轉(zhuǎn)換為副詞呢?即使你知道某篇推文的意思,你該如何生成一個(gè)新的話題標(biāo)簽以方便其他人捕捉相關(guān)的信息呢?字符模型可以憑空想象出新的術(shù)語,這是另一個(gè)可以實(shí)現(xiàn)有趣應(yīng)用的領(lǐng)域。
首先我啟動(dòng)了一個(gè)EC2 p2.xlarge競價(jià)實(shí)例(spot instance),在Apache Commons Lang codebase上訓(xùn)練了一個(gè)3層LSTM。這是該LSTM在數(shù)小時(shí)后生成的一個(gè)程序。
盡管該編碼肯定不算完美,但是也比許多我認(rèn)識(shí)的數(shù)據(jù)科學(xué)家編得好。我們可以看出,LSTM學(xué)到了很多有趣(并且正確?。┑木幋a行為:
它知道如何構(gòu)造類別:先是證書,然后是程序包和輸入,再是評(píng)論和類別定義,最后是變量和方法。同樣,它懂得如何創(chuàng)造方法:正確指令后跟裝飾符(先是描述,然后是@param,再是@return等),正確放置裝飾符,返回值非空的方法以合適的返回語句結(jié)尾。至關(guān)重要的是,這種行為貫穿長串長串的代碼!
它還能跟蹤子程序和嵌套層數(shù):語句的縮進(jìn)始終正確,并且Loop循環(huán)結(jié)構(gòu)始終關(guān)閉。
它甚至知道如何生成測(cè)試。
模型是如何做到的呢?讓我們觀察幾個(gè)隱狀態(tài)。
這是一個(gè)似乎是用來跟蹤代碼縮進(jìn)外層的神經(jīng)元(當(dāng)模型讀取字符作為輸入時(shí),代碼的狀態(tài)會(huì)決定字符的顏色,也就是當(dāng)模型試圖生成下個(gè)字符時(shí);紅色cell為否定,藍(lán)色cell為肯定):
這是一個(gè)倒數(shù)tab間空格數(shù)的神經(jīng)元:
這是一個(gè)與眾不同的3層LSTM,在TensorFlow的代碼庫中訓(xùn)練得出,供您試玩:
鏈接:http://karpathy.github.io/2015/05/21/rnn-effectiveness/
如果想查看更多的實(shí)例,你可以在網(wǎng)絡(luò)上找到許多其他有趣的實(shí)例。
探究LSTM內(nèi)部結(jié)構(gòu)
讓我們研究得更深一些。我們?cè)谏弦还?jié)中探討了幾個(gè)隱狀態(tài)的實(shí)例,但是我還想使用LSTM的cell狀態(tài)以及其他記憶機(jī)制。它們會(huì)如我們預(yù)期的那樣被激活嗎?或者說,是否存在令人意想不到的模式呢?
計(jì)數(shù)
為了進(jìn)行研究,讓我們先教LSTM進(jìn)行計(jì)數(shù)。(記住Java和Python語言下的LSTM是如何生成正確的縮進(jìn)的!)因此,我生成了這種形式的序列
(N個(gè)"a"后跟著一個(gè)分隔符X,X后跟著N個(gè)"b"字符,其中1 <= N <= 10),并且訓(xùn)練了一個(gè)帶有10個(gè)隱層神經(jīng)元的單層LSTM。
不出所料,LSTM在它的訓(xùn)練范圍內(nèi)學(xué)習(xí)得非常好——它甚至在超出范圍后還能類推幾步。(但是當(dāng)我們?cè)囍顾鼣?shù)到19時(shí),它便開始出現(xiàn)錯(cuò)誤。)
研究模型的內(nèi)部,我們期望找到一個(gè)能夠計(jì)算a's數(shù)量的隱層神經(jīng)元。我們也確實(shí)找到了一個(gè):
Neuron #2隱藏狀態(tài)
我用LSTM開發(fā)了一個(gè)小的網(wǎng)頁應(yīng)用(http://blog.echen.me/lstm-explorer),Neuron #2計(jì)數(shù)的似乎是它所能看到的a's和b's的總數(shù)。(記住根據(jù)神經(jīng)元的激活狀態(tài)對(duì)Cell進(jìn)行上色,顏色在暗紅色 [-1] 到暗藍(lán)色 [+1]之間變化。)
Cell狀態(tài)呢?它的表現(xiàn)類似:
Neuron #2Cell狀態(tài)
有趣的是,工作記憶看起來像是“更加清晰”的長期記憶。是不是整體都存在這種現(xiàn)象呢?
確實(shí)存在。(這和我們的預(yù)期完全相同,因?yàn)閠anh激活函數(shù)壓縮了長期記憶,同時(shí)輸出門會(huì)對(duì)記憶做出限制。)例如,以下是對(duì)所有10個(gè)cell狀態(tài)節(jié)點(diǎn)的快速概覽。我們看到許多淺色的cell,它們代表的是接近于0的數(shù)值。
LSTM Cell狀態(tài)的統(tǒng)計(jì)
相比之下,10個(gè)工作記憶神經(jīng)元的表現(xiàn)非常集中。神經(jīng)元1、3、5、7在序列的前半部分甚至完全處于0的狀態(tài)。
讓我們?cè)倏纯瓷窠?jīng)元#2。圖片中是候選記憶和輸出門,它們?cè)诟靼雮€(gè)序列中都相對(duì)較為穩(wěn)定——似乎神經(jīng)元每一步計(jì)算的都是a += 1或者b += 1。
輸入門
最后,這是對(duì)所有神經(jīng)元2的內(nèi)部的概覽。
如果你想要研究不同的計(jì)數(shù)神經(jīng)元,你可以使用這里提供的觀察器(visualizer)。
鏈接:http://blog.echen.me/lstm-explorer/#/network?file=counter
注意:這絕不是LSTM學(xué)習(xí)計(jì)數(shù)的唯一方法,我在本文中使用了相當(dāng)多的擬人手法。在我看來,觀察神經(jīng)網(wǎng)絡(luò)的行為非常有趣,也有助于構(gòu)建出更好的模型——畢竟神經(jīng)網(wǎng)絡(luò)中的許多想法都是對(duì)人類大腦的模擬,如果能觀察到我們未預(yù)料到的行為,也許可以設(shè)計(jì)出更加有效的學(xué)習(xí)機(jī)制。
Count von Count
讓我們看一個(gè)稍微復(fù)雜些的計(jì)數(shù)器。這次我生成了這種形式的序列:
(N個(gè)a's 中隨機(jī)夾雜幾個(gè)X's,然后加一個(gè)分隔符Y,Y后再跟N個(gè)b's)。LSTM仍需計(jì)算a's的數(shù)量,但是這次它需要忽視X's。
這是完整的LSTM(http://blog.echen.me/lstm-explorer/#/network?file=selective_counter)。我們預(yù)期看到一個(gè)計(jì)數(shù)神經(jīng)元,但是當(dāng)神經(jīng)元觀測(cè)到X時(shí),輸入門為零。的確是這樣!
上圖為Neuron 20的cell狀態(tài)。該狀態(tài)在讀到分隔符Y之前一直在增加,之后便一直減少至序列結(jié)尾——就如計(jì)算num_bs_left_to_print變量一樣,該變量在讀到a's時(shí)增加,讀到b's時(shí)減?。?/p>
如果觀察它的輸入門,它的確在忽視X's :
有趣的是,候選記憶在讀到不相關(guān)的X's時(shí)完全激活——這表明了設(shè)置輸入門的必要性。(但是,如果該輸入門不是模型結(jié)構(gòu)的一部分,那么該神經(jīng)網(wǎng)絡(luò)則很可能會(huì)通過其他方法學(xué)會(huì)如何忽視X's,至少在當(dāng)下簡單的實(shí)例中是這樣的。)
讓我們?cè)倏纯碞euron 10。
這個(gè)神經(jīng)元很有趣,因?yàn)樗挥性谧x取到分隔符"Y"時(shí)才會(huì)激活——但它仍能成功編碼出序列中a's的數(shù)量。(也許從圖片中很難看出來,但是當(dāng)讀取到序列中的Y's和a's數(shù)量相同時(shí),所有cell狀態(tài)的值要么完全相同,要么彼此間的誤差不超過0.1%。你可以看到,a's較少的Y's比其他a's較多的Y's顏色更淺。)也許某些其他神經(jīng)元看到神經(jīng)元10偷懶便幫了它一下。
記住狀態(tài)
接下來,我想看看LSTM是如何記住狀態(tài)的。我生成了這種形式的序列:
(即一個(gè)"A" or "B",緊跟1-10個(gè)x's,再跟一個(gè)分隔符"Y",結(jié)尾是開頭字符的小寫形式)。在這種情況下,神經(jīng)網(wǎng)絡(luò)需要記住它是處于"A" 狀態(tài)還是 "B"狀態(tài)中。我們期望找到一個(gè)在記憶以"A"開頭的序列時(shí)激活的神經(jīng)元,以及一個(gè)在記憶以"B"開頭的序列時(shí)激活的神經(jīng)元。我們的確找到了。
例如,下面是一個(gè)在讀到"A"時(shí)會(huì)激活的"A"神經(jīng)元,它在生成最后的字符之前會(huì)一直進(jìn)行記憶。注意:輸入門會(huì)忽視所有的"x"字符。
這是一個(gè)"B"神經(jīng)元:
有趣的是,盡管在神經(jīng)網(wǎng)絡(luò)讀到分隔符"Y" 之前,我們并不需要了解A狀態(tài)與B狀態(tài)的情況,但是隱狀態(tài)在讀取所有中間輸入的整個(gè)過程中都處于激活狀態(tài)。這似乎有些“效率低下”,或許是因?yàn)樯窠?jīng)元在計(jì)算x's的數(shù)量時(shí)還在完成一些其他的任務(wù)。
復(fù)制任務(wù)
最后,讓我們探究一下LSTM是如何學(xué)習(xí)復(fù)制信息的。(Java LSTM能夠記憶和復(fù)制Apache許可證。)
注意:思考一下LSTM的工作方式你就會(huì)知道,LSTM并不十分擅長記憶大量單獨(dú)且詳細(xì)的信息。例如,你可能注意到由LSTM生成的代碼有個(gè)大缺陷,那就是它常常會(huì)使用未定義的變量——LSTM無法記住哪些變量已經(jīng)被定義過并不令人感到驚訝,因?yàn)楹茈y使用單一的cell來有效地編碼多值信息,如特征等。同時(shí),LSTM并沒有可以用來串連相鄰記憶形成相關(guān)話語的自然機(jī)制。記憶網(wǎng)絡(luò)和神經(jīng)圖靈機(jī)(neural Turing machines)是神經(jīng)網(wǎng)絡(luò)的兩個(gè)擴(kuò)展,它們可以借助外部記憶控件來增強(qiáng)記憶能力,從而幫助修復(fù)這個(gè)問題。因此,雖然LSTM并不能十分高效地進(jìn)行復(fù)制,但是觀察它們進(jìn)行各種嘗試也非常有趣。
為了完成復(fù)制任務(wù),我在如下形式的序列上訓(xùn)練了一個(gè)小的2層LSTM。
(即先是一個(gè)由a's、b's和 c's組成的3字符序列,中間插一個(gè)分隔符"X",后半部分則組前半部分的序列相同)。
我不確定“復(fù)制神經(jīng)元”長什么樣,因此為了找到記憶初始序列部分元素的神經(jīng)元,我在神經(jīng)網(wǎng)絡(luò)讀取分隔符X時(shí)觀察了它們的隱狀態(tài)。由于神經(jīng)網(wǎng)絡(luò)需要對(duì)初始序列進(jìn)行編碼,它的狀態(tài)應(yīng)當(dāng)根據(jù)學(xué)習(xí)的內(nèi)容呈現(xiàn)出不同的模式。
例如,下圖繪制了神經(jīng)網(wǎng)絡(luò)讀取分隔符"X"時(shí)神經(jīng)元5的隱狀態(tài)。該神經(jīng)元顯然能夠從不同序列中區(qū)分出以"c"開頭的序列。
再舉一個(gè)例子,下圖是神經(jīng)網(wǎng)絡(luò)讀取分隔符"X"時(shí)神經(jīng)元20的隱狀態(tài)。該神經(jīng)元似乎能挑選出以"b"開頭的序列。
有趣的是,如果我們觀察神經(jīng)元20的cell狀態(tài),可以看出它幾乎獨(dú)自捕捉了整個(gè)3字符序列(由于神經(jīng)元是一維的,這并不簡單!):
這是神經(jīng)元20在整個(gè)序列中的cell狀態(tài)和隱狀態(tài)。注意:它的隱狀態(tài)在整個(gè)初始序列中都是關(guān)閉的(這也許是預(yù)料之中的事,因?yàn)橹恍枰谀骋稽c(diǎn)上被動(dòng)地保留該神經(jīng)元的記憶即可)。
但是,如果我們觀察得更仔細(xì)一些就會(huì)發(fā)現(xiàn):下一字符只要是"b",該神經(jīng)元就會(huì)激活。因此該神經(jīng)元并不是以"b"開頭的"b"神經(jīng)元,而是下一個(gè)字符是"b"的神經(jīng)元。
在我看來,這個(gè)模式適用于整個(gè)神經(jīng)網(wǎng)絡(luò)——所有神經(jīng)元似乎都在預(yù)測(cè)下一字符,而不是在記憶特定位置上的字符。例如,神經(jīng)元5似乎就是“預(yù)測(cè)下一字符是‘c’”的神經(jīng)元。
我不確定這是不是LSTM在復(fù)制信息時(shí)學(xué)習(xí)的默認(rèn)行為,也不確定是否存在其他復(fù)制機(jī)制。
狀態(tài)和門
為了真正深入探討和理解LSTM中不同狀態(tài)和門的用途,讓我們重復(fù)之前
狀態(tài)和隱藏狀態(tài)(記憶)cell.
我們?cè)緦ell狀態(tài)描述為長期記憶,將隱藏狀態(tài)描述為在需要時(shí)取出并聚焦這些記憶的方法。
因此,當(dāng)某段記憶當(dāng)前不相干時(shí),我們猜想隱藏狀態(tài)會(huì)關(guān)閉——這正是這個(gè)序列復(fù)制神經(jīng)元采取的行為。
遺忘門
遺忘門舍棄cell狀態(tài)的信息(0代表完全遺忘,1代表完全記?。?,因此我們猜想:遺忘門在需要準(zhǔn)確記憶什么時(shí)會(huì)完全激活,而當(dāng)不再需要已記住的信息時(shí)則會(huì)關(guān)閉。
我們認(rèn)為這個(gè)"A"記憶神經(jīng)元用的是同樣的原理:當(dāng)該神經(jīng)元在讀取x's時(shí),記憶門完全激活,以記住這是一個(gè)"A"狀態(tài),當(dāng)它準(zhǔn)備生成最后一個(gè)"a"時(shí),記憶門關(guān)閉。
輸入門(保存門)
我們將輸入門(我原理稱其為“保存門“)的作用描述為決定是否保存來自某一新輸入的信息。因此,在識(shí)別到無用的信息時(shí),它會(huì)自動(dòng)關(guān)閉。
這就是這個(gè)選擇計(jì)數(shù)神經(jīng)元的作用:它計(jì)算a's和b's的數(shù)量,但是忽略不相關(guān)的x's。
令人驚奇的是我們并未在LSTM方程式中明確規(guī)定輸入(保存)、遺忘(記憶)和輸出(注意)門的工作方式。神經(jīng)網(wǎng)絡(luò)自己學(xué)會(huì)了最好的工作方式。
擴(kuò)展閱讀
讓我們重新概括一下如何獨(dú)自認(rèn)識(shí)LSTM。
首先,我們要解決的許多問題在某種程度上都是連續(xù)的或暫時(shí)的,因此我們應(yīng)該將過去學(xué)到的知識(shí)整合到我們的模型中。但是我們知道,神經(jīng)網(wǎng)絡(luò)的隱層能編碼有用的信息。因此,為什么不將這些隱層用作為記憶,從某一時(shí)間步傳遞到下一時(shí)間步呢?于是我們便得到RNN。
從自己的行為中我們可以知道,我們不能隨心所欲地跟蹤信息;但當(dāng)我們閱讀關(guān)于政策的新文章時(shí),我們并不會(huì)立即相信它寫內(nèi)容并將其納入我們對(duì)世界的認(rèn)識(shí)中。我們會(huì)有選擇地決定哪些信息需要進(jìn)行保存、哪些信息需要舍棄以及下次閱讀該新聞時(shí)需要使用哪些信息來作出決策。因此,我們想要學(xué)習(xí)如何收集、更新和使用信息——為什么不借助它們自己的迷你神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)這些東西呢?這樣我們就得到了LSTM。
現(xiàn)在,我們已經(jīng)瀏覽了整個(gè)的過程,可以自己進(jìn)行模型的調(diào)整了。
例如,你可能認(rèn)為用LSTM區(qū)分長期記憶和短期記憶很沒意義——為什么不直接構(gòu)建一個(gè)LSTM?或者,你也有可能發(fā)現(xiàn),分離的記憶門和保存門有點(diǎn)冗余——任何被遺忘的信息都應(yīng)該由新的信息替換,反之亦然。這樣一來便可提出另一個(gè)很受歡迎的LSTM變量——GRU。
又或者,也許你認(rèn)為在決定需要記憶、保存和注意哪些信息時(shí)我們不應(yīng)該只依賴于工作記憶——為什么不使用長期記憶呢?這樣一來,你就會(huì)發(fā)現(xiàn)Peephole LSTMs。
復(fù)興神經(jīng)網(wǎng)絡(luò)
最后讓我們?cè)倏匆粋€(gè)實(shí)例,這個(gè)實(shí)例是用特朗普總統(tǒng)的推文訓(xùn)練出的2層LSTM。盡管這個(gè)數(shù)據(jù)集很小,但是足以學(xué)習(xí)很多模式。例如,下面是一個(gè)在話題標(biāo)簽、URL和@mentions中跟蹤推文位置的神經(jīng)元:
以下是一個(gè)正確的名詞檢測(cè)器(注意:它不只是在遇到大寫單詞時(shí)激活):
這是一個(gè)“輔助動(dòng)詞+ ‘to be’”的檢測(cè)器(包括“will be”、“I've always been”、“has never been”等關(guān)鍵詞)。
這是一個(gè)引用判定器:
甚至還有一個(gè)MSGA和大寫神經(jīng)元:
這是LSTM生成的相關(guān)聲明(好吧,其中只有一篇是真的推文;猜猜看哪篇是真的推文吧!):
不幸的是,LSTM只學(xué)會(huì)了如何像瘋子一樣瘋言瘋語。
總結(jié)
總結(jié)一下,這就是你學(xué)到的內(nèi)容:
這是你應(yīng)該儲(chǔ)存在記憶中的內(nèi)容:
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4771瀏覽量
100712 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5500瀏覽量
121111
原文標(biāo)題:詳解LSTM:神經(jīng)網(wǎng)絡(luò)的記憶機(jī)制是這樣煉成的
文章出處:【微信號(hào):AI_Thinker,微信公眾號(hào):人工智能頭條】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論