1. 程式人生 > >DeepLearning之RNN和LSTM詳解及實現

DeepLearning之RNN和LSTM詳解及實現

RNN

1. 什麼是RNNs
RNNs的目的使用來處理序列資料。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連線的,每層之間的節點是無連線的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNNs之所以稱為迴圈神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的資訊進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連線而是有連線的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNNs能夠對任何長度的序列資料進行處理。但是在實踐中,為了降低複雜性往往假設當前的狀態只與前面的幾個狀態相關,下圖便是一個典型的RNNs:
這裡寫圖片描述

在圖中:有一條單向流動的資訊流是從輸入單元到達隱藏單元的,與此同時另一條單向流動的資訊流從隱藏單元到達輸出單元。在某些情況下,RNNs會打破後者的限制,引導資訊從輸出單元返回隱藏單元,這些被稱為“Back Projections”,並且隱藏層的輸入還包括上一隱藏層的狀態,即隱藏層內的節點可以自連也可以互連。(這實際上就是LSTM)

右側為計算時便於理解記憶而產開的結構。簡單說,x為輸入層,o為輸出層,s為隱含層,而t指第幾次的計算;V,W,U為權重,其中計算第t次的隱含層狀態時為:

St=f(UXt+WSt1)
實現當前輸入結果與之前的計算掛鉤的目的。對RNN想要更深入的瞭解可以戳
這裡

表達得更直觀的圖有:
這裡寫圖片描述

這裡寫圖片描述
按照上圖所示,可知道RNN網路前向傳播過程中滿足下面的公式(參考文獻Learning Recurrent Neural Networks with Hessian-Free Optimization):
這裡寫圖片描述
其代價函式可以是重構的誤差:
這裡寫圖片描述
也可以是交叉熵:
這裡寫圖片描述

2. RNN用途

RNNs已經被在實踐中證明對NLP是非常成功的。如詞向量表達、語句合法性檢查、詞性標註等。在RNNs中,目前使用最廣泛最成功的模型便是LSTMs(Long Short-Term Memory,長短時記憶模型)模型,該模型通常比vanilla RNNs能夠更好地對長短時依賴進行表達,該模型相對於一般的RNNs,只是在隱藏層做了手腳。對於LSTMs,後面會進行詳細地介紹。RNNs在NLP中的應用有:
語言模型與文字生成(Language Modeling and Generating Text),機器翻譯(Machine Translation),語音識別(Speech Recognition),影象描述生成 (Generating Image Descriptions)。

3.RNN劣勢

由於RNN模型如果需要實現長期記憶的話需要將當前的隱含態的計算與前n次的計算掛鉤,即St = f(U*Xt + W1*St-1 + W2*St-2 + … + Wn*St-n),那樣的話計算量會呈指數式增長,導致模型訓練的時間大幅增加,因此RNN模型一般不直接用來進行長期記憶計算。另外,傳統RNN處理不了長期依賴問題,這是個致命傷。但之後的LSTM就解決了這問題。

LSTM

1. LSTM是什麼

Long Short Term 網路—— 一般就叫做 LSTM ——是一種 RNN 特殊的型別,可以學習長期依賴資訊。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,並在近期被 Alex Graves 進行了改良和推廣。在很多問題,LSTM 都取得相當巨大的成功,並得到了廣泛的使用。

LSTM 通過刻意的設計來避免長期依賴問題。記住長期的資訊在實踐中是 LSTM 的預設行為,而非需要付出很大代價才能獲得的能力!

所有 RNN 都具有一種重複神經網路模組的鏈式的形式。在標準的 RNN 中,這個重複的模組只有一個非常簡單的結構,例如一個 tanh 層。
這裡寫圖片描述
標準 RNN 中的重複模組包含單一的層

LSTM 同樣是這樣的結構,但是重複的模組擁有一個不同的結構。不同於 單一神經網路層,這裡是有四個,以一種非常特殊的方式進行互動。

這裡寫圖片描述
LSTM 中的重複模組包含四個互動的層

不必擔心這裡的細節。我們會一步一步地剖析 LSTM 解析圖。現在,我們先來熟悉一下圖中使用的各種元素的圖示。

這裡寫圖片描述
LSTM 中的圖示

在上面的圖例中,每一條黑線傳輸著一整個向量,從一個節點的輸出到其他節點的輸入。粉色的圈代表 pointwise 的操作,諸如向量的和,而黃色的矩陣就是學習到的神經網路層。合在一起的線表示向量的連線,分開的線表示內容被複制,然後分發到不同的位置。

2.LSTM核心內容

