RNN記憶特性

RNN與語義分析

RNN的祖先是1982年提出的Hopfield網絡。

Hopfield網絡因爲實現困難,外加沒有合適應用,被86年後的前饋網絡取代。

90年代恰逢神經網絡衰落期,前饋MLP在Optimization上被揪出種種弊端,又被SVM取代。

在Represention上,CV界老一輩還在用着hand-made特徵,Speech&NLP也偏重Statistics的特徵。

1990年提出的兩種變種RNN,Elman&Jordan SRN同樣因爲沒有合適的實際應用,很快又被無視。

過了十幾年,遇上了DL熱潮,RNN被研究出具有挖掘語義信息的Distrubuted Represention能力。

終於被拿來做Speech和Language Model方面語義分析相關任務。

3.1 記憶特性

一個時長爲T的Simple RNN,unfold(展開)後實質是一個深度爲T的前饋網絡。

序列上所有的輸入信息、non-linearity變換的隱態信息從開始時刻,一直保留至當前時刻。

從生物神經學角度,就是長期記憶(Long-Term Memory)特性。

前饋網絡不是萬能的,儘管在CV上大放光彩,但確實不適合解決邏輯問題。

Prolog曾經大放光彩,很多人堅信概率解決不了邏輯智能問題,但被RNN打臉了,比如下面這個問題:

RNN就能夠通過長記憶,向前搜索出輸入中的關鍵信息。

3.2 Gradient Vanish

深度神經網絡的頭號問題就是Gradient Vanish,尤其是比MLP還要深多少倍的RNN。

★數學角度:[Bengio94]給出了Simple RNN出現Gradient Vanish的原因:

tj=p+1bjhbj1h(βWβh)tpwhereβ=UpperBound|∏j=p+1t∂bhj∂bhj−1|⩽(βW⋅βh)t−pwhereβ=UpperBound

W、h兩個參數矩陣,先積後冪,導致上界突變速度飛快,要麼0→0,要麼→∞

如若引入大量的飽和Non-Linearity,如Sigmoid(Logistic|Tanh),那麼最普遍的情況就是Gradient0Gradient→0

★生物學角度:

術語稱之爲Long-Term Memory退化到Short-Term Memory,只能記憶短期記憶。

3.3 RNNLM

儘管Simple RNN有諸多缺陷,但Short-Term Memory畢竟聊勝於無。

[Mikolov10]最先提出用RNN來做LM,不過並沒有用Word Embedings。

RNNLM從sentence-level切入,把一個sentence看成是一個sequence,逐個跑word推動時序。

3.4 RNN For Speech Understanding

[Mesnil13]則又將RNN同最近比較火的Word Embedings結合起來。

這篇paper是Bengio組Mesnil和在微軟實習的時候和Redmond研究院語音領域兩位大牛Xiaodong He、Li Deng合作的。

目測是在MS傳播導師的Theano。(OS:看你們還在公式推Gradient,啊哈哈哈)

3.4.1 Word embeddings

回過頭來再看[Mikolov13]的Word2Vec,13年開始真是全民玩起了詞向量。

[Mesnil13]總結了詞向量的幾點好處:

★以較小的維度向量,提純出Word的N維的歐幾里得空間信息,俗稱降維。

★可以先在Wiki之類的大型Corpus上Pre-Training出部分語義語法信息,

然後根據實際任務Fine-Tuning,符合深度學習原則。

★大幅度提升Generalization。

3.4.2 Context Window

另一個流行起來的Trick就是Context Window,Word2Vec的核心之一。

不同的是,Word2Vec丟棄了窗口詞的空間排列信息,而正常方法則選擇將窗口詞合併。

[Bengio03]中的詞向量,是在詞典裏直接取整個Dim長度的向量,設Dim=350。

而做了Context Window之後,單個詞的Dim變小,通常爲(50|100),窗口大小通常爲(3~19):

[Mesnil13]給出Context Window的唯一作用:

強化短期記憶(Short-Term)

看起來不是很有說服力,從Word2Vec來看,起碼還有這些作用:

★強化上下文信息捕捉能力

★強化語義、語法信息捕捉能力

Long-Short Memory Network(LSTM長短期記憶網絡)

自剪枝神經網絡

Simple RNN從理論上來看,具有全局記憶能力,因爲T時刻,遞歸隱層一定記錄着時序爲1的狀態

