大話循環神經網絡(RNN)

—— 原文發佈於本人的微信公衆號「大數據與人工智能Lab」(BigdataAILab),歡迎關注。算法

 

 

在上一篇文章中,介紹了 卷積神經網絡(CNN)的算法原理,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,長短時間記憶網絡)spa


LSTM是一種RNN特殊的類型,能夠學習長期依賴信息。在不少問題上,LSTM都取得至關巨大的成功,並獲得了普遍的應用。.net

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

咱們先來看一下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),獲取更多資訊

相關文章
相關標籤/搜索