循環神經網絡

循環神經網絡（recurrent neural network：RNN）是神經網路的一種。

數學形式化定義$$h_t=\sigma(W_h x_t+U_h h_{t-1}+b_h)$$

其中$W_h$, $U_h$為權重矩陣，$\sigma$通常為 $\tanh$ 函數

單純的RNN因為無法處理隨著遞歸，權重指數級爆炸或梯度消失問題，難以捕捉長期時間關聯；而結合不同的LSTM可以很好解決這個問題。

定理：當最大奇異值ρ(∇ht)>1時梯度爆炸，ρ(∇ht)<1時梯度消失

時間循環神經網絡可以描述動態時間行為，因為和前饋神經網絡（feedforward neural network）接受較特定結構的輸入不同，RNN將狀態在自身網路中循環傳遞，因此可以接受更廣泛的時間序列結構輸入。手寫識別是最早成功利用RNN的研究結果。

## 歷史

循環神經網絡是基於大衛·魯梅爾哈特1986年的工作。1982年，約翰·霍普菲爾德發現了Hopfield神經網路——一種特殊的RNN。1993年，一個神經歷史壓縮器系統解決了一個「非常深度學習」的任務，這個任務在RNN展開之後有1000多個後續層。

### LSTM

Hochreiter和Schmidhuber於1997年提出了長短期記憶(LSTM)網路，並在多個應用領域創造了精確度記錄。

大約在2007年，LSTM開始革新語音識別領域，在某些語音應用中勝過傳統模型。2009年，一個由 訓練的LSTM網路贏得了多項連筆手寫識別競賽，成為第一個贏得模式識別競賽的RNN。2014年，百度在不使用任何傳統語音處理方法的情況下，使用經過CTC訓練的RNNs打破了Switchboard Hub5'00 語音識別基準。

LSTM還改進了大詞彙量語音識別和文本到語音合成並在谷歌安卓系統中使用。據報導，2015年，谷歌語音識別通過接受過CTC訓練的LSTM(谷歌語音搜索使用的)實現了49%的引用量的大幅提升。

LSTM打破了改進機器翻譯、語言建模和多語言處理的記錄。LSTM 結合卷積神經網絡改進了圖像自動標註。

## 循環神經網絡

### 編碼器

循環神經網絡將輸入序列$\vec{x}$編碼為一個固定長度的隱藏狀態$\vec{h}$，這裡有（用自然語言處理作為例子）：

c=∑t=1Tαtht

其中:

- $\alpha_t$為注意力權重
- $\vec{x} = (x_t, ..., x_1)$ 是輸入序列，比如編碼為數字的一系列詞語，整個序列就是完整的句子。
- $\vec{h_t} = f( x_t, \vec{h_{t-1}} )$是隨時間更新的隱藏狀態。當新的詞語輸入到方程中，之前的狀態$\vec{h_{t-1}}$就轉換為和當前輸入$x_t$相關的$\vec{h_{t}}$，距離當前時間越長，越早輸入的序列，在更新後的狀態中所占權重越小，從而表現出時間相關性。

其中，計算隱藏狀態的方程$f(x, h)$是一個非線性方程，可以是簡單的Logistic方程（tanh），也可以是複雜的LSTM單元（Long Short-Term Memory）。而有了隱藏狀態序列，就可以對下一個出現的詞語進行預測：

- $p(y_{t}) = p( y_{t} \, | \, y_{t-1},..., y_{1} )$，其中$y_t$是第t個位置上的輸出，它的機率基於之前輸出的所有詞語。
- 以上機率可以通過隱藏狀態來計算：$p(y_t) = g( y_{t-1}, \vec{h_t}, \vec{c} )$，$\vec{c}$是所有隱藏狀態的編碼，總含了所有隱藏狀態，比如可以是簡單的最終隱藏狀態$\vec{h_t}$，也可以是非線性方程的輸出$f( h_{t}, ..., h_1 )$。因為隱藏狀態t就編碼了第t個輸入前全部的輸入資訊，$y_t$也迭代式地隱含了之前的全部輸出資訊，所以這個機率計算方法是合理的。

這裡的非線性方程$g( y, h, c )$可以是一個複雜的前饋神經網絡，也可以是簡單的非線性方程（但有可能因此無法適應複雜的條件而得不到任何有用結果）。給出的機率可以用監督學習的方法優化內部參數來給出翻譯，也可以訓練後用來給可能的備選詞語，用計算其第j個備選詞$y_{t, j}$出現在下一位置的機率，給它們排序。排序後用於其它翻譯系統，可以提升翻譯質量。

### 解碼器

更複雜的情況下循環神經網絡還可以結合編碼器作為解碼器（Decoder），用於將編碼後（Encoded）的資訊解碼為人類可識別的資訊。也就是上述例子中的$y_t = f( y_{t-1}, h_t, c )$過程，當中非線性模型$f$就是作為輸出的循環神經網絡。只是在解碼過程中，隱藏狀態因為是解碼器的參數，所以為了發揮時間序列的特性，需要對$h_t'$繼續進行迭代：