但由於Gradient Vanish問題,T時刻向前反向傳播的Gradient在T-10時刻可能就衰減爲0。

從Long-Term退化至Short-Term。

儘管ReLU能夠在前饋網絡中有效緩解Gradient Vanish,但RNN的深度過深,替換激活函數治標不治本。

tj=p+1bjhbj1h(βWβh)tpwhereβ=UpperBound|∏j=p+1t∂bhj∂bhj−1|⩽(βW⋅βh)t−pwhereβ=UpperBound

上式中指明的根源所在,由於W和h兩個矩陣多次冪導致受數值影響敏感,簡而言之就是深度過大。

大部分Long-Term情況下,不需要提供路徑上完整的信息,但反向傳播還是循規蹈矩地穿過這些冗深度。

解決方案之一是,設置可自主學習的參數來屏蔽掉這些無用的信息,與"降維"相似,這種方法叫"降層"

神經網絡的剪枝策略很簡單,就是添加參數矩陣,經過一定週期的學習,選擇性屏蔽掉輸入,精簡網絡。

從結構上來看,類似“樹套樹”,就是”神經網絡套神經網絡“。

動態門結構

簡單概括:

★LSTM將RNN的輸入層、隱層移入Memory Cell加以保護

★Input Gate、Forget Gate、Output Gate,通過訓練參數,將Gate或開(置1)或閉(置0),保護Cell。

在時序展開圖上則更加清晰:

 

公式定義

原版LSTM最早在[Hochreiter&Schmidhuber 97]提出。

今天看到的LSTM是[Gers 2002]改良過的 extended LSTM。

extended LSTM擴展內容:

★Forget Gate,用於屏蔽t-1以及之前時序信息。

在時序展開圖上,由左側鎖住以保護Cell。

★三態門控:

97年提出的Gate輸入類似RNN,分爲兩態Weight矩陣:

Wx——序列輸入信息

Wh——遞歸隱態輸入信息

2002年補充了第三態:

Wc——遞歸Cell態輸入信息

將Cell的時序狀態引入Gate,稱爲Peephole Weights。

唯一作用似乎是提升LSTM精度,Alex Graves的博士論文中這麼說:

The peephole connections,meanwhile, improved the LSTM’s ability to learn tasks that require precise
timing and counting of the internal states.

具體實現的時候,爲了增加計算效率,可以忽視:

Theano的Tutorial中這麼說道:

The model we used in this tutorial is a variation of the standard LSTM model.

In this variant, the activation of a cell’s output gate does not depend on the memory cell’s state .

This allows us to perform part of the computation more efficiently (see the implementation note, below, for details).

而CS224D Lecture8中壓根就沒提。

所以雙態Gate可能是更爲主流的LSTM變種。

2.1 前向傳播

輸入門:

it=Sigmoid(Wixt+Uiht1+ViCt1)it=Sigmoid(Wixt+Uiht−1+ViCt−1)      ①

遺忘門:

ft=Sigmoid(Wfxt+Ufht1+VfCt1)ft=Sigmoid(Wfxt+Ufht−1+VfCt−1)    ②

輸出門:

Ot=Sigmoid(Woxt+Uoht1+VoCt)Ot=Sigmoid(Woxt+Uoht−1+VoCt)    ③

原始Cell(RNN部分):

Ct~=Tanh(Wcxt+Ucht1)Ct~=Tanh(Wcxt+Ucht−1)                  ④

門套Cell:

Ct=itCt~+ftCt1Ct=it⋅Ct~+ft⋅Ct−1         (輸入門+遺忘門)        ⑤

ht=OtTanh(Ct)whereht=FinalOutputht=Ot⋅Tanh(Ct)whereht=FinalOutput       (輸出門)       ⑥

————————————————————————————————————————————————————

仔細觀察①②③④,發現除了Peephole Weights引入的VV陣,這四個式子是一樣的。

Theano中爲了GPU能夠一步並行計算,沒有使用Peephole Weights,這樣①②③④就是一個基本並行模型:

以相同的代碼,運算數據集在空間中的不同部分。


遞歸神經網絡

