這篇文章可以參考:

循環神經網路?

zybuluo.com
圖標

前面探討了前饋神經網路及其在神經語言模型和文本分類中的應用。在語言模型的例子中,我們看到這樣的網路可以被訓練成在給定前一個單詞有限上下文的序列中預測下一個單詞,這種方法讓人想起馬爾可夫語言建模方法。這些模型通過接受一個固定大小的令牌窗口作為輸入來運行;較長的序列是通過在輸入上滑動這個窗口進行增量預測來處理的,最終的結果是跨越輸入的一系列預測。圖9.1演示了這種方法,窗口大小為3。在這裡,我們預測下一個單詞會出現在窗戶下面。接下來的單詞是通過將窗口向前滑動一個單詞來預測的。

不幸的是,滑動窗口方法有很多問題。首先,它具有馬爾可夫方法的主要弱點,因為它限制了可以從中提取信息的上下文;上下文窗口之外的任何內容都不會影響正在作出的決策。這是有問題的,因為有許多語言任務需要訪問信息,而這些信息可以任意地遠離正在處理的點。其次,窗口的使用使得網路難以學習由選區等現象引起的系統模式。舉個例子,在圖9.1中這句話the ground在不同的窗口中出現兩次:一次,如圖所示,在第一和第二位置的窗口,在前面的步驟中第二和第三個插槽,因此迫使網路學習兩種不同的模式單一成分。本章的主題是遞歸神經網路,這是一類通過將序列顯式地處理為序列來解決這些問題的網路,允許我們處理可變長度的輸入,而不需要使用任意固定大小的窗口。

遞歸神經網路是指在網路連接中包含一個循環的網路。也就是說,一個單元的值直接或間接地依賴於它自己作為輸入的輸出的任何網路。一般來說,這樣的網路很難推理和訓練。然而,在一般的遞歸網路中,有一些受約束的體系結構,它們在應用於語言問題時被證明是非常有用的。在本節中,我們將介紹一類稱為簡單遞歸網路(SRNs)或Elman網路的遞歸網路。這些網路本身是有用的。9.2抽象地說明了SRN的循環結構。與普通的前饋網路一樣,表示當前輸入元素xt的輸入向量乘以一個權重矩陣,然後通過一個激活函數來計算一層隱藏單元的激活值。這個隱藏層依次用於計算相應的輸出yt。序列是通過每次向網路顯示一個元素來處理的。與feedht的關鍵區別

Elman之後的簡單遞歸神經網路(Elman, 1990)。隱藏層包含一個循環連接作為其輸入的一部分。也就是說,隱藏層的激活值取決於當前輸入以及前一個時間步中隱藏層的激活值。

正向網路位於圖中用虛線表示的循環鏈路上。該鏈接使用隱藏層在前一點的激活值來增加到隱藏層的輸入前一個timestep中的隱藏層提供了一種內存或上下文形式,用於編碼早期處理並通知在稍後的時間點要做出的決策。重要的是,體系結構不會對前面的上下文施加固定長度限制;前一隱藏層中包含的上下文包含擴展到序列開頭的信息。添加這個時間維度使得循環網路看起來比非循環體系結構更加奇特。但實際上,它們並沒有那麼大的不同。給定一個輸入向量和前一個時間步的隱含層的值,我們仍然執行標準的前饋計算。要了解這一點,請考慮圖9.3,它闡明了遞歸式的性質,以及它是如何影響隱層的計算的。最重要的增加在於新的權重集U,它將前一個時間步的隱藏層連接到當前隱藏層。這些權重決定了網路在計算當前輸入的輸出時應該如何利用過去的上下文。與網路中的其他權重一樣,這些連接將通過反向傳播進行訓練。

Inference in Simple RNNs

SRN中的正向推理(將輸入序列映射為輸出序列)與我們已經看到的前饋網路幾乎相同。為了要計算輸入xt的輸出yt,我們需要隱層ht的激活值。為了計算這個值,計算輸入的點積xt的權重矩陣W,和隱藏的點積層從之前的時間步 h_{t-1} 與權重矩陣V,我們把這些值加起來,他們通過一個合適的激活函數,g,到達當前的激活值隱藏層,ht。一旦我們得到了隱藏層的值,我們就進行通常的計算來生成輸出向量。

