1. 程式人生 > >大話迴圈神經網路(RNN)

大話迴圈神經網路(RNN)

—— 原文釋出於本人的微信公眾號“大資料與人工智慧Lab”(BigdataAILab),歡迎關注。

 

卷積神經網路CNN在影象識別中有著強大、廣泛的應用,但有一些場景用CNN卻無法得到有效地解決,例如:

  • 語音識別,要按順序處理每一幀的聲音資訊,有些結果需要根據上下文進行識別;
  • 自然語言處理,要依次讀取各個單詞,識別某段文字的語義

這些場景都有一個特點,就是都與時間序列有關,且輸入的序列資料長度是不固定的。

而經典的人工神經網路、深度神經網路(DNN),甚至卷積神經網路(CNN),一是輸入的資料維度相同,另外是各個輸入之間是獨立的,每層神經元的訊號只能向上一層傳播,樣本的處理在各個時刻獨立。
 
而在現實生活中,例如對一個演講進行語音識別,那演講者每講一句話的時間幾乎都不太相同,而識別演講者的講話內容還必須要按照講話的順序進行識別。
這就需要有一種能力更強的模型:該模型具有一定的記憶能力,能夠按時序依次處理任意長度的資訊。這個模型就是今天的主角“迴圈神經網路”(Recurrent Neural Networks,簡稱RNN)。


迴圈神經網路(RNN),神經元的輸出可以在下一個時間戳直接作用到自身(作為輸入),看看下面的對比圖:
 
從上面的兩個簡化圖,可以看出RNN相比經典的神經網路結構多了一個迴圈圈,這個圈就代表著神經元的輸出在下一個時間戳還會返回來作為輸入的一部分,這些迴圈讓RNN看起來似乎很神祕,然而,換個角度想想,也不比一個經典的神經網路難於理解。RNN可以被看做是對同一神經網路的多次賦值,第i層神經元在t時刻的輸入,除了(i-1)層神經元在該時刻的輸出外,還包括其自身在(t-1)時刻的輸出,如果我們按時間點將RNN展開,將得到以下的結構圖:
 
在不同的時間點,RNN的輸入都與將之前的時間狀態有關,tn時刻網路的輸出結果是該時刻的輸入和所有歷史共同作用的結果,這就達到了對時間序列建模的目的。

【問題來了】關於RNN的長期依賴(Long-Term Dependencies)問題

理論上,RNN可以使用先前所有時間點的資訊作用到當前的任務上,也就是上面所說的長期依賴,如果RNN可以做到這點,將變得非常有用,例如在自動問答中,可以根據上下文實現更加智慧化的問答。然而在現實應用中,會面臨著不同的情況,例如:
(1)有一個語言模型是基於先前的詞來預測下一個詞。如果現在要預測以下這句話的最後一個單詞“白雲飄浮在(天空)”,我們並不需要任何其它上下文,最後一個詞很顯然就應該是 天空。在這樣的場景中,相關的資訊和預測的詞位置之間的間隔是非常小的,如下圖所示:
 
(2)假設我們要預測“我從小生長在四川……我會講流利的 (四川話)

”最後一個詞,根據最後一句話的資訊建議最後一個詞可能是一種語言的名字,但是如果我們要弄清楚是什麼語言,則需要找到離當前位置很遠的“四川”那句話的上下文。這說明相關資訊和當前預測位置之間的間隔就變得相當大。如下圖所示:
 
不幸的是,隨著間隔的不斷增大,RNN會出現“梯度消失”或“梯度爆炸”的現象,這就是RNN的長期依賴問題。例如我們常常使用sigmoid作為神經元的激勵函式,如對於幅度為1的訊號,每向後傳遞一層,梯度就衰減為原來的0.25,層數越多,到最後梯度指數衰減到底層基本上接受不到有效的訊號,這種情況就是“梯度消失”。因此,隨著間隔的增大,RNN會喪失學習到連線如此遠的資訊的能力。

【腫麼辦】神器來了:Long Short Term Memory網路(簡稱LSTM,長短期記憶網路)


LSTM是一種RNN特殊的型別,可以學習長期依賴資訊。在很多問題上,LSTM都取得相當巨大的成功,並得到了廣泛的應用。

一個LSTM單元的結構,如下圖所示:
 
