安妮 若樸 編譯整理
量子位 出品 | 公眾號 QbitAI
作者簡介:Edwin Chen,在MIT研究數學/語言學,在微軟研究院研究語音識別,在Clarium研究量化交易,在Twitter研究廣告,在Google研究機器學習。
在這篇文章中,作者首先介紹了一下神經網絡、RNN和LSTM的基本概念,然後舉例對比了三種網絡的性能,並且進一步講解了LSTM。
LSTM是神經網絡一個相當簡單的延伸擴展,而且在過去幾年裡取得了很多驚人成就。我第一次了解到LSTM時,簡直有點目瞪口呆。不知道你能不能從下圖中發現LSTM之美。
OK,咱們這就開始切入正題。先簡單介紹一下神經網絡和LSTM。
神經網絡
假設我們有一個來自電影的圖像序列,然後想用一個活動來標記每張圖像。例如這是一場打鬥麼?角色在交談?角色在吃東西?
應該怎麼做?
一種方法是忽略圖像的順序屬性,把每張圖片單獨考慮,構建一個單張圖片的分類器。例如,給出足夠的圖片和標籤:
算法首先學習檢測形狀、邊緣等低級模式
在更多數據的驅動下,算法學會將低級模式組合成複雜形態,例如一個橢圓形上面有兩個圓形加一個三角形可以被認為是人臉
如果還有更多數據,算法會學到將這些高級模式映射到活動本身,例如有嘴、有牛排、有叉子的場景可能是吃飯
這就是一個深度神經網絡:得到一個圖像輸入,返回一個活動輸出。
神經網絡的數學原理如圖所示:
用RNN記住信息
忽略圖像的順序可以算是初步的機器學習。更進一步,如果是一幕海灘的場景,我們應該在後續幀中強化海灘相關的標記:如果有人在水中,大概可以標記為遊泳;而閉眼的場景,可能是在曬太陽。
同樣,如果場景是一個超市,有人手拿培根,應該被標記為購物,而不是做飯。
我們想做的事情,是讓模型追蹤世界的狀態。
看到每個圖像後,模型輸出一個標籤,並更新其對世界的知識。例如,模型能學會自動發現和追蹤信息,例如位置、時間和電影進度等。重要的是,模型應該能自動發現有用的信息。
對於給定的新圖像,模型應該融合收集而來的知識,從而更好的工作。
這樣就成了一個循環神經網絡RNN。除了簡單的接收一張圖片返回一個活動標記之外,RNN會通過給信息分配不同的權重,從而在內部保留了對世界的記憶,以便更好的執行分類任務。
RNN的數學原理如圖所示:
通過LSTM實現長期記憶
模型如何更新對世界的認知?到目前為止,還沒有任何規則限制,所以模型的認知可能非常混亂。這一幀模型認為人物身處美國,下一幀如果出現了壽司,模型可能認為人物身處日本……
這種混亂的背後,是信息的快速變換和消失,模型難以保持長期記憶。所以我們需要讓網絡學習如何更新信息。方法如下:
增加遺忘機制。例如當一個場景結束是,模型應該重置場景的相關信息,例如位置、時間等。而一個角色死亡,模型也應該記住這一點。所以,我們希望模型學會一個獨立的忘記/記憶機制,當有新的輸入時,模型應該知道哪些信息應該丟掉。
增加保存機制。當模型看到一副新圖的時候,需要學會其中是否有值得使用和保存的信息。
所以當有一個新的輸入時,模型首先忘掉哪些用不上的長期記憶信息,然後學習新輸入有什麼值得使用的信息,然後存入長期記憶中。
把長期記憶聚焦到工作記憶中。最後,模型需要學會長期記憶的哪些部分立即能派上用場。不要一直使用完整的長期記憶,而要知道哪些部分是重點。
這樣就成了一個長短期記憶網絡(LSTM)。
RNN會以相當不受控制的方式在每個時間步長內重寫自己的記憶。而LSTM則會以非常精確的方式改變記憶,應用專門的學習機制來記住、更新、聚焦於信息。這有助於在更長的時期內跟蹤信息。
LSTM的數學原理如圖所示:
卡比獸
△神奇寶貝中的卡比獸
我們不妨拿《神奇寶貝》中的卡比獸對比下不同類別的神經網絡。
神經網絡
當我們輸入一張卡比獸被噴水的圖片時,神經網絡會認出卡比獸和水,推斷出卡比獸有60%的概率在洗澡,30%的概率在喝水,10%的概率被攻擊。
循環神經網絡(RNN)
在隱藏狀態(Hidden State)為「戰鬥場景開始」的情況下輸入神奇寶貝噴水進攻圖,RNN能夠根據「嘴中噴水」的場景推測圖一神奇寶貝是在進攻的概率為85%。之後我們在記憶為「在戰鬥、敵人在攻擊和敵人是水性攻擊」三個條件下輸入圖片二,RNN就會分析出「卡比獸被攻擊」是概率最大的情況。
LSTM
在長期記憶(Long-Term Memory)為「卡比獸喜歡吃竹子」、「每個戰鬥回合為一分鐘」和「敵人在屏幕中央」,工作記憶(Working Memory)為「每個戰鬥回合為一分鐘」「敵人在屏幕中央」的情況下,輸入卡比獸被噴水的圖片,LSTM會選擇性處理一些信息。它選擇性記憶了卡比獸的痛苦的表情,忘掉了「屏幕中央的是敵人」這條信息,得出卡比獸被攻擊的可能性最大。
學會編碼
有一種字符級的LSTM模型,可以通過輸入的字符級序列來預測下一個可能出現的字符。我將用這種模型向大家展示LSTM的用法。
雖然這個方法看起來不成熟,但不得不說字符級的模型使非常實用,個人覺得比單詞級模型還要實用一些。比如下面這兩個例子:
1. 假設有一種代碼自動填充器足夠智能,允許手機端編程。
理論上講,LSTM可以跟蹤當前所用方法的返回類型,更好地建議返回哪個變量;也可以通過返回錯誤類型告訴你程序是否有bug。
2. 像機器翻譯這種自然語言處理程序通常很難處理生僻術語
怎樣才能把之前從未見過的形容詞轉換成相應的副詞?即使知道一條推文是什麼意思,但怎樣為它生成標籤?字符級模型就可以幫你處理這些新出現的術語,不過這也是另外一個領域研究的事情了。
所以在一開始,我用亞馬遜AWS彈性計算雲EC2的p2.xlarge在Apache Commons Lang代碼庫訓練了三層LSTM,幾個小時後生成了這個程序:
雖然這段代碼並不完美,但已經比我認識的很多數據專家編寫的代碼優秀了。從這裡我們可以看出LSTM已經學會很多有趣且正確的編碼行為:
可以構建class:優先放許可證,之後是程序包和導入包,再之後放注釋和類別定義,最後是變量和方法。它也知道如何創造方法:需要遵循正確的描述順序,查看裝飾器是否處於正確的位置,以適當的語句返回無類型指針。重要的是,這些行為還跨越了大量的代碼。
可以跟蹤子程序和嵌套級別:如果語句循環總是被關閉的話,縮進處理是一個不錯的選擇。
它甚至知道如何創建測試。
此模型到底是怎樣做到上面這些功能的呢?我們可以看幾個隱藏狀態。
這是一個神經元,看起來它似乎在追蹤代碼的縮進級別。在神經元以字符為輸入進行讀取,例如試圖生成下一個字符的時候,每個字符都根據神經元的狀態被標記了顏色,紅色表示負值,藍色表示正值。
這裡有一個可以計算兩個標籤距離的神經元:
還有一個在TensorFlow代碼庫中生成的不同3層LSTM的有趣輸出結果:
研究LSTM的內部結構
上面我們了解了幾個隱藏狀態的例子,不妨再聊得深入一些。我在考慮LSTM cell和它們的其他記憶機制。或許它們之間也存在令人驚嘆的關係。
計數
為了探究這個問題,我們需要先教LSTM學會計數,所以我生成了下面這個序列:
aaaaaXbbbbb
這串序列中,在N個a之後跟著一個定界符X,之後又跟著N個字符b。在這裡,1<=n<=10。我們用此序列訓練帶有10個隱藏神經元的單層lstm。< p="">
正如預期的那樣,LSTM在其訓練範圍內表現良好,甚至可以生成一些超過了訓練範圍的東西。
aaaaaaaaaaaaaaaXbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbbbb
我們期望找到一個隱藏的狀態神經元計算a的數量:
為此我還專門構建了一個小型網頁應用,它不僅可以在剛剛的基礎上計算a的數量,還能計算b的數量。
此時cell表現很相似:
還有一件有趣的事情,工作記憶看起來像一個長期記憶的增強版,這在一般情況下是正常的嗎?
答案是肯定的,這也和我們期望的完全一樣。因為長期記憶被雙曲正切激活函數限制了輸出內容。下面是10個cell狀態節點】的總覽,我們可以看到很多代表接近0值的淺色cell。
相比之下,這10個工作記憶的神經元看起來更專注,1號、3號、5號和7號在序列的前半部分看起來都是0。
那我們再看看2號神經元,這裡給大家展示一些備用記憶和輸入門(Input Gate)。它們在神經元的每半部分都是穩定的——就像神經元在每個步驟都在計算a+=1或b+=1一樣。
最終,我們得到了所有神經元的內部結構:
如果你也想為不同的神經元計數,可以看看這個可視化工具。
可視化工具連結:
http://blog.echen.me/lstm-explorer/#/network?file=counter
伯爵
還記得美國公共廣播協會(PBS)製作播出的兒童教育電視節目《芝麻街》,裡面有一個魔方吸血鬼樣子設計的玩偶,叫伯爵。他喜歡數數,對計算機的興趣沒有邊界。我就把這一部分的標題命名為伯爵好了。
《芝麻街》裡的計算機愛好者「數數伯爵」
現在我們看一個稍微複雜一點的計數器,這一次我生成了序列化的表單是:
aaXaXaaYbbbbb
上面這串序列的特點是N個a和X任意交叉排列,再加入一個定界符Y,最後加入N個b。LSTM仍需計數a的數目,這次也同樣需要忽略X。
完整的LSTM連結:
http://blog.echen.me/lstm-explorer/#/network?file=selective_counter
我們希望得到遇到X時輸入門是0的計數神經元
上面就是20號神經元的cell狀態。在還沒有到達定界符Y時它會一直增大,之後一直遞減直到序列的末尾——就像它計算的是num_bs_left_to_print變量,根據a的增量和b的遞減不斷變化。
它的輸入門確實忽略了X:
有趣的是,備用存儲器完全激活了不相關的定界符X,所以我們還是需要一個輸入門。(如果輸入門不是架構的一部分,想必神經網絡將學會用其他方式學會忽略X)
那我們繼續看10號神經元。
這個神經元很有意思,因為它只有在讀取定界符Y時才可以激活,但它仍然試圖編碼目前在序列中看到的a。這很難從圖中看出,但當讀取到Y屬於有相同數量的a的序列時,所有的元胞狀態都是幾乎相同的。可以看到,序列中a越少,Y的顏色越淺。
記住狀態
接下來,我想看看LSTM是如何記住元胞狀態的。我在再次生成一些序列:
AxxxxxxYa
BxxxxxxYb
在這個序列中,A或B後面可以接1-10個x,之後接入定界符Y,最後以開頭字母的小寫結尾。這種神經網絡需要記住序列是否為一個A或B序列狀態。
我們希望找到一個神經元,當記住這個序列以A開始時觸發,另一個神經元會在記住它以B開始時觸發。我們也確實找到了。
例如,這裡有一個神經元A,當它讀到一個A時,它會激活,並記住它,直到需要生成最終的字符為止。注意,輸入門忽略了中間所有的x字符。
這裡還有一個副本B:
有趣的是,直到網絡讀取Y定界符前,A和B的狀態信息都是不需要的,但隱藏的狀態還是會在所有中間輸入中觸發。這看起來有點「低效」,但也許是因為這個神經元還承擔了計算x數量的任務。
複製任務
最後,我們看看如何讓LSTM複製信息。
對於這個訓練任務就,我訓練了兩層的LSTM序列:
baaXbaa
abcXabc
也就是說,這是一個由a、b、c組成的三個字符的子序列,後接定界符X,最後接一個相同的序列。
我並不確定複製神經元是什麼樣,所以為了弄清存儲最初子序列部分的神經元,我查看了它們在讀取定界符X時的隱藏態。因為網絡需要對初始子序列進行編碼,因此它的狀態應該根據所學內容的不同顯示不同的格式。
以下面這張圖表為例,它繪製了5號神經元在讀取定界符X時的隱藏狀態。神經元顯然能區分序列是不是以「c」開始。
再舉一個例子,下圖是20號神經元在讀取X時的隱藏狀態,它好像是把從b開始的序列都挑了出來。
如果觀察20號神經元的cell狀態,你會發現它幾乎可以自己捕捉全部3個字符的子序列。在只有一個維度的情況下能做到這樣,非常了不起。
這是20號神經元的cell在整個序列中的隱藏狀態。注意它的隱藏狀態已經在全部初始子序列中被切斷。
然而,如果我們仔細觀察會發現,每當下一個字符是b時,神經元就會被觸發。因此與其說這個神經元代表的是一個從b開始的序列,不如說是下一個字符是b的預測器。
據我所知,這種模式似乎在整個網絡中都保持著——所有的神經元都在預測下一個字符,而不是記住特定位置的字符。例如,5號神經元似乎是「下一個字符是c」的預測器。
我不確定這是否是LSTM在複製信息時學會的默認行為,或者是其他的複製機制也會這樣做。
狀態和門
為了真正了解不同LSTM中不同的狀態和門的作用,我們換個角度重新講講上一部分。
cell狀態和隱藏狀態
我們最初把cell狀態描述為一種長期記憶,而隱藏狀態是一種提取和聚焦這些記憶的方法。
所以當記憶與當前無關時,我們期望隱藏狀態可以關閉——前面講的序列複製神經元就是這樣。
遺忘門
遺忘門(Forget Gate)會丟棄cell狀態的信息(0意味著完全忘記,1意味著完全記住),所以我們期望當它需要記住一些確切的東西時,它可以被完全激活;當不再需要這些信息時,它可以被再次關閉。
這就是我們看到的這個A記憶神經元:遺忘門在被觸發時記住當它經過x時的A狀態,當它準備生成最後的a時將關閉。
輸入門(保存門)
輸入門(Input Gate,我以前叫它「保存門」)決定了是否從新輸入中保存信息。因此它需要在遇到無用信息時關閉。
這也就是選擇性計數神經元所做的:計算a和b的值,但忽略不相關的x。
令人驚訝的是,我們的LSTM方程中沒有任何地方指定了輸入、遺忘和輸出門的工作方式,神經網絡會自學什麼是最好的。
擴展
現在我們探討一下LSTM是如何出現的。
首先,很多我們要解決的問題都是按時序或者一定順序排列的,我們可以將過去的經驗融合到我們的模型中來。但是我們已經知道神經網絡的隱藏層編碼著重要的信息,所以我們為何不把這些隱藏層作為從一個時間步傳遞到另一個時間步的記憶呢?因此,出現了循環神經網絡(RNN)
人類不會輕易地相信一些信息——當我們讀到一篇關於政治的文章時,我們不會立刻相信我們讀到的並把它當成自己的人生信仰。我們會選擇哪些信息值得記住,哪些信息需要丟棄,哪些信息可以在下次閱讀時提供一些決策依據。也就是說,我們想要學習如何收集、修正和應用信息。那我們為什麼不讓神經網絡來學習這些呢?所以就有了LSTM
任務都完成了,現在我們可以對它進行修改。
你可能會覺得LSTM區分長期記憶和工作記憶時傻傻的:為什麼不合二為一?又或許你發現了獨立記憶門和存儲門有點多餘。現在又有人提出一種新的LSTM變種,我們稱之為GRU(Gated Recurrent Units)
想了解更多GRU專業知識?這裡有一份論文:
https://arxiv.org/abs/1412.3555
當決定記憶存儲和集中你哪些信息時,我們不能單獨依賴工作記憶,那為什麼不能用長期記憶呢?所以我們又發現了Peephole LSTM。
Peephole LSTM Paper(PDF):
http://machinelearning.wustl.edu/mlpapers/paper_files/GersSS02.pdf
實現神經網絡偉大復興
讓我們看看最後這個例子,我雙層LSTM在川普的推特上訓練。儘管這個數據集很「大」,它仍然學會了很多的模式。
比如,這是一個記錄話題標籤、URL和@的神經元。
這裡還有一個專有名詞檢測器(注意:它不是只在遇到大寫字母時激活):
這是一個助動詞+「to be」檢測器(包括「will be」、「I』ve always been」、「has never been」等形式):
這是一個引用屬性:
還有一個MAGA(多智能體遺傳算法)和大寫的神經元:
下面是LSTM發布川普的推文聲明——其實只有一個是真的,不妨猜猜看:
川普數據集在這裡:https://www.kaggle.com/benhamner/clinton-trump-tweets
總結
這篇文章寫到這裡,已經基本接近尾聲了。在結束前,我們再回顧一下你收穫了什麼:
你需要記住的是:
雖然本文的篇幅較長,且講解內容較多,但LSTM仍然是一個沒有止境的研究領域。如果你恰巧對LSTM感興趣,那就鑽進去好好研究吧。
【完】
學習推薦
6月15號,量子位組織了一場沙龍,邀請到了圖森首席科學家王乃巖博士分享自動駕駛相關話題,歡迎大家長按下圖掃碼報名~
One More Thing…
今天AI界還有哪些事值得關注?在量子位(QbitAI)公眾號對話界面回復「今天」,看我們全網搜羅的AI行業和研究動態。筆芯~
△掃碼強行關注『量子位』
追蹤人工智慧領域最勁內容