在通常遇到的軟分類情況下,查找yt由一個「softmax」計算組成,該計算為可能的輸出類提供一個規範化的概率分布。

簡單遞歸網路的時序性可以通過及時展開網路來說明,如圖9.4所示。在這樣的圖中,每個時間步驟都複製了不同層次的單元,以說明它們會隨著時間的推移而具有不同的值。然而,權重本身在不同的時間步驟中共享。最後,時間t的計算需要時間t1的隱含層的值,這就要求從序列的開始到結束採用增量推理演算法,如圖9.5所示。

Training

正如我們在前饋網路中所做的那樣,我們將使用訓練集、損失函數和反向傳播來調整這些遞歸網路中的權重集。如圖9.3所示,我們現在有3組權值需要更新:W,從輸入層到隱藏層的權值:U,從前一層到當前隱藏層的權值,最後V,從隱藏層到輸出層的權值。在繼續之前,讓我們先回顧一下一些符號。假設一個網路有一個輸入層x和一個非線性的激活函數g,我們將用一個 a^{[i]} 來表示來自第i層的激活值,這是將g應用到該層輸入的加權和 z^{[i]} 的結果。一個簡單的兩層前饋網路,將W和V分別作為第一組和第二組權值,其特徵如下:

圖9.4說明了我們在前饋網路中不用擔心反向傳播的兩個注意事項。首先,要計算t時刻輸出的損失函數,我們需要t-1時刻的隱層。其次,t時刻的隱含層同時影響t時刻的輸出和t+1時刻的隱含層(從而影響t+1時刻的輸出和損失)由此可見,要評估 h_t 產生的誤差,我們需要知道它對當前輸出和下一個輸出的影響。考慮我們在圖9.4中所示的情況,在時間2檢查輸入/輸出對。我們需要計算什麼梯度來更新權重U,V和W ?讓我們首先回顧一下如何計算更新V所需的梯度(此計算與前饋網路相同)。為了複習第7章,我們需要計算損失函數L對權重v的導數。然而,由於損失不是直接用權重表示的,我們使用鏈式法則來間接地得到它。

第一項就是損失函數的導數對網路輸出,也就是輸出的激活層。第二項是網路輸出的導數對中間網路激活z,這是一個功能的激活函數g我們的應用程序的最後一個任期鏈式法則的導數是網路激活對權重V,也就是當前隱藏層 h_t 的激活值。

在這裡,使用前兩個術語來定義 delta 是很有用的,delta 是一個損失項,表示標量損失中有多少是由輸出層中的每個單元引起的。

因此,我們需要更新權值矩陣V的最終梯度為:

繼續,我們需要為權重矩陣計算相應的梯度W和U:

誤差在SRN中的反向傳播。ti向量表示訓練數據序列中每個元素的目標。紅色箭頭顯示了計算U、V和W在第2時刻的更新所需的反向傳播誤差流。匯聚在h2上的兩個入射箭頭表示需要對這些誤差進行求和。

在這裡,我們遇到了來自前饋網路的第一個實質性變化。t時刻的隱藏狀態會導致t時刻的輸出和相關誤差,以及t+1時刻的輸出和誤差。因此,隱含層的誤差項 delta _h 必須是當前輸出的誤差項和下一個時間步的誤差項之和。

給定這個隱含層的總誤差項,我們可以用鏈式法則計算權重U和W的梯度:

這些梯度為我們提供了通過普通反向傳播更新矩陣U和W所需的信息

我們尚未完成,我們仍然需要將比例權重(計算誤差項)分配回先前的隱藏層 h_{t-1} 以用於進一步處理:

函數BACKPROPTHROUGHTIME(sequence, network)返回用於權重更新的梯度
前向傳遞以收集損失
後向傳遞計算誤差項並評估

通過時間反向傳播訓練。正向傳遞在每個時間步長計算所需的損失值。後向傳遞使用前向傳遞的值計算梯度。

這涉及到根據U中的權重按比例將誤差從 delta _h 反向傳播到 h_{t-1}

此時,我們已經擁有了為三組權重中的每一組執行權重更新所需的所有梯度。注意,在這個簡單的例子中,不需要將誤差通過W反向傳播到輸入x,因為假設輸入的訓練數據是固定的。如果我們希望更新我們的輸入字或字元嵌入,我們也會將誤差反向傳播到它們。我們將在9.5節中進一步討論這個問題。綜上所述,所有這些考慮導致了在SRNs中訓練權重的兩步演算法。在第一個步驟中,我們執行正向推理,計算ht、yt和每一步的時間損失,保存每一步隱藏層的值,以備下一個步驟使用。在第二階段,我們反向處理序列,計算所需的誤差項梯度,計算並保存誤差項,以便在每一步後退時在隱藏層中使用。不幸的是,為序列的每一項分別計算梯度和更新權重將非常耗時。相反,就像我們在第7章中使用的小批量訓練一樣,我們將在序列上增量地積累權重的梯度,然後使用這些累積的梯度執行權重更新。

Deep Networks: Stacked and Bidirectional RNNs

遞歸網路實際上是非常靈活的。將展開計算圖的前饋特徵與向量作為公共輸入和輸出相結合,可以將複雜網路視為模塊,並以創造性的方式進行組合。介紹在使用RNNs進行語言處理時使用的兩種比較常見的網路體系結構。

Stacked RNNs

到目前為止,在我們的示例中,RNNs的輸入由單詞或字元嵌入序列(向量)組成,而輸出則是用於預測單詞、標記或序列標籤的向量。然而,沒有什麼能阻止我們使用從一個RNN到另一個RNN的整個輸出序列作為輸入序列。堆疊的RNNs由多個網路組成,其中一層的輸出作為下一層的輸入,如圖9.10所示。堆疊的RNNs由多個網路組成,其中一層的輸出作為下一層的輸入,如圖9.10所示。

堆疊的循環網路。 較低層的輸出用作較高層的輸入,最後一個網路的輸出用作最終輸出

在許多任務中已經證明,堆疊的RNNs可以勝過單層網路。這種成功的一個原因與網路能夠在不同的抽象層上誘導表示有關。就像人類視覺系統的早期階段檢測到邊緣,然後用於尋找更大的區域和形狀一樣,堆疊網路的初始層可以誘導表示,作為進一步層表示的有用抽象,而進一步層表示可能證明很難在單個RNN中誘導。

雙向RNNs

在一個簡單的遞歸網路中,給定時刻t的隱藏狀態表示網路所知道的關於序列到該時刻的所有信息。也就是說,在t時刻的隱藏狀態是一個函數的結果,這個函數的輸入從開始到t時刻。我們可以把它看作是當前時間左邊網路的上下文

其中 h_{t}^{forward} 對應於t時刻的正常隱藏狀態,表示網路從序列到該點所收集到的所有信息(從0到t時刻)。當然,在基於文本的應用程序中,我們可以同時訪問整個輸入序列。我們可能會問,利用當前輸入右側的上下文是否也有幫助。恢復這類信息的一種方法是使用我們討論過的同一種網路,按照輸入序列反向訓練一個遞歸網路。使用這種方法,t時刻的隱藏狀態現在表示關於當前輸入右側序列的信息。

這裡,隱藏狀態 h_{t}^{backward} 表示從t到序列末尾我們所知道的關於序列的所有信息。將這些網路放在一起就得到了一個雙向的RNN。Bi-RNN由兩個獨立的遞歸網路組成,一個是從頭到尾處理輸入,另一個是從尾到頭處理輸入。然後,我們可以將兩個網路的輸出組合成一個單一的表示,該表示在每個時間點同時捕獲輸入的左上下文和右上下文。在向前和向後方向上訓練獨立的模型,正向計算和反向計算不共享權重,兩個模型訓練完成以後再融合模型,最終的輸出取決於正向和反向計算的加和

Figure 9.11 一個雙向RNN。在向前和向後方向上訓練獨立的模型,每個模型在每個時間點的輸出連接起來表示在那個時間點的狀態。圍繞著正向和反向網路的盒子強調了這個架構的模塊化本質。

圖9.11說明了一個雙向網路,其中前向和後向傳遞的輸出被連接在一起。 組合前向和後向上下文的其他簡單方法包括逐元素加法或乘法。 因此,每個時間步的輸出捕獲當前輸入的左側和右側的信息。在序列標記應用中,這些串聯的輸出可以作為局部標記決策的基礎。

雙向RNNs也被證明是非常有效的序列分類。從圖9.10可以看出,對於序列分類,我們使用RNN的最終隱藏狀態作為後續前饋分類器的輸入。這種方法的一個困難之處在於,最終狀態自然地反映了更多關於句子結尾的信息,而不是句子開頭的信息。雙向RNNs為這一問題提供了一個簡單的解決方案;如圖9.12所示,我們簡單地將前向和後向傳遞的最終隱藏狀態組合起來,並將其作為後續處理的輸入。同樣,連接是組合這兩個輸出的常用方法,但也使用元素級別的求和、乘法或平均。

LSTMs and GRUs

可參考這篇文章:

LSTM?

zybuluo.com
圖標

在實踐中,要訓練簡單的rns來完成需要網路利用遠離當前處理點的信息的任務是相當困難的。儘管可以訪問前面的整個序列,但以隱藏狀態編碼的信息往往是相當局部的(梯度消失),與輸入序列的最新部分和最近的決策更相關。然而,通常情況下,遠程信息對許多語言應用程序來說是至關重要的。

Figure 9.12 一種用於序列分類的雙向RNN。前向和後向傳遞的最後隱藏單元組合起來表示整個序列。這個組合表示作為後續分類器的輸入。

在語言模型的上下文中考慮以下示例

(9.8) The flights the airline was cancelling were full.

為「was」後面的「airline」分配高概率是很簡單的,因為was為單一協議提供了強大的本地上下文。然而,給「were」分配一個合適的概率是相當困難的,這不僅是因為複數的「flights」相當遙遠,而且因為更近的上下文包含單數成分。理想情況下,網路應該能夠保留關於多個「航班」的遠程信息,直到需要時,同時正確處理序列的中間部分。

SRN無法傳遞關鍵信息的一個原因是SRN中的隱藏層,以及確定隱藏層中的值的權重,被要求同時執行兩個任務:提供對在當前上下問下做出決定,並更新和推進對未來決策有用的信息。成功訓練簡單循環網路的第二個困難來自於需要通過隱藏層反向傳播訓練誤差。由於t時刻的隱含層參與了計算,所以會影響下一個時間步的損失。因此,在訓練的後向遍歷過程中,隱層會受到重複的點積的影響,由序列的長度決定這個過程的一個常見結果是梯度要麼被驅動到零要麼飽和。分別稱為消失梯度或爆炸梯度的情況。為了解決這些問題,設計了更複雜的網路體系結構來顯式地管理隨時間推移維護上下文信息的任務。這些方法將上下文視為一種需要顯式管理的內存單元。更具體地說,網路需要忘記不再需要的信息,並根據以後的決策需要記住信息。

Long Short-Term Memory

圖9.13 單個LSTM內存單元顯示為計算圖形

長短時記憶(LSTM)網路將上下文管理問題分為兩個子問題:從上下文中刪除不再需要的信息,以及添加可能需要用於以後決策的信息。該方法的關鍵是學習如何管理此上下文,而不是將策略硬編碼到體系結構中。LSTMs通過使用專門的神經單元來實現這一點,這些神經單元使用控制信息進出組成網路層的單元的門。這些門是通過使用在上下文層上按順序操作的附加權重集來實現的。

可改為:

簡單記為:ifog,ct

Figure 9.14 用於前饋、簡單遞歸網路(SRN)、長短時記憶(LSTM)和門遞歸單元的基本神經單元。

GRUs(門控遞歸單元)

