本文節(jié)選自《深度學習入門之PyTorch》,本書從人工智能的介紹入手,了解機器學習和深度學習的基礎理論,并學習如何用PyTorch框架對模型進行搭建。
對于人類而言,以前見過的事物會在腦海里面留下記憶,雖然隨后記憶會慢慢消失,但是每當經(jīng)過提醒,人們往往能夠重拾記憶。在神經(jīng)網(wǎng)絡的研究中,讓模型充滿記憶力的研究很早便開始了,Saratha Sathasivam 于1982 年提出了霍普菲爾德網(wǎng)絡,但是由于它實現(xiàn)困難,在提出的時候也沒有很好的應用場景,所以逐漸被遺忘。深度學習的興起又讓人們重新開始研究循環(huán)神經(jīng)網(wǎng)絡(Recurrent Neural Network),并在序列問題和自然語言處理等領域取得很大的成功。
本文將從循環(huán)神經(jīng)網(wǎng)絡的基本結(jié)構(gòu)出發(fā),介紹RNN在自然語言處理中的應用及其PyTorch 實現(xiàn)。
循環(huán)神經(jīng)網(wǎng)絡前一章介紹了卷積神經(jīng)網(wǎng)絡,卷積神經(jīng)網(wǎng)絡相當于人類的視覺,但是它并沒有記憶能力,所以它只能處理一種特定的視覺任務,沒辦法根據(jù)以前的記憶來處理新的任務。那么記憶力對于網(wǎng)絡而言到底是不是必要的呢?很顯然在某些問題上是必要的,比如,在一場電影中推斷下一個時間點的場景,這個時候僅依賴于現(xiàn)在的情景并不夠,需要依賴于前面發(fā)生的情節(jié)。對于這樣一些不僅依賴于當前情況,還依賴于過去情況的問題,傳統(tǒng)的神經(jīng)網(wǎng)絡結(jié)構(gòu)無法很好地處理,所以基于記憶的網(wǎng)絡模型是必不可少的。
循環(huán)神經(jīng)網(wǎng)絡的提出便是基于記憶模型的想法,期望網(wǎng)絡能夠記住前面出現(xiàn)的特征,并依據(jù)特征推斷后面的結(jié)果,而且整體的網(wǎng)絡結(jié)構(gòu)不斷循環(huán),因為得名循環(huán)神經(jīng)
網(wǎng)絡。
循環(huán)神經(jīng)網(wǎng)絡的基本結(jié)構(gòu)特別簡單,就是將網(wǎng)絡的輸出保存在一個記憶單元中,這個記憶單元和下一次的輸入一起進入神經(jīng)網(wǎng)絡中。使用一個簡單的兩層網(wǎng)絡作為示范,在它的基礎上擴充為循環(huán)神經(jīng)網(wǎng)絡的結(jié)構(gòu),我們用圖1簡單地表示。
可以看到網(wǎng)絡在輸入的時候會聯(lián)合記憶單元一起作為輸入,網(wǎng)絡不僅輸出結(jié)果,還會將結(jié)果保存到記憶單元中,圖1就是一個最簡單的循環(huán)神經(jīng)網(wǎng)絡在一次輸入時的結(jié)構(gòu)示意圖。
輸入序列的順序改變, 會改變網(wǎng)絡的輸出結(jié)果,這是因為記憶單元的存在,使得兩個序列在順序改變之后記憶單元中的元素也改變了,所以會影響最終的輸出結(jié)果。
圖1 將一個數(shù)據(jù)點傳入網(wǎng)絡
圖1是序列中一個數(shù)據(jù)點傳入網(wǎng)絡的示意圖,那么整個序列如何傳入網(wǎng)絡呢?將序列中的每個數(shù)據(jù)點依次傳入網(wǎng)絡即可,如圖2所示。
圖2 將整個序列傳入網(wǎng)絡
無論序列有多長,都能不斷輸入網(wǎng)絡,最終得到結(jié)果??赡芸吹竭@里,讀者會有一些疑問,圖2中每一個網(wǎng)絡是不是都是獨立的權(quán)重?對于這個問題,先考慮一下如果是不同的序列,那么圖2 中格子的數(shù)目就是不同的,對于一個網(wǎng)絡結(jié)構(gòu),不太可能出現(xiàn)這種參數(shù)數(shù)目變化的情況。
事實上,這里再次使用了參數(shù)共享的概念,也就是說雖然上面有三個格子,其實它們都是同一個格子,而網(wǎng)絡的輸出依賴于輸入和記憶單元,可以用圖5.5表示。
如圖5.5所示,左邊就是循環(huán)神經(jīng)網(wǎng)絡實際的網(wǎng)絡流,右邊是將其展開的結(jié)果,可以看到網(wǎng)絡中具有循環(huán)結(jié)構(gòu),這也是循環(huán)神經(jīng)網(wǎng)絡名字的由來。同時根據(jù)循環(huán)神經(jīng)網(wǎng)絡的結(jié)構(gòu)也可以看出它在處理序列類型的數(shù)據(jù)上具有天然的優(yōu)勢,因為網(wǎng)絡本身就是一個序列結(jié)構(gòu),這也是所有循環(huán)神經(jīng)網(wǎng)絡最本質(zhì)的結(jié)構(gòu)。
圖3 網(wǎng)絡的輸入和記憶單元
循環(huán)神經(jīng)網(wǎng)絡也可以有很深的網(wǎng)絡層結(jié)構(gòu),如圖4所示。
圖4 深層網(wǎng)絡結(jié)構(gòu)
可以看到網(wǎng)絡是單方向的,這代表網(wǎng)絡只能知道單側(cè)的信息,有的時候序列的信息不只是單邊有用,雙邊的信息對預測結(jié)果也很重要,比如語音信號,這時候就需要看到兩側(cè)信息的循環(huán)神經(jīng)網(wǎng)絡結(jié)構(gòu)。這并不需要用兩個循環(huán)神經(jīng)網(wǎng)絡分別從左右兩邊開始讀取序列輸入,使用一個雙向的循環(huán)神經(jīng)網(wǎng)絡就能完成這個任務,如圖5所示。
圖5 雙向循環(huán)神經(jīng)網(wǎng)絡