人類並不是從混沌狀態開始他們的思考。就像你讀這篇文章時,你是建立在你之前對文字的理解上。你並不是學習結束之後就丟棄掉你學到的東西,然後再從混沌狀態開始。因爲你的思想有持續性。 
然而,傳統的神經網絡並不能做到持續記憶,這應該是傳統神經網絡的一個缺陷。假想一下,你想讓神經網絡對電影中每個時間點的事件進行分類,很明顯,傳統神經網絡不能使用前一個事件去推理下一個事件。 
遞歸神經網絡可以解決這個問題。它們是帶有循環的神經網絡,允許信息保留一段時間。 
遞歸神經網絡 
在上圖中,A 代表神經網絡主體, xt 是網絡輸入,ht是網絡輸出,循環結構允許信息從當前輸出傳遞到下一次的網絡輸入。 
這些循環讓遞歸神經網絡看起來有點神祕,然而,如果你再進一步思考一下,它與傳統神經網絡並沒有太多不同。一個遞歸神經網絡可以看多是一個網絡的多次拷貝,每次把信息傳遞給他的繼任者。讓我們把網絡展開,你會看到發生了什麼。 
遞歸神經網絡展開

這種鏈型的自然結構表明遞歸神經網絡與序列和列表有着天然的聯繫,他們是處理這些序列數據天然的神經網絡架構。 
當前,它們已經被應用了!最近的幾年中,RNNs在很多問題上取得了驚人的成功:語音識別,語言模型,翻譯,圖像註釋。。。這個名單還在繼續延長。我將討論一下Andrej Karpathy在他的博文The Unreasonable Effectiveness of Recurrent Neural Network中提到的RNNs令人驚奇的特性。 它們實在是太讓人驚奇了! 
這些成功必須要歸功於它們使用了“LSTMs”, 遞歸神經網絡的一種,它在許多任務中得到了比標準版本的RNN更好的結果。幾乎所有建立的遞歸神經網絡上的,令人驚喜的結果,都是使用LSTMs得到的。這篇文章將會探索這個神奇的神經網絡。

長期依賴的問題

人門希望RNNs能夠連接之前的信息到當前的任務中,例如,使用之前的圖像幀信息去輔助理解當前的幀。如果RNNs可以做到這個,它們將會特別的有用,但是它們可以做到嗎?這要視情況而定。 
有時,我們僅僅需要使用當前的信息去執行當前的任務。例如, 一個語言模型試圖根據之前的單詞去預測下一個單詞。如果我們試圖去預測“the clouds are in the sky”,我們不需要更多的上下文信息–很明顯下一個單詞會是sky。在類似這種相關信息和需要它的場合並不太多的情景下,RNNs可以學習使用之前的信息。 
RNN-shorttermdepdencies

但是,也有很多場景需要使用更多的上下文。當我們去嘗試預測“I grew up in France…I speak fluent French”的最後一個單詞,最近的信息表明下一個單詞應該是語言的名字,但是如果我們想縮小語言的範圍,看到底是哪種語言,我們需要France這個在句子中比較靠前的上下文信息。相關信息和需要預測的點的間隔很大的情況是經常發生的。 
不幸的事,隨着間隔的增大,RNNs連接上下文信息開始力不從心了、. 
RNN-longtermdependencies
理論上RNNs完全有能力處理這種“長期依賴(Long-term dependencies)”問題。人們可以精心的選擇參數去接着這類問題。令人沮喪的是,實踐表明RNNs不能完美的學習“長期依賴(Long-term dependencies)”。Hochreiter(1991)Bengio,et al,(1994)發現了一些爲什麼RNNs在這些問題上學習相當困難的根本原因。 
謝天謝地,LSTMs沒有這些問題。

LSTM 網絡

長短期記憶網絡–通暢叫做”LSTMs”–是一種特殊的RNNs, 它能夠學習長期依賴。LSTM由Hochreiter&Schmidhuber(1997)引入,後來在很多人的努力下變得越來越精煉和流行。它們在大量的問題上有驚人的效果,現在被廣泛的使用。 
LSTMs被明確的設計用來解決長期依賴問題,記住長時間段的信息是他們的必備技能,不像RNNs那麼費力去做還做不好。 
所有的遞歸神經網絡都有重複神經網絡本身模型的鏈式形式。在標準的RNNs, 這個複製模塊只有一個非常簡單的結構,例如一個雙極性(tanh)層。 
The repeating module in a standard RNN contains a single layer.
LSTMs 也有這種鏈式結構,但是這個重複模塊與上面提到的RNNs結構不同:LSTMs並不是只增加一個簡單的神經網絡層,而是四個,它們以一種特殊的形式交互。 
The repeating module in an LSTM contains four interacting layers.
別擔心中間到底發生了什麼。我們接下來會一步一步的理解這個LSTM圖。首先,我們要首先適應一下我們將會使用的符號表示方法。 
這裏寫圖片描述
在上圖中,每條線表示一個向量,從一個輸出節點到其他節點的輸入節點。這個粉紅色圓圈表示逐點式操作,就像向量加法。黃色的盒子是學習好的神經網絡的層。線條合表示聯結,相反,線條分叉表示內容被複制到不同位置。

