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