- $h_t' = g(h_{t-1}, y_{t-1}, c)$，$\vec{c}$是解碼器傳遞給編碼器的參數，是解碼器中狀態的summary。$h_t'$是解碼器的隱藏狀態。$y_t$是第t個輸出。
- 當輸入仍為$\vec{x} = (x_t, ..., x_1)$，輸出是$\vec{y} = (y_t, ..., y_1)$，最大化條件概率$P(\vec{y} \, | \, \vec{x})$後就是最好的翻譯結果。

### 雙向讀取

用兩個循環神經網絡雙向讀取一個序列可以使人工智慧獲得「注意力」。簡單的做法是將一個句子分別從兩個方向編碼為兩個隱藏狀態，然後將兩個$\vec{h}$拼接在一起作為隱藏狀態。這種方法能提高模型表現的原因之一可能是因為不同方向的讀取在輸入和輸出之間創造了更多短期依賴關係，從而被RNN中的LSTM單元（及其變體）捕捉，例如在實驗中發現顛倒輸入序列的順序（但不改變輸出的順序）可以意外達到提高表現的效果。

## 架構

RNN 有很多不同的變種

### 完全循環

基本的 RNN 是由組織成的連續的層的網路。給定層中的每個節點都通過有向(單向)連接連接到下一個連續層中的每個其他節點。每個節點(神經元)都有一個時變的實值激活。每個連接(突觸)都有一個可修改的實值。節點要麼是輸入節點(從網路外部接收數據)，要麼是輸出節點(產生結果)，要麼是隱藏節點(在從輸入到輸出的過程中修改數據)。

對於離散時間設置中的監督學習，實值輸入向量序列到達輸入節點，一次一個向量。在任何給定的時間步長，每個非輸入單元將其當前激活(結果)計算為與其連接的所有單元的激活的加權和的非線性函數。可以在特定的時間步長為某些輸出單元提供主管給定的目標激活。例如，如果輸入序列是對應於口語數字的語音信號，則在序列末尾的最終目標輸出可以是對該數字進行分類的標籤。

在強化學習環境中，沒有教師提供目標信號。相反，適應度函數或獎勵函數偶爾用於評估RNN的性能，它通過影響輸出單元來影響其輸入流，輸出單元和一個可以影響環境的執行器相連。這可以被用來玩一個遊戲，在這個遊戲中，進度是用贏得的點數來衡量的。

每個序列產生一個誤差，作為所有目標信號與網路計算的相應激活的偏差之和。對於大量序列的訓練集，總誤差是所有單個序列誤差的總和。

### Elman 網路和 Jordan 網路

Elman網路是一個三層網路(在圖中水平排列為x、y和z)，添加了一組上下文單元(在圖中為u)。中間(隱藏)層連接到這些權重為1的上下文單元。在每個時間步，輸入被向前反饋，並且學習規則被應用。固定的反向連接在上下文單元中保存隱藏單元的先前值的副本(因為它們在應用學習規則之前在連接上傳播)。因此，網路可以保持某種狀態，允許它執行諸如序列預測之類的任務，這些任務超出了標準多層感知器的能力。

Jordan網路類似於Elman網路。上下文單元是從輸出層而不是隱藏層饋送的。Jordan網路中的上下文單元也稱為狀態層。他們與自己有著經常性的聯繫。

Elman和Jordan網路也被稱為「簡單循環網路」。

Elman 網路：$$\begin{align} h_t &= \sigma_h(W_{h} x_t + U_{h} h_{t-1} + b_h) \\ y_t &= \sigma_y(W_{y} h_t + b_y) \end{align}$$

Jordan 網路：$$\begin{align} h_t &= \sigma_h(W_{h} x_t + U_{h} y_{t-1} + b_h) \\ y_t &= \sigma_y(W_{y} h_t + b_y) \end{align}$$

變量和函數

- $x_t$: 輸入向量
- $h_t$: 隱藏層向量
- $y_t$: 輸出向量
- $W$, $U$ 和 $b$: 參數矩陣和參數向量
- $\sigma_h$ 和 $\sigma_y$: 激活函數

### 雙向循環神經網絡

雙向循環神經網絡（Bi-directional RNN，BRNN）基於元素的前向和後向的上下文，使用有限序列來預測或標記序列的每個元素。該方法是通過連接兩個 RNN 的輸出來完成的：一個從左到右處理序列，另一個從右到左處理序列。BRNN的輸出是對目標信號的預測。該技術已被證明在與 LSTM RNN 結合使用時特別有用。

## 外部連結

- A Critical Review of Recurrent Neural Networks for Sequence Learning