雖然LSTMs相對容易部署,但它為我們的網路引入了大量的參數,因此帶來了更大的訓練負擔。門控循環單元(GRUs)試圖通過將LSTMs的遺忘和添加門摺疊到一個具有一組權重的更新門中來減輕這種負擔

可簡單記為:rzhh

參考:

零基礎入門深度學習(7) - 遞歸神經網路?

zybuluo.com
圖標

LSTMs和GRUs中使用的神經單元明顯比基本的前饋網路複雜得多。幸運的是,這種複雜性在很大程度上被封裝在基本的處理單元中,允許我們維護模塊性,並可以輕鬆地嘗試不同的體系結構。要了解這一點,請考慮圖9.14,它說明了與每種單元相關的輸入/輸出和權重。在最左邊,(a)是基本的前饋單元h = g(Wx+b)。一個單獨的權重集和一個單獨的激活函數決定了它的輸出,當排列在一個層中時,層中的單元之間沒有連接。接下來,(b)表示SRN中的單元。現在有兩個輸入和附加的權重。但是,仍然有一個單獨的激活函數和輸出。當設置為一個層時,每個單元的隱藏層作為下一個單元的輸入。幸運的是,LSTM和GRU單元增加的複雜性封裝在單元本身中。除了基本經常性單位(b)之外,唯一額外的外部複雜性是額外的上下文向量輸入和輸出的存在。這種模塊化是LSTM和GRU單元強大和廣泛應用的關鍵。具體來說,LSTM和GRU單元可以替換到第9.3節中描述的任何網路架構中。而且,與SRNs一樣,利用門控單元的多層網路可以展開成深度前饋網路,並按照通常的方式進行反向傳播訓練。

序列標記RNN,它接受用字元級詞嵌入增強的分散式詞嵌入。

Words, Characters and Byte-Pairs(單詞、字元和位元組對)

到目前為止,我們假設網路的輸入要麼是預先訓練的,要麼是經過訓練的單詞嵌入。正如我們所看到的,基於單詞的嵌入非常善於發現單詞之間的分布(語法和語義)相似性。然而,任何基於單詞的方法都存在一些重要的問題:

  • 對於某些語言和應用程序,詞典實在太大,無法實際地將每個可能的單詞表示為嵌入。需要一些用更小的比特組成單詞的方法。
  • 無論辭彙量有多大,我們總是會遇到一些不認識的單詞,這是由於新單詞進入語言,拼寫錯誤和從其他語言中借用
  • 對於許多應用程序來說,低於單詞級別的形態學信息顯然是一個重要的信息來源。基於單詞的方法對這種規則視而不見。
Figure 9.16 Bi-RNN接受單詞字元序列,並發出從序列的正向和反向傳遞派生的嵌入。網路本身是在一個更大的終端應用程序上下文中訓練的,在這個應用程序中,損失將一直傳播到字元向量嵌入。

我們可以通過使用來自組成單詞的字元(一個又一個的字母)的嵌入來擴展輸入單詞表示,從而克服其中的一些問題。圖9.15說明了詞性標註上下文中的一種方法。圖的上部由一個RNN組成,它接受一個輸入序列,並為輸入的每個元素在標記上輸出一個softmax分布。注意,這個RNN可以是任意複雜的,由堆疊和/或雙向網路層組成。這個網路的輸入由普通的單詞嵌入組成,其中包含豐富的字元信息。具體地說,每個輸入由普通單詞嵌入的連接和雙向RNN派生的嵌入組成,雙向RNN接受每個單詞的字元序列作為輸入,如圖下半部分所示。輸入中每個單詞的字元序列通過一個雙向RNN運行,該RNN由兩個獨立的RNNs組成,一個處理從左到右的序列,另一個處理從右到左的序列。將從左到右和從右到左網路的最終隱藏狀態連接起來,表示每個單詞的複合字元級表示。關鍵是,這些字元嵌入是在整個任務的上下文中訓練的;詞性「softmax」層的損失會一直傳播到字元嵌入。

推薦閱讀:

相关文章