通俗易懂--循環神經網絡(RNN)的網絡結構!(TensorFlow實現)

1. 什麼是RNN

循環神經網絡(Recurrent Neural Network, RNN)是一類以序列(sequence)數據爲輸入,在序列的演進方向進行遞歸(recursion)且所有節點(循環單元)按鏈式連接的遞歸神經網絡(recursive neural network)

1.1 RNN的應用

  • 文本生成(生成序列)
  • 機器翻譯
  • 看圖說話
  • 文本(情感)分析
  • 智能客服
  • 聊天機器人
  • 語音識別
  • 搜索引擎
  • 個性化推薦

1.2 爲什麼有了CNN,還要RNN?

  • 傳統神經網絡(包括CNN),輸入和輸出都是互相獨立的。圖像上的貓和狗是分隔開的,但有些任務,後續的輸出和之前的內容是相關的。例如:我是中國人,我的母語是____。這是一道填空題,需要依賴於之前的輸入。
  • 所以,RNN引入“記憶”的概念,也就是輸出需要依賴於之前的輸入序列,並把關鍵輸入記住。循環2字來源於其每個元素都執行相同的任務。
  • 它並⾮剛性地記憶所有固定⻓度的序列,而是通過隱藏狀態來存儲之前時間步的信息。

1.3 RNN的網絡結構

首先先上圖,然後再解釋:

現在我們考慮輸⼊數據存在時間相關性的情況。假設 XtRndX_t\in_{}\mathbb{R}^{n*d} 是序列中時間步t的小批量輸⼊,HtRnhH_t\in_{}\mathbb{R}^{n*h} 是該時間步的隱藏變量。那麼根據以上結構圖當前的隱藏變量的公式如下:

Ht=ϕ(XtWxh+Ht1Whh+bh)H_t=\phi(X_tW_{xh}+H_{t-1}W_{hh}+b_h)

從以上公式我們可以看出,這⾥我們保存上⼀時間步的隱藏變量 Ht1H_{t-1},並引⼊⼀個新的權重參數,該參數⽤來描述在當前時間步如何使⽤上⼀時間步的隱藏變量。具體來說,時間步 t 的隱藏變量的計算由當前時間步的輸⼊和上⼀時間步的隱藏變量共同決定。 ϕ\phi 函數其實就是激活函數。

我們在這⾥添加了 Ht1WhhH_{t-1}W_{hh} ⼀項。由上式中相鄰時間步的隱藏變量 HtHt1H_t 和H_{t-1} 之間的關係可知,這⾥的隱藏變量能夠捕捉截⾄當前時間步的序列的歷史信息,就像是神經⽹絡當前時間步的狀態或記憶⼀樣。因此,該隱藏變量也稱爲隱藏狀態。由於隱藏狀態在當前時間步的定義使⽤了上⼀時間步的隱藏狀態,上式的計算是循環的。使⽤循環計算的⽹絡即循環神經⽹絡(recurrent neural network)。

在時間步t,輸出層的輸出和多層感知機中的計算類似:

Ot=HtWhq+bqO_t=H_tW_{hq}+b_q

1.4 雙向RNN

之前介紹的循環神經⽹絡模型都是假設當前時間步是由前⾯的較早時間步的序列決定的,因此它
們都將信息通過隱藏狀態從前往後傳遞。有時候,當前時間步也可能由後⾯時間步決定。例如,
當我們寫下⼀個句⼦時,可能會根據句⼦後⾯的詞來修改句⼦前⾯的⽤詞。**雙向循環神經⽹絡通過增加從後往前傳遞信息的隱藏層來更靈活地處理這類信息。**下圖演⽰了⼀個含單隱藏層的雙向循環神經⽹絡的架構。

在雙向循環神經⽹絡的架構中,設該時間步正向隱藏狀態爲 HtRnh\overrightarrow{H}_t\in_{}\mathbb{R}^{n*h}(正向隱藏單元個數爲h),反向隱藏狀態爲 HtRnh\overleftarrow{H}_t\in_{}\mathbb{R}^{n*h}(反向隱藏單元個數爲h)。我們可以分別
計算正向隱藏狀態和反向隱藏狀態:

Ht=ϕ(XtWxh(f)+Ht1Whh(f)+bh(f))\overrightarrow{H}_t=\phi(X_tW_{xh}^{(f)}+\overrightarrow{H}_{t-1}W_{hh}^{(f)}+b_h^{(f)})