從上圖可以看出,中間有一個cell(細胞),這也是LSTM用於判斷資訊是否有用的“處理器”。同時,cell旁邊被放置了三扇門,分別是輸入門(Input Gate)、遺忘門(Forget Gate)和輸出門(Output Gate)。一個資訊進入LSTM的網路當中,可以根據規則來判斷是否有用,只有符合要求的資訊才會被留下,不符合的資訊則會通過遺忘門被遺忘。
LSTM巧妙地通過“門”的形式,利用開關實現時間上的記憶功能,是解決長期依賴問題的有效技術。在數位電路中,門(gate)是一個二值變數{0,1},0代表關閉狀態、不允許任何資訊通過;1代表開放狀態,允許所有資訊通過。而LSTM中的“門”也是類似,但它是一個“軟”門,介於(0,1)之間,表示以一定的比例使資訊通過。
一聽起來就不明覺厲,那它是怎麼做到的呢?

我們先來看一下RNN按時間展開後的簡化圖,結構很簡單,標準RNN中的重複模組只包含單一的層,例如tanh層,如下圖:
 
LSTM有著類似的結構,但是重複的模組擁有一個不同的結構,LSTM 中的重複模組包含四個互動的層,其中輸入門(Input Gate)、遺忘門(Forget Gate)和輸出門(Output Gate)便在這裡面,如下圖:
 
下面介紹一下LSTM的工作原理,下面會結合結構圖和公式進行介紹,回顧一下最基本的單層神經網路的結構圖、計算公式如下,表示輸入是x,經過變換Wx+b和啟用函式f得到輸出y。下面會多次出現類似的公式

下面以一個語言模型的例子來進行介紹,這個模型是根據已經看到的詞來預測下一個詞,例如:


小明剛吃完米飯,現在準備要吃水果,然後拿起了一個()

(1)遺忘門(Forget Gate)
該門的示意圖如下,該門會讀取ht-1和xt的資訊,通過sigmoid層輸出一個介於0 到 1 之間的數值,作為給每個在細胞狀態Ct-1中的數字,0 表示“完全捨棄”,1 表示“完全保留”。
 
結合上面講到的語言預測模型例子,“小明剛吃完米飯”,這句話主語是“小明”,賓語是“米飯”,下一句話“現在準備要吃水果”,這時賓語已經變成了新的詞“水果”,那第三句話要預測的詞,就是跟“水果”有關了,跟“米飯”已經沒有什麼關係,因此,這時便可以利用“遺忘門”將“米飯”遺忘掉。

(2)輸入門(Input Gate)
下一步是確定什麼樣的新資訊被存放在細胞狀態中。這裡包含兩部分:
首先是經過“輸入門”,這一層是決定我們將要更新什麼值;然後,一個 tanh 層建立一個新的候選值向量,加入到狀態中,如下圖:
 
在這個語言預測模型的例子中,我們希望將新的代詞“水果”增加到細胞狀態中,來替代舊的需要忘記的代詞“米飯”。

現在來更新舊細胞的狀態,由Ct-1更新為Ct,更新方式為:(1)把舊狀態Ct-1與ft相乘(回顧一下,ft就是遺忘門,輸出遺忘程度,即0到1之間的值),丟棄掉需要丟棄的資訊(如遺忘門輸出0,則相乘後變成0,該資訊就被丟棄了);(2)然後再加上it與候選值相乘(計算公式見上圖)。這兩者合併後就變成一個新的候選值。
 
在這個語言預測模型的例子中,這就是根據前面確定的目標,丟棄舊的代詞資訊(米飯)並新增新的資訊(水果)的地方。

(3)輸出門(Output Gate)
最後我們要確定輸出什麼值,首先,通過一個sigmoid層來確定細胞狀態的哪個部分將要輸出出去,接著,把細胞狀態通過 tanh 進行處理(得到一個介於-1到1之間的值)並將它和 sigmoid的輸出結果相乘,最終將會僅僅輸出我們需要的那部分資訊。

 
在這個語言模型的例子中,因為看到了一個新的代詞(水果),可能需要輸出與之相關的資訊(蘋果、梨、香蕉……)。

以上就是標準LSTM的原理介紹,LSTM也出現了不少的變體,其中一個很流行的變體是Gated Recurrent Unit (GRU),它將遺忘門和輸入門合成了一個單一的更新門,同樣還混合了細胞狀態和隱藏狀態,以及其它一些改動。最終GRU模型比標準的 LSTM 模型更簡單一些,如下圖所示:

歡迎關注本人的微信公眾號“大資料與人工智慧Lab”(BigdataAILab),獲取更多資訊