LSTM 的關鍵就是細胞狀態(cell),水平線在圖上方貫穿執行。細胞狀態類似於傳送帶。直接在整個鏈上執行,只有一些少量的線性互動。資訊在上面流傳保持不變會很容易。
這裡寫圖片描述

LSTM 有通過精心設計的稱作為“門”的結構來去除或者增加資訊到細胞狀態的能力。門是一種讓資訊選擇式通過的方法。他們包含一個 sigmoid 神經網路層和一個 pointwise 乘法操作。
這裡寫圖片描述
Sigmoid 層輸出 0 到 1 之間的數值,描述每個部分有多少量可以通過。0 代表“不許任何量通過”,1 就指“允許任意量通過”!

LSTM 擁有三個門,來保護和控制細胞狀態。

3.逐步理解LSTM

在我們 LSTM 中的第一步是決定我們會從細胞狀態中丟棄什麼資訊。這個決定通過一個稱為 忘記門層 完成。該門會讀取ht1xt,輸出一個在 0 到 1 之間的數值給每個在細胞狀態Ct1中的數字。1 表示“完全保留”,0 表示“完全捨棄”。

讓我們回到語言模型的例子中來基於已經看到的預測下一個詞。在這個問題中,細胞狀態可能包含當前 主語 的類別,因此正確的 代詞 可以被選擇出來。當我們看到新的 代詞 ,我們希望忘記舊的代詞 。
這裡寫圖片描述
決定丟棄資訊
下一步是確定什麼樣的新資訊被存放在細胞狀態中。這裡包含兩個部分。第一,sigmoid 層稱 “輸入門層” 決定什麼值我們將要更新。然後,一個 tanh 層建立一個新的候選值向量,C~t,會被加入到狀態中。下一步,我們會講這兩個資訊來產生對狀態的更新。

在我們語言模型的例子中,我們希望增加新的代詞的類別到細胞狀態中,來替代舊的需要忘記的代詞。
這裡寫圖片描述

確定更新的資訊
現在是更新舊細胞狀態的時間了,Ct1Ct。前面的步驟已經決定了將會做什麼,我們現在就是實際去完成。

我們把舊狀態與ft相乘,丟棄掉我們確定需要丟棄的資訊。接著加上itC~t。這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。

在語言模型的例子中,這就是我們實際根據前面確定的目標,丟棄舊代詞的類別資訊並新增新的資訊的地方。
這裡寫圖片描述
更新細胞狀態
最終,我們需要確定輸出什麼值。這個輸出將會基於我們的細胞狀態,但是也是一個過濾後的版本。首先,我們執行一個 sigmoid 層來確定細胞狀態的哪個部分將輸出出去。接著,我們把細胞狀態通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)並將它和 sigmoid 門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。

在語言模型的例子中,因為他就看到了一個 代詞 ,可能需要輸出與一個 動詞 相關的資訊。例如,可能輸出是否代詞是單數還是負數,這樣如果是動詞的話,我們也知道動詞需要進行的詞形變化。
這裡寫圖片描述
輸出資訊

4.總結數學表示式
Gates:
這裡寫圖片描述
輸入變換:
這裡寫圖片描述
狀態更新:
這裡寫圖片描述
使用圖片描述類似下圖:
這裡寫圖片描述
此圖對應於本文上面LSTM的結構圖。

LSTM程式碼實現

具體可參考這篇文章,利用Torch7實現。以後有機會會更新python實現。

參考文獻(排名分先後):

相關推薦

DeepLearningRNNLSTM實現

RNN 1. 什麼是RNNs RNNs的目的使用來處理序列資料。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連線的,每層之間的節點是無連線的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需

最大流Ford-Fulkerson方法實現

最大流問題常常出現在物流配送中,可以規約為以下的圖問題。最大流問題中,圖中兩個頂點之間不能同時存在一對相反方向的邊。 邊上的數字為該條邊的容量,即在該條邊上流過的量的上限值。最大流問題就是在滿足容量限制條件下,使從起點s到終點t的流量達到最大。在介紹解決最大流問題的For

結點對最短路徑Floyd演算法原理實現

上兩篇部落格介紹了計算單源最短路徑的Bellman-Ford演算法和Dijkstra演算法。Bellman-Ford演算法適用於任何有向圖,即使圖中包含負環路,它還能報告此問題。Dijkstra演算法執行速度比Bellman-Ford演算法要快,但是其要求圖中不能包含負權重

http狀態碼301302區別——辛酸的探索