Ht=ϕ(XtWxh(b)+Ht1Whh(b)+bh(b))\overleftarrow{H}_t=\phi(X_tW_{xh}^{(b)}+\overleftarrow{H}_{t-1}W_{hh}^{(b)}+b_h^{(b)})

然後我們連結兩個⽅向的隱藏狀態 HtHt\overrightarrow{H}_t和\overleftarrow{H}_t 來得到隱藏狀態 HtRn2hH_t\in_{}\mathbb{R}^{n*2h},並將其輸⼊到輸出層。輸出層計算輸出 OtRnqO_t\in_{}\mathbb{R}^{n*q}(輸出個數爲q):

Ot=HtWhq+bqO_t=H_tW_{hq}+b_q

雙向循環神經⽹絡在每個時間步的隱藏狀態同時取決於該時間步之前和之後的⼦序列(包
括當前時間步的輸⼊)。

1.5 BPTT算法

image

在之前你已經見過對於前向傳播(上圖藍色箭頭所指方向)怎樣在神經網絡中從左到右地計算這些激活項,直到輸出所有地預測結果。而對於反向傳播,我想你已經猜到了,反向傳播地計算方向(上圖紅色箭頭所指方向)與前向傳播基本上是相反的。

我們先定義一個元素損失函數:

L(t)(y(t),y(t))=y(t)logy(t)(1y(t))log(1y(t))L^{(t)}(y^{'(t)},y^{(t)})=-y^{(t)}logy^{'(t)}-(1-y^{'(t)})log(1-y^{'(t)})

整個序列的損失函數:

L(y,y)=t=1TxL(t)(y(t),y(t))L(y^{'},y)=\sum_{t=1}^{T_x}L^{(t)}(y^{'(t)},y^{(t)})$

在這個計算圖中,通過y(1)y^{'(1)}可以計算對應的損失函數,於是計算出第一個時間步的損失函數,然後計算出第二個時間步的損失函數,然後是第三個時間步,一直到最後一個時間步,最後爲了計算出總體損失函數,我們要把它們都加起來,通過等式計算出最後的𝐿,也就是把每個單獨時間步的損失函數都加起來。然後你就可以通過導數相關的參數,用梯度下降法來更新參數。

在這個反向傳播的過程中,最重要的信息傳遞或者說最重要的遞歸運算就是這個從右到左的運算,這也就是爲什麼這個算法有一個很別緻的名字,叫做**“通過(穿越)時間反向傳播(backpropagation through time)”。**取這個名字的原因是對於前向傳播,你需要從左到右進行計算,在這個過程中,時刻𝑡不斷增加。而對於反向傳播,你需要從右到左進行計算,就像時間倒流。“通過時間反向傳播”,就像穿越時光,這種說法聽起來就像是你需要一臺時光機來實現這個算法一樣。

2. 其它類型的RNN

  • **One to one:**這個可能沒有那麼重要,這就是一個小型的標準的神經網絡,輸入𝑥然後得到輸出𝑦。

  • **One to many:**音樂生成,你的目標是使用一個神經網絡輸出一些音符。對應於一段音樂,輸入𝑥

    可以是一個整數,表示你想要的音樂類型或者是你想要的音樂的第一個音符,並且如果你什麼都不想輸入,𝑥可以是空的輸入,可設爲 0 向量。

  • **Many to one:**句子分類問題,輸入文檔,輸出文檔的類型。

  • **Many to many():**命名實體識別。

  • **Many to many():**機器翻譯。

image

3. CNN與RNN的區別

類別 特點描述
相同點 1、傳統神經網絡的擴展。
2、前向計算產生結果,反向計算模型更新。
3、每層神經網絡橫向可以多個神經元共存,縱向可以有多層神經網絡連接。
不同點 1、CNN空間擴展,神經元與特徵卷積;RNN時間擴展,神經元與多個時間輸出計算
2、RNN可以用於描述時間上連續狀態的輸出,有記憶功能,CNN用於靜態輸出

4. 爲什麼RNN 訓練的時候Loss波動很大

由於RNN特有的memory會影響後期其他的RNN的特點,梯度時大時小,learning rate沒法個性化的調整,導致RNN在train的過程中,Loss會震盪起伏,爲了解決RNN的這個問題,在訓練的時候,可以設置臨界值,當梯度大於某個臨界值,直接截斷,用這個臨界值作爲梯度的大小,防止大幅震盪。

5. 實例代碼

TensorFlow實現RNN

機器學習通俗易懂系列文章

3.png


作者:@mantchs

GitHub:https://github.com/NLP-LOVE/ML-NLP

歡迎大家加入討論!共同完善此項目!羣號:【541954936】NLP面試學習羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章