深度學習之循環神經網絡(RNN)


循環神經網絡(Recurrent Neural Network,RNN)是一類具有短期記憶能力的神經網絡,適合用於處理視頻、語音、文本等與時序相關的問題。在循環神經網絡中,神經元不但可以接收其他神經元的信息,還可以接收自身的信息,形成具有環路的網絡結構。

循環神經網絡的參數學習可以通過隨時間反向傳播算法來學習,即按照時間的逆序把誤差一步步往前傳遞。而當輸入序列比較長時,會產生梯度爆炸或梯度消失問題,這也叫做長期依賴問題。為了解決這個問題,門控機制被引入來改進循環神經網絡,也就是長短期記憶網絡(LSTM)和門控循環單元(GRU)。

好了,看了上面概括性的描述,心頭一定有許多疑問冒出來:

1、為什么循環神經網絡擁有記憶能力呢?

2、循環神經網絡的具體結構是什么樣的?

3、循環神經網絡怎么用隨時間反向傳播算法來學習?

4、循環神經網絡的長期依賴問題是怎么產生的?

5、針對不同的任務,循環神經網絡有哪些不同的模式?

這篇文章整理以上幾個問題的答案。

 

一、循環神經網絡的記憶能力

前饋神經網絡是一個靜態網絡,信息的傳遞是單向的,網絡的輸出只依賴於當前的輸入,不具備記憶能力。

而循環神經網絡通過使用帶自反饋的神經元,使得網絡的輸出不僅和當前的輸入有關,還和上一時刻的輸出相關,於是在處理任意長度的時序數據時,就具有短期記憶能力。

給定一個輸入序列,循環神經網絡通過以下的公式來更新帶反饋邊的隱含層的活性值ht

其中h0=0,f(•)是一個非線性函數,隱藏層的活性值ht又稱為狀態或隱狀態。示例如下:

 

二、循環神經網絡的結構

1、單向循環神經網絡

先來搞清楚只有一個隱藏層的循環神經網絡的結構。

直接上圖!如下是一個按時間展開的循環神經網絡圖:

可以看到,連接不僅存在於相鄰的層與層之間(比如輸入層-隱藏層),還存在於時間維度上的隱藏層與隱藏層之間(反饋連接,h1到hT)。

用公式來描述隱狀態的計算過程,假設在時刻t,網絡的輸入為xt,隱狀態(即隱藏層神經元活性值)ht 不僅和當前時刻的輸入xt相關,也和上一個時刻的隱狀態ht-1相關,進而與全部過去的輸入序列(x1, x2, ..., xt-1, xt)相關。

其中zt是隱藏層的凈輸入;f(•)是非線性激活函數,通常為Sigmoid函數或Tanh函數;U是狀態-狀態權重矩陣,W是狀態-輸入權重矩陣,b為偏置。

這里要注意,在所有的時刻,我們使用相同參數(意思是U、W和b在每一時刻t都一樣嗎?)和相同的激活函數f(•)。

如果把每一時刻的狀態看作是前饋神經網絡的一層的話,那么循環神經網絡可以看做是時間維度上權值共享的前饋神經網絡。

有多個隱藏層的循環神經網絡圖如下:

2、雙向循環神經網絡

在某些任務中,當前時刻的輸出不僅和過去的信息有關,還和后續時刻的信息有關。比如給定一個句子,即單詞序列,每個單詞的詞性和上下文有關,因此可以增加一個按照時間的逆序來傳遞信息的網絡層,增強網絡的能力。

於是就有了雙向循環神經網絡(Bidirectional Recurrent Neural Network,Bi-RNN),它由兩層循環神經網絡組成,這兩層網絡都輸入序列x,但是信息傳遞方向相反。

用公式來表示就是,假設第1層按時間順序傳遞信息,第2層按時間逆序傳遞信息,這兩層在時刻t的隱狀態分別為ht(1)和ht(2)

第三個式子表示把兩個隱狀態向量拼接起來。

雙向循環神經網絡按時間展開的圖示如下:

 

三、循環神經網絡的參數學習

循環神經網絡的參數是狀態-狀態權重矩陣U,狀態-輸入權重矩陣W,和偏置b,可通過梯度下降法來進行學習。

以狀態-狀態權重矩陣U為例,推導梯度下降法進行參數學習的過程。

1、損失函數和梯度

以同步的序列到序列模式(每一時刻都有輸入和輸出,輸入序列和輸出序列長度相同)為例,運用隨機梯度下降法,來計算整個序列上的損失函數。給定一個訓練樣本(x, y),其中x1:T = (x1, x,..., xT)是長度為T的輸入序列,y1:T = (y1, y,..., yT)是長度為T的標簽序列。於是時刻t的損失函數為:

其中g(ht)是第t時刻的輸出,L是可微分的損失函數。那么整個序列上的損失函數為:

於是計算整個序列上的損失函數對參數U的梯度為:

也就是每個時刻的損失對參數U的偏導數之和。

好,得到了損失函數和梯度的公式,那怎么計算梯度呢?

循環神經網絡在時間維度上存在一個遞歸調用的非線性激活函數f(•),因此計算參數梯度的方式和前饋神經網絡不太相同。在循環神經網絡中主要有兩種計算梯度的方式:隨時間反向傳播(BPTT)算法和實時循環學習(RTRL)算法。這里整理一下隨時間反向傳播算法。

2、隨時間反向傳播算法

隨時間反向傳播算法和前饋神經網絡中的誤差反向傳播算法比較類似,只不過是把循環神經網絡看做是一個展開的多層前饋網絡,每一層對應於循環神經網絡中的每個時刻。

在展開的多層前饋網絡中,所有層的參數是共享的,因此參數的真實梯度是所有前饋網絡層的參數梯度之和

接下來,首先計算第t時刻損失對參數U的偏導數,再計算整個序列的損失函數對參數U的梯度。

 (1)計算第t時刻損失對參數U的偏導數

是第t時刻損失對參數U的偏導數,也就是真實的參數梯度。由於第t時刻前已經有多層展開的前饋網絡,而且各層的參數是共享的,所以需要把第t層和之前所有層的參數梯度都求出來,然后求和得到真實的參數梯度。

首先第t時刻的損失函數,是從凈輸入zt按照以下的公式一步步計算出來的:

於是,由隱藏層第k個時刻(1 ≤ k ≤ t,表示第t時刻所經過的所有時刻)的凈輸入zk=Uhk-1+Wxk+b可以得到,第t時刻的損失函數關於參數Uij的梯度為:

注意zk=Uhk-1+Wxk+b來計算zk對Uij的偏導數時,要保持hk-1不變(不然就要用鏈式法則,因為hk-1也是Uij的函數),這是和實時循環學習算法(RTRL)不同的地方,雖然我真沒搞懂這是怎么做到的。

於是分兩步來求第t時刻的損失函數關於參數Uij的梯度:先計算每一層凈輸入值對參數的梯度,再計算損失函數對於每一層凈輸入值的梯度。

  • 計算第k層的凈輸入值zk對參數Uij的梯度

  • 計算第t時刻的損失對於第k時刻隱藏層的凈輸入zk的導數,也就是誤差δt,k ,就可以得到與前饋神經網絡類似的誤差反向傳播公式

 

  • 得到第t時刻的損失函數關於參數Uij的梯度:

  • 合並為矩陣形式:                                                                                                                                       

經過以上三步,就得到了第t時刻的損失對參數U的梯度:

上面公式太多,看完了模模糊糊明白是什么意思,結合圖來理解更好。隨時間的反向傳播是關鍵,圖示如下:

按照我們上面計算誤差δt,k的公式:

我們來算一下δt,t-2,感受什么叫遞歸調用:

(2)計算整個序列的損失函數對參數U的梯度

得到第t時刻的損失函數對參數U的梯度之后,把所有的時刻T的梯度加起來,就得到了整個序列的損失函數對參數U的梯度。

同樣,按照上面的算法,可以得到整個序列的損失函數對於參數W和偏置b的梯度:

(3)隨時間反向傳播算法的計算復雜度

在隨時間反向傳播算法(BPTT)中,參數的梯度需要在一個完整的“前向”計算和“反向”計算后才能得到,並進行參數更新,因此需要保存所有時刻的中間梯度,空間復雜度較高。而實時循環學習(RTRL)算法在第t時刻,可以實時計算損失關於參數的梯度,不需要梯度回傳,空間復雜度低。

 

四、循環神經網絡的長期依賴問題

1、長期依賴問題

 我們可以用隨時間反向傳播算法中的誤差δt,k的公式來理解長期依賴問題,先看循環神經網絡中的梯度消失和梯度爆炸問題是如何產生的。將誤差δt,k的公式展開為:


 

如果定義

則有

可以看到,當γ>1,t-k→∞時,γt-k→∞,造成梯度爆炸問題;相反,γ<1,t-k→∞時,γt-k→0,會出現梯度消失問題。

而循環神經網絡中經常使用的激活函數為Sigmoid函數和Tanh函數,其導數值都小於1,再加上權重矩陣U的值也不會太大,因此如果時間間隔t-k過大,就會導致誤差δt,k趨於0,出現梯度消失問題。

雖然循環神經網絡理論上可以建立長時間間隔的狀態之間的依賴關系,但是由於梯度爆炸或梯度消失問題,實際上可能只能學習到短期的依賴關系。