一直對http狀態碼301和302的理解比較模糊,在遇到實際的問題和翻閱各種資料瞭解後,算是有了一定的理解。這裡記錄下,希望能有新的認識。大家也共勉。 官方的比較簡潔的說明:         301 redirect: 301 代表永久性轉移(Permanently

微信支付寶支付模式實現

配置 其余 logs https 朋友 一個 target 多租戶 對比   繼上篇《微信和支付寶支付模式詳解及實現》到現在已經有半年時間了,這期間不少朋友在公號留言支付相關的問題,最近正好也在處理公司支付相關的對接,打算寫這篇來做一個更進一步的介紹,同時根據主要的幾個支付

【shell】Linux shell breakcontinue

shell break linux 腳本 break和continue都可以在循環中使用,但是兩個的功能有點不同,比如break是跳出整個循環,而continue則是跳出本次循環,繼續下個循環,下面我們會通過例子來演示這兩個的不同之處。 ** 例子:打印數字1-10,如果 i&gt

Android中APK簽名工具jarsignerapksigner

內容 value signature align light 文件簽名 item als release 一.工具介紹 jarsigner是JDK提供的針對jar包簽名的通用工具, 位於JDK/bin/jarsigner.exe apksigner是Google官方提

Android開發onTouchonClick

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【搞定Java基礎】 i++ ++i

目  錄: 一、i++ 和 ++i 的基本概念 二、i++ 和 ++i 的實現原理 三、i++ 和 ++i 在使用時的一些坑 3.1、i = i++ 導致的結果“異常” 3.2、多執行緒併發引發的混亂 一、i++ 和 ++i 的基本概念 在幾乎所有的指令式程

CookieSession區別

目錄 Cookie機制 定義 原理 使用 建立Cookie,Cookies方法 訪問Cookie 刪除 Session機制 定義 執行機制 使用 建立Session,Session方法 訪問Session

資料結構:AVL樹C++模板實現

AVL樹簡介AVL樹的名字來源於它的發明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL樹是最先發明的自平衡二叉查詢樹(Self-Balancing Binary Search Tree,簡稱平衡二叉樹)。一棵AVL樹有如下必要條件:條件一:它必

Androidviewstub用法實現延遲載入

上一篇的佈局中間就用了viewstub這個控制元件,現在來說一下其作用和用法" ViewStub 是一個不可見的,大小為0的View,最佳用途就是實現View的延遲載入,避免資源浪費,在需要的時候才載入View"需要注意的是,載入view之後,viewstub本身就會被新載入

AOPAspectJ 技術原理實戰總結

一、AOPAOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯 各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。1.1 主要功能日誌

Flume環境部署配置案例大全

 一、什麼是Flume?   flume 作為 cloudera 開發的實時日誌收集系統,受到了業界的認可與廣泛應用。Flume 初始的發行版本目前被統稱為 Flume OG(original generation),屬於 cloudera。但隨著 FLume 功能的擴

微信支付寶支付模式實現(.Net標準庫)

     支付基本上是很多產品都必須的一個模組,大家最熟悉的應該就是微信和支付寶支付了,不過更多的可能還是停留在直接sdk的呼叫上,甚至和業務系統高度耦合,網上也存在各種解決方案,但大多形式各異,東拼西湊而成。所以這裡我介紹下OSS.PayCenter開源跨平臺支付元件 及

HTTP報錯401403解決辦法

一、401: 1. HTTP 401 錯誤 - 未授權: (Unauthorized) 您的Web伺服器認為,客戶端傳送的 HTTP 資料流是正確的,但進入網址 (URL) 資源 , 需要使用者身份驗證 , 而相關資訊 1 )尚未被提供, 或 2 )已提供但沒有通過授

JAVAWEB開發HttpServletResponseHttpServletRequest(上)(各種亂碼、驗證碼、重定向轉發)

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 禁止瀏覽器快取 驗證碼圖片 // response.setH

JUnitTestCaseTestSuite

Android Studio下單元測試的本質其實是根據通過書寫JAVA測試程式碼,通過模擬使用者呼叫相應的方法,或者使用者按下相應的按鍵來驗證我們的程式碼的邏輯是否能達到預期的要求,如果所有的用例都能通過,則證明我們的邏輯滿足要求,否則,可以通過fail()函式(或使用A

KMP演算法NextNextval

KMP演算法是模式匹配專用演算法 它是在已知模式串的next或nextval陣列的基礎上執行的。如果不知道它們二者之一,就沒法使用KMP演算法,因此我們需要計算它們。 KMP演算法由兩部分組成: 第一部分,計算模式串的next或nextval陣列。 第二

java Comparable Comparator 區別(附程式碼)

java中,對集合物件或者陣列物件排序,有兩種實現方式。 即:(1)物件實現Comparable 介面         (2)定義比較器,實現Comparator介面。 下面會簡要介紹這兩種方法的區別,並附上實現程式碼,供大家參考。 Comparable介紹 Compar