LSTMs背後的核心思想

LSTMs的核心之處就是它的神經元狀態,如下圖中所示,上面那條貫穿整個結構的水平線。 
神經元狀態就像是一個傳送帶。它的線性作用很小,貫穿整個鏈式結構。信息很容易在傳送帶上傳播,狀態卻並不會改變。 
這裏寫圖片描述
LSTM有能力刪除或者增加神經元狀態中的信息,這一機制是由被稱爲門限的結構精心管理的。 
門限是一種讓信息選擇性通過的方式,它們是由Sigmoid神經網絡層和逐點相乘器做成的。 
這裏寫圖片描述

Sigmod層輸出0~1之間的數字,描述了一個神經元有多少信息應該被通過。輸出“0”意味着“全都不能通過”,輸出“1”意味着“讓所有都通過”。 
一個LSTM有三個這樣的門限,去保護和控制神經元狀態。

一步一步的推導LSTM

LSTM的第一步就是決定什麼信息應該被神經元遺忘。這是一個被稱爲“遺忘門層”的Sigmod層組成的。它輸入 ht1xt,然後在Ct1 的每個神經元狀態輸出0~1之間的數字。“1”表示“完全保留這個”,“0”表示“完全遺忘這個”。 
讓我們再次回到那個嘗試去根據之前的詞語去預測下一個單詞的語言模型。在這個問題中,神經元狀態或許包括當前主語中的性別信息,所以可以使用正確的代詞。當我們看到一個新的主語,我們會去遺忘之前的性別信息。 
這裏寫圖片描述
下一步就是決定我們要在神經元細胞中保存什麼信息,這包括兩個部分。首先,一個被稱爲“遺忘門層”的Sigmod層決定我們要更新的數值。然後,一個tanh層生成一個新的候選數值,Ct˜,它會被增加到神經元狀態中。在下一步中中,我們會組合這兩步去生成一個更新狀態值。 
在那個語言模型例子中,我們想給神經元狀態增加新的主語的性別,替換我們將要遺忘的舊的主語。 
這裏寫圖片描述
是時候去更新舊的神經元狀態Ct1到新的神經元狀態Ct了。之前的步驟已經決定要做什麼,下一步我們就去做。 
我們給舊的狀態乘以一個ft,遺忘掉我們之前決定要遺忘的信息,然後我們增加itCt˜。這是新的候選值,是由我們想多大程度上更新每個狀態的值來度量的。 
在語言模型中,就像上面描述的,這是我們實際上要丟棄之前主語的性別信息,增加新的主語的性別信息的地方。 
這裏寫圖片描述
最後,我們要決定要輸出什麼。這個輸出是建立在我們的神經元狀態的基礎上的,但是有一個濾波器。首先,我們使用Sigmod層決定哪一部分的神經元狀態需要被輸出;然後我們讓神經元狀態經過tanh(讓輸出值變爲-1~1之間)層並且乘上Sigmod門限的輸出,我們只輸出我們想要輸出的。 
對於那個語言模型的例子,當我們看到一個主語的時候,或許我們想輸出相關動詞的信息,因爲動詞是緊跟在主語之後的。例如,它或許要輸出主語是單數還是複數的,然後我們就知道主語聯結的動詞的語態了。 
這裏寫圖片描述

長短期記憶神經網絡的變體

上面描述的都是常規的LSTM,但並不是所有的LSTMs都是上面這種模式。實際上,幾乎每篇包含LSTMs模型的論文中,LSTMs都有一些差異,這些差異非常微小,但是它值得提及一下。 
Gers & Schmidhuber(2000)引入了一個流行的LSTM變體,他增加了一個“窺視孔連接”。這意味着我們讓門限層監視神經元狀態。 
這裏寫圖片描述
上圖中給每個門限增加了窺視孔,但是有些論文,只給一部分門限增加窺視孔,並不是全部都加上。 
另外一個變體是使用組合遺忘和輸入門。而不是分開決定哪些神經元需要遺忘信息,哪些需要增加新的信息,我們組合起來決定。我們只遺忘那些需要被放入新信息的狀態,同樣,我們只在舊的信息被遺忘之後才輸入新的信息。 
這裏寫圖片描述
一個更神奇的LSTM變體是門遞歸單元(Gated Recurrent Unit, GRU),由Cho, et al(2014),它組合遺忘們和輸入門爲一個“更新門”,它合併了神經元狀態和隱層狀態,並且還做了一些其他改變。最終這個模型比標準的LSTM模型簡單一些,並且變得越來越流行。 
這裏寫圖片描述
這裏只介紹了幾個最有名的LSTM的變體,還有更多變體沒有介紹,就像Yao, et al.(2015)深度門遞歸神經網絡(Depth Gated RNNs)。這裏也有一些處理長期依賴問題問題的完全不同的方法,就像Koutnik, et al(2014)提出的時鐘機遞歸神經網絡(Clockwork RNNs)。 
這些變體中哪個是最好的?這些差異重要嗎?Greff, et al. (2015)做了一個流行LSTM變體的比較,他發現這都是一樣的。Jozefowicz, et al. (2015)測試了一萬多種RNN結構,發現一些RNN結構在某些特定任務中結果好於LSTMs。

結論

文章開頭,我提到了人們使用RNNs取得了卓越的成果,本質上所有的這些結果都是使用LSTMs取得的。他們的確在多數任務上表現的更好。 
寫下來一系列等式以後,LSTM s看起來挺嚇人的,然而,我們在文中一步一步的解釋它以後它看起來可以理解了。LSTMs在我們能夠用RNNs取得的結果中取得了更大的進步。我們不禁想問:是否有比LSTMs更好的模型?學者一致認爲:“有的!這裏有下一步,它就是“注意力”!”(Yes! There is a next step and it’s attention!,這裏的”attention”翻譯成“注意力”不知道是否合適”?)一個觀點是讓RNN的每一步都監視一個更大的信息集合,並從中挑選信息。例如:如果你使用 RNN去爲一幅圖像生成註釋,它會從圖像中挑選中挑選一部分去預測輸出單詞。實際上,Xu, et al. (2015) 確實是這樣做的–如果你想去探索“注意力”,這或許是一個有趣的起點!這裏還有一些使用“注意力”得到的有趣的結果,並且還有更多人在使用這個。 
“注意力”並不是唯一的RNN研究熱點。例如, 格點LSTMs(Grid LSTMs),Kalchbrenner, et al. (2015)看起來非常有前途。在生產環境中使用RNNs模型,就像Gregor, et al. (2015), Chung, et al. (2015)或者 Bayer & Osendorfer (2015)–也看起來很有趣。最近幾年遞歸神經網絡很流行,從趨勢來看,未來還會更流行。

我們來按照下面的步驟理解LSTM結構以及它背後的意義:

  1. 新記憶產生:這個狀態和GRUs中的新記憶產生狀態是一樣的。我們必須使用輸入詞和過去隱層狀態來產生新的記憶,包括了新詞.

  2. 輸入門:在產生新記憶之前,我們需要判定一下我們當前看到的新詞到底重不重要,這就是輸入門的作用。輸入門根據輸入詞和過去隱層狀態共同判定輸入值是否值得保留,從而判定它以何種程度參與生成新的記憶(或者說對新的記憶做一個約束)。因此,它可以作爲輸入信息更新的一個指標。

  3. 遺忘門:這個門和輸入門很類似。但是它不能決定輸入詞有效,它能對過去記憶單元是否對當前記憶單元的計算有用做出評估。

  4. 最終記憶產生:這個階段會根據遺忘門的作用結果,合理地忘記部分過去的記憶。再根據輸入門的作用結果,產生新記憶。它將這兩個結果加融合起來產生了最終的記憶

  5. 輸出門:這是一個GRUs裏沒有顯性存在的門。它的目的是從隱層狀態分離最終的記憶。最終記憶包含了大量不必需要保存在隱層狀態的信息,這個門限能夠評估關於記憶哪部分需要顯示在隱層狀態中。用於評估這部分信息的中間信號叫做,它和的點乘組成最後的



發佈了30 篇原創文章 · 獲贊 20 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章