因此長期依賴問題就是指,如果t時刻的輸出yt依賴於t-k時刻的輸入xt-k,當間隔k比較大時,由於梯度爆炸或梯度消失問題,循環神經網絡難以建立這種長距離的依賴關系。長期依賴問題主要是由於梯度消失產生的。

 2、改進方案

可以通過緩解循環神經網絡的梯度爆炸和梯度消失問題來避免長期依賴問題,從下面的公式來看,盡量讓γ≈1。

(1)梯度爆炸

可以通過權重衰減和梯度截斷來避免梯度爆炸問題。權重衰減是通過給參數增加L1正則化和L2正則化來限制參數的取值范圍,從而使得γ≤1。而梯度截斷則是當梯度的模大於一定閾值時,就將它截斷為一個比較小的數。

(2)梯度消失

可以改變模型,比如讓U=I,同時使得f′(zi)=1,即

其中g(•)是一個非線性函數。γ=1,這就不存在梯度消失和梯度爆炸問題了,但是這種非線性激活的方法,會降低模型的表示能力。可以改為:

ht與ht-1之間既有線性關系,也有非線性關系,在一定程度上可以化解梯度消失問題。

3、記憶容量問題

在上面梯度消失的解決辦法中,是通過引入了一個函數g(•),使得ht與ht-1之間既有線性關系,也有非線性關系。這會帶來記憶容量問題,也就是隨着ht不斷存儲新的輸入信息,會變得越來越大,也就是發生飽和現象。而隱狀態ht可以存儲的信息是有限的,隨着記憶單元存儲的內容越來越多,其丟失的信息也越來越多。

為了解決容量問題,可以用兩種方法。一是增加一些額外的存儲單元,即外部記憶單元;二是進行選擇性遺忘和選擇性更新,即長短期記憶網絡(LSTM)中的門控機制。

 

五、循環神經網絡的模式

循環神經網絡在不同類型的機器學習任務中有不同的模式:序列到類別模式、同步的序列到序列模式、異步的序列到序列模式。

1、序列到類別的模式

序列到類別模式主要用於序列數據的分類問題:輸入為序列(T個數據),輸出為類別(一個數據)。典型的就是文本分類任務,輸入數據為單詞的序列(構成一篇文檔),輸出為該文本的類別。

假設有一個樣本x1:T = (x1, x2, ..., xT)為一個長度為T的序列,輸出為一個類別y∈{1, 2, ..., C}。將樣本x按不同的時刻輸入到循環神經網絡中去,可以得到不同時刻的隱狀態h1, h2, ..., hT,然后將hT看做整個序列的最終表示,輸入給分類器g(•)做分類。

當然除了采用最后時刻的隱狀態hT作為序列的表示之外,還可以對整個序列的所有狀態進行平均,用平均隱狀態來作為整個序列的表示。

這兩種序列到類別模式的圖示如下:

2、同步的序列到序列模式

同步的序列到序列模式主要用於序列標注任務,即每一時刻都有輸入和輸出,輸入序列和輸出序列的長度相同。比如詞性標注(Pos Tagging),每個單詞都需要標注它的詞性。命名實體識別(Name Entity Recognition,NER)也可以看做是序列標注問題,與詞性標注的做法類似,特點在於對於命名實體,輸出它的命名實體標簽來代替詞性。

假設有一個樣本x1:T = (x1, x2, ..., xT)為一個長度為T的序列,輸出序列為y1:T = (y1, y2, ..., yT)。將樣本x按不同的時刻輸入到循環神經網絡中去,可以得到不同時刻的隱狀態h1, h2, ..., hT,然后把每個時刻的隱狀態輸入給分類器g(•),得到當前時刻的標簽。

 3、異步的序列到序列模式

異步的序列到序列模式也稱為編碼器-解碼器(Encoder-Decoder)模型,即輸入序列和輸出序列不需要有嚴格的對應關系,也不用保持相同的長度。比如機器翻譯中,輸入為源語言的單詞序列,輸出為目標語言的單詞序列。

在異步的序列到序列模式中,輸入為一個長度為T的序列:x1:T = (x1, x2, ..., xT),輸出一個長度為M的序列:y1:M = (y1, y2, ..., yM),通過先編碼后解碼的方式實現。

先將樣本x按不同時刻輸入到一個循環神經網絡(編碼器)中,得到其編碼hT,然后在另一個循環神經網絡(解碼器)中得到輸出序列ý1:M。為了建立輸出序列之間的依賴關系,在解碼器中通常使用非線性的自回歸模型。

其中f1(•)和f2(•)分別表示用作編碼器和解碼器的循環神經網絡,g(•)為分類器。編碼器和解碼器的工作過程如下圖所示:

 

 

 

參考資料:

邱錫鵬:《神經網絡與深度學習》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM