遞迴神經網絡

**遞迴神經網絡**（），又叫**循環神經網絡**，係一種源自 1980 年代嘅人工神經網絡，指個網絡嘅運算圖包含有方向嘅循環，簡單講就係有至少一部份嘅人工神經細胞嘅啟動程度能夠影響自己甚至係打前嘅細胞嘅啟動程度，令到一個時間點嘅資訊能夠對未來嘅運算作出影響。即係話攞一粒人工神經細胞嚟睇，佢嘅啟動程度 t 可以用類似以下噉嘅式計：

:t = W_1 A_1 + W_2 A_2...；（啟動函數）

喺呢條式當中，A_n 代表影響到 t 嘅神經細胞當中第 n 粒嘅啟動程度，而 W_n 就係其他神經細胞當中第 n 粒嘅權重（指嗰粒神經細胞有幾影響到 t）。A_n 當中可以包括同排或者後排嘅細胞，令個網絡喺一個時間點收到嘅資訊**有可能影響個網絡喺未來時間點嘅行為**－呢點係遞迴網絡同前饋網絡（FNN）最唔一樣嘅地方。

遞迴神經網絡有能力令一個時間點嘅資訊影響未來嘅運算，所以遞迴神經網絡能夠用嚟處理（前饋神經網絡搞唔掂嘅）有連串性嘅資訊，喺自然語言處理同機械翻譯（一隻字嘅意思可以受句句子之前嘅字影響）等嘅領域上相當有用，而且遞迴神經網絡喺教人工智能玩遊戲方面都有用，例如喺 2016 年打低咗九段圍棋棋手李世石而出名嘅人工智能程式 AlphaGo 就用咗遞迴神經網絡。

## 基礎概念

遞迴神經網絡建基於前饋神經網絡。喺一個前饋神經網絡當中，每粒人工神經細胞嘅啟動函數只會包含前一排嗰啲細胞嘅啟動程度，t = W_1 A_1 + W_2 A_2...，當中 A_1, A_2,... A_n 淨係包括前一排嘅細胞嘅啟動程度，所以一個前饋神經網絡每次做由輸入去到輸出嘅運算都係**獨立**（independent）嘅－喺接收一個輸入嗰陣，程式會按個網絡嘅啟動函數同權重值計個輸出，而下一次再有輸入嗰時，個網絡就會完全忘記上一次輸入留低嘅資訊。相比之下，一個遞迴神經網絡嘅細胞裏面有至少一部份嘅會有能力影響佢哋之前嗰幾層嘅人工神經細胞嘅啟動程度，t = W_1 A_1 + W_2 A_2...，當中 A_1, A_2,... A_n **可以包括同排或者後排嘅細胞喺之前時間點嘅啟動程度**，令資訊能夠喺個網絡入面「遞迴」。

例如以下呢幅圖，就係一個**展開咗**（unrolled / unfolded）嘅遞迴神經網絡：

當中 h 係個遞迴神經網絡啲隱藏層，x_t 係時間點 t 嘅輸入，o_t 係時間點 t 嘅輸出，而 v 就係上一個時間點個網絡交去下一個時間點嘅自己嘅資訊。用數學公式描述嘅話，一個遞迴神經網絡嘅輸入輸出關係如下：
:o_t = f(h_t; \theta)，[1]
:h_t = g(h_{t-1}, x_t; \theta)，[2]

h_t 係個遞迴神經網絡啲隱藏層喺時間點 t 嘅狀態，而 \theta 係個網絡啲參數；公式 [1] 同前饋神經網絡一樣（網絡輸出取決於隱藏層狀態同網絡嘅參數），而公式 [2] 反映遞迴網絡同前饋網絡嘅差異－公式 [2] 包括咗 h_{t-1}（隱藏層喺上一個時間點嘅狀態）呢一個前饋網絡唔會考慮嘅變數。

因為遞迴神經網絡呢種結構上嘅特徵，遞迴神經網絡能夠處理喺時間上前後倚賴嘅資訊，例如係語言噉：一個人講一句嘢嗰陣，句嘢嘅第二個字會影響到第一個字嘅意思（例如「家吓」同「家庭」嘅意思就唔同嗮），所以喺分析喺時間點 t 聽到嘅字嗰陣，要考慮埋喺打前嗰啲時間點－(t-1),(t-2),...－聽到嘅字，先至可以理解到嗮成句嘢嘅意思－理論上，遞迴神經網絡能夠暫時記住上幾次運算接收到嘅資訊，所以理應比起前饋神經網絡更加能夠做到呢一點。事實係喺廿一世紀初，已經有科學家成功噉運用遞迴神經網絡嚟令到電腦學識處理人類用自然語言（指好似廣東話同閩南話呢啲日常傾偈用嘅語言）講嘅嘢，形成機械翻譯等嘅技術－呢類工作用前饋神經網絡做唔到。

## 架構類型

### 簡單遞迴網絡
**簡單遞迴網絡**（simple recurrent network，SRN）係最基本嗰種遞迴神經網絡，分做兩種：艾文網絡同佐敦網絡。一個**艾文網絡**（Elman network）分三層－x、y 同 z－而柞 u 係所謂嘅**[[語境]]單位**（context units），啲權重冚唪唥都係 1。喺每個時間點 t，個網絡會由輸入同網絡參數嗰度計輸出以及用學習法則更新權重值，而每粒隱藏層神經細胞（y_i，i = 1,2,...,l）都有粒相應嘅語境單位，粒語境單位會記低嗰粒隱藏層細胞喺時間點 t 嘅啟動值，而喺時間點 t+1，語境單位記低咗嘅數值將會能夠左右隱藏層神經細胞嘅啟動，所以艾文網絡能夠一定程度上處理有連串性嘅資訊。

艾文網絡可以想像成以下嘅式：
:
\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}

當中
:h_t 係指隱藏層喺時間點 t 嘅狀態，x_t 係指時間點 t 嘅輸入，y_t 係指時間點 t 嘅輸出；
:W 同 U 係柞權重值，b 係指**偏向**（bias）－即係嗰粒細胞本身喺啟動上嘅傾向，例如如果有某一粒細胞嘅 b 係正數而且數值大，佢就會傾向無論輸入係幾多都有強烈嘅啟動；
:\sigma_h 同 \sigma_y 係相應嘅啟動函數。

**佐敦網絡**（Jordan network）係艾文網絡嘅一個變種，同艾文網絡嘅分別在於佐敦網絡入面嗰啲 u 記嘅唔係隱藏層喺上一個時間點嘅狀態，而係輸出層喺上一個時間點嘅狀態，即係話佐敦網絡可以想像成以下噉嘅式：

:
\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}

呢兩類式同艾文網絡嗰兩條嘅唯一分別係，h_t 取決於 y_{t-1}（上一個時間點嘅輸出），而唔係取決於 h_{t-1}（隱藏層喺上一個時間點嘅狀態）。

### 雙向遞迴網絡

雙向遞迴網絡（bidirectional recurrent network，BRN）係一種進階嘅遞迴神經網絡。雙向遞迴網絡嘅特徵係有兩個彼此之間唔相連嘅隱藏層，分別叫
***向前狀態**（forward states；h_f）同
***向後狀態**（backward states；h_b）。
一個雙向遞迴網絡每次會讀取 n 個輸入，foreach t，t \in 1,2,...,n ：
:
\begin{align}
h_f &= \sigma_h(W_{h} x_t + U_{h} h_{f_{t-1}} + b_h) \\
h_b &= \sigma_h(W_{h} x_t + U_{h} h_{b_{t+1}} + b_h) \\
y_i &= \sigma_y(W_{y_f} h_f + W_{y_b} h_b + b_y)
\end{align}

最先嗰個時間點嘅 h_{f_{t-1}} 以及最後嗰個時間點嘅 h_{b_{t+1}} 可以會當做一啲事先設定好嘅常數。一個雙向遞迴網絡（右）嘅結構圖解如下：

一個雙向遞迴網絡嘅輸出層會由過去同未來嗰度攞資訊－例如想像一個做機械翻譯嘅遞迴神經網絡，佢會攞一連串嘅英文字母做輸入，然後輸出就係一段相應嘅粵文字。喺每個時間點 t，佢會攞 10 個字，然後 foreach 字，佢會有一個輸出，個輸出會取決於打前嘅字同打後嘅字。雙向遞迴網絡最大嘅特徵係能夠埋考慮「未來」嘅資訊，而因為未來嘅資訊好多時都對做預測有用（尤其係喺語言處理上），所以雙向遞迴網絡能夠做到一啲普通嘅遞迴神經網絡做唔到嘅預測。

## 訓練演算法

### 越時反向傳播

梯度下降法係最常用嚟訓練人工神經網絡嘅演算法之一。梯度下降法係疊代嘅，重點係喺每一次疊代當中，按「點樣改啲參數會令誤差下降得快啲」改變參數數值，希望最後達致最佳嘅參數值：
#想像一個遞迴網絡，有 i 個權重值（參數），以向量 \mathbf{w} 表示，而家用某個指標 z 量度網絡表現，呢個指標係數值愈細愈理想嘅（例如係個網絡嘅誤差）。
#\mathbf{w} 喺個程式初始化嗰陣設咗做某啲數值；
#喺每一步，個演算法可以加減 \mathbf{w} 入面是但一個數值，所以個網絡有 i \times 2 咁多個可能改變方法；個演算法計算 z_1, z_2, z_3, z_4,...－當中 z_j 係移去第 j 個方向會得到嘅 z 值－然後個演算法會「揀 z 值跌幅最勁嗰個方向」。
如果一切順利，噉做會令到權重慢慢改變，變成會令到誤差細嘅數值。

喺一般嘅梯度下降法當中，每次權重改變都淨係會視乎嗰個時間點嘅誤差（即係 \Delta w_{t} = f(z_{t})），而越時反向傳播算法（BPTT）就係每次權重改變都**考慮而家同打前 <math>n</math> 個時間點嘅累計誤差**（即係話 \Delta w_{t} = f(z_{t}, z_{t-1}, z_{t-2},..., z_{t-n})）。越時反向傳播算法係一般反向傳播算法嘅廣義化，因為一般反向傳播可以想像成 n = 0 嘅越時反向傳播。
;基本演算法
越時反向傳播算法基本做法如下：
#俾個網絡睇 n 對輸入同輸出，每對輸入輸出有個特定嘅時間點（「係第幾個出現嘅輸入」）；
#Foreach 對輸入輸出，計一個誤差值，而呢啲誤差值會累積；
#按累積嘅誤差值，更新權重；
#返去步驟 1。
對於簡單嘅RNN：
:
h_t = \sigma(W \cdot x_t + U \cdot h_{t-1} + b)

反向傳播n𨂾透過h_{t-1}\dots h_{t-n}，求導狀態h_{t}分別對啲W,U,x_{t-n}，可以攞下式表示：
:
\begin{align}
\dfrac{\partial h_{t}}{\partial U} &= \sum ^{n}_{i=1}\dfrac{\partial \sigma \left( z_{t-i+1}\right) }{\partial z_{t-i+1}}\cdot U^{i-1}\cdot h_{t-i} \\
\dfrac{\partial h_{t}}{\partial W} &= \sum ^{n}_{i=1}\dfrac{\partial \sigma \left( z_{t-i+1}\right) }{\partial z_{t-i+1}}\cdot U^{i-1}\cdot x_{t-i+1} \\
\dfrac{\partial h_{t}}{\partial x_{t-n}} &= \dfrac{\partial \sigma \left( z_{t-n}\right) }{\partial  z_{t-n}}\cdot W\cdot \prod ^{n-1}_{i=1}\dfrac{\partial \sigma \left( z_{t-i+1}\right) }{\partial z_{t-i+1}}\cdot U
\end{align}

其中z_{t-i+1} 係 i𨂾前嘅啟動函數個輸入；\dfrac{\partial \sigma \left( z_{t-i+1}\right) }{\partial z_{t-i+1}} 係啟動函數對應𨂾個輸出對輸入嘅求導。可以睇到每回溯一𨂾就乘多一個U。
### 全局最佳化

遺傳演算法係最常用嚟同遞迴神經網絡做全局最佳化嘅做法：全局最佳化指用數學方法搵出成個函數嘅最大值或者最細值；梯度下降法同類似嘅方法好多時會搞到個 z 撠住咗係一個局部最細點嗰度－例如誤差值到咗一個最低點（局部最細點），呢點周圍嘅點嘅誤差值都高啲，但查實成個函數仲有一個全局最細點－一個誤差值更加細嘅點，不過個全局最細點唔喺個局部最細點附近，所以個演算法唔曉移去嗰度（睇埋梯度消失問題）。好似遺傳演算法等嘅全局最佳化做法就唔同，唔會齋靠睇現時嗰個點周圍嘅 z 值嚟決定點樣改變啲參數。

想像 Y 軸代表誤差值，X 軸代表權重向量；局部最細點係喺佢周圍範圍內最低嗰點，但查實仲有個更低嘅全局最細點：

遺傳演算法係一種建基於進化論物競天擇概念嘅機械學習演算法：喺進化論上，一個族群內部嘅生物個體（例如一群人類）彼此之間或多或少噉喺遺傳上有所差異，而呢啲差異會引致佢哋喺表現型（包括外表、行為、同體質等）上有個體差異，當中佢哋有啲生存同繁殖會比較叻，所以就更加有機會將自己啲遺傳基因傳俾下一代。假設環境唔變，個族群就會一代一代噉喺遺傳上有變異，變到愈發適合喺嗰個環境生存同繁衍。遺傳演算法就係受呢個理論啟發嘅一種演算法。做法如下：
#整一大柞同類嘅數學模型出嚟，當中每個啲參數都有唔同；
#叫每個數學模型做若干次嘅預測，每個按佢做預測陣時嘅準確度得返個分數 s，分數愈高表示佢表現愈好；
#揀選分數 s 最高嗰柞模型，將其餘嘅模型淘汰；
#做「繁殖」嘅過程－用最高分嗰柞模型做「父母」，生產下一代嘅模型。啲仔喺參數上會似佢哋嘅父母（「每個仔嘅每粒參數」都係「佢父母嘅同位參數」嘅函數）；
#再做過上述過程，重複若干代；
#如果一切順利，若干代之後手上嘅模型會係一啲預估估得啱嘅模型。

## 霍菲特網絡

霍菲特網絡係一種有高度內部連繫嘅遞迴網絡：喺一個霍菲特網絡入面，每粒細胞都同全體細胞間有連繫（不過一粒細胞唔會影響自己啟動程度）。如果個網絡有 K 咁多粒細胞，成個網絡裏面就會有 K(K-1) 條連繫。即係話，如果當 w_{ij} 係細胞 i 同細胞 j 之間嘅權重：
:w_{ii}=0, \forall i（冇任何細胞能夠影響自己嘅啟動程度）
:w_{ij} = w_{ji}, \forall i,j（所有細胞間嘅連繫都係對稱嘅）

霍菲特網絡係動態嘅：一旦霍菲特網絡嘅其中一粒細胞受啟動，佢會引致第啲細胞跟住啟動，然後第啲細胞又可以啟動返佢轉頭。即係話：

:s_i \leftarrow \left\{\begin{array}{ll} +1 & \mbox {if }\sum_{j}{w_{ij}s_j}\geq\theta_i, \\
 -1 & \mbox {otherwise.}\end{array}\right.

當中：
*s_i 係細胞 i 嘅狀態；
*\theta_i 係細胞 i 嘅門檻值（細胞 i 嘅啟動程度大過 \theta_i 狀態會變成 1，否則狀態變成 0）。

於是啲細胞就會係噉互傳訊號，一路係噉改變啟動程度，最後去到一個穩定嘅狀態－即係變成一個每粒細胞嘅啟動程度都恆定或者大致恆定嘅狀態－呢一點同人腦有些少相似，而認知科學上嘅研究表明咗，霍菲特網絡嘅變種可以用嚟模擬人腦嘅某啲記憶功能。

### 雙向聯想記憶

霍菲特網絡仲可以進階做雙向聯想記憶（BAM）。雙向聯想記憶概念上建基於喺人身上觀察到嘅聯想式記憶（可以睇吓古典制約同操作制約），一個雙向聯想記憶網絡會有兩浸霍菲特網絡，X 同 Y，兩浸細胞層完全連繫住－foreach X 裏面嘅細胞，x_{ij}，y_{ij} 都同 x_{ij} 有連繫，y_{ij} \in Y（y_{ij} 係 Y 嘅任何一粒細胞），反之亦然；研究表明咗，呢種架構可以用嚟訓練部電腦記住「邊啲輸入同邊啲輸入之間有關聯」。

## 玻茲曼機

玻茲曼機係一種同霍菲特網絡好相似嘅隨機遞迴網絡。一部玻茲曼機啲細胞之間有對稱連繫，而每一粒細胞都會用帶有隨機性嘅演算法決定係咪要啟動。一部玻茲曼機會有以下噉嘅式：
:z_i = b_i + \sum_j s_j w_{ij}
:\Pr(s_i = 1) = \frac{1}{1 + e^{-z_i}} 
當中 z_i 係第 i 粒神經細胞收到嘅輸入值；b_i 係*偏向*（bias；細胞 i 本身嘅啟動偏向）；s_j 係第啲細胞當中第 j 粒嘅狀態（數值只可以係 1 或者 0），而 w_{ij} 係由細胞 j 去細胞 i 嘅權重。\Pr(s_i = 1) 係指「s_i（細胞 i 嘅狀態）等如 1 嘅機會率」，而根據第二條式，\Pr(s_i = 1) 數值取決於 z_i 。

玻茲曼機既有理論價值，又有實用價值：一方面，有唔少理論性嘅認知科學研究者都對玻茲曼機嘅行為同特性感興趣，因為玻茲曼機喺好多方面－例如係唔分層噉－都（同一般嘅人工神經網絡比）更加似生物神經網絡，所以有唔少認知科學會用玻茲曼機嚟模擬心靈相關嘅現象，進行理論研究；另一方面，機械學習上嘅研究說明咗，只要有適當嘅訓練演算法，玻茲曼機亦都有可以有足夠嘅效率，有可能攞得嚟做某啲實際嘅應用。

### 受限玻茲曼機

受限玻茲曼機（RBM）係玻茲曼機嘅一個變種。一部受限玻茲曼機同一般嘅玻茲曼機一樣，分**隱藏細胞**同**可見細胞**，重點在於受限玻茲曼機嗰啲細胞之間嘅連繫「受限制」－隱藏細胞彼此之間唔可以有連繫，而可見細胞之間亦都唔可以有連繫，每一條連繫都係連接住一粒隱藏細胞同埋一粒可見細胞嘅；每粒可見細胞都同所有隱藏細胞有連繫。例如下圖就係一個有四粒可見細胞（柞 v_i）同三粒隱藏細胞（柞 h_i）嘅受限玻茲曼機：

想像而家一個研究者噉做：佢俾一柞輸入落去柞可見細胞嗰度，可見細胞狀態成 \mathbf{v}_0，再等柞隱藏細胞按 \mathbf{v}_0 同權重啟動成狀態 \mathbf{h}_0（向前傳遞；forward pass）；然後第二步係做*重構*（reconstruction）－將隱藏細胞嘅狀態 \mathbf{h}_0 做輸入，等可見細胞按呢柞輸入同權重變成狀態 \mathbf{v}_1；因為啲權重一般會喺初始化嗰陣設做隨機數值，所以 \mathbf{v}_1 同 \mathbf{v}_0 之間嘅差異（重構誤差）會相當大－「重構原初輸入」嘅工作失敗；喺呢個過程當中，部受限玻茲曼機會俾出兩樣資訊：
*喺向前傳遞途中，個網絡可以俾有關 \Pr(\mathbf{h}_0|\mathbf{v}_0) 嘅資訊（由 \mathbf{v}_0 估 \mathbf{h}_0 嘅概率分佈）；而
*喺重構途中，個網絡就可以俾有關 \Pr(\mathbf{v}_1|\mathbf{h}_0) 嘅資訊（由 \mathbf{h}_0 估 \mathbf{v}_1 嘅概率分佈）。
受限玻茲曼機可以攞嚟做深度學習：想像而家行咗學習演算法，部受限玻茲曼機能夠可靠噉重構原初輸入，每次都係 \mathbf{v}_1 ≈ \mathbf{v}_0（可以睇埋自編碼器）；呢部受限玻茲曼機嘅輸入係一幅有若干像素嘅圖像（\mathbf{v}），而隱藏層嘅細胞（\mathbf{h}）表示嘅係「幅圖入面有啲乜嘢身體部位」；下一步，研究者再用隱藏層 \mathbf{h} 做輸入，砌多個隱藏層（\mathbf{\text{new h}}）上去，\mathbf{\text{new h}} 表示嘅係「幅圖係乜嘢動物」。而最後得出呢個網絡能夠做到以下嘅嘢：
*準確噉計 \Pr(\mathbf{h}_0|\mathbf{v}_0)，等同「見到呢幅圖，估幅圖入面有邊啲身體部位」；
*準確噉計 \Pr(\mathbf{v}_1|\mathbf{h}_0)，等同「諗到呢啲身體部位，幅圖大致會係點嘅樣」；
*準確噉計 \Pr(\mathbf{\text{new h}}_0|\mathbf{h}_0)，等同「按照幅圖入面有嘅身體部位，估計幅圖係乜嘢動物」（例：如果幅圖有四隻腳，噉嗰隻嘢應該唔會係昆蟲）；
*準確噉計 \Pr(\mathbf{h}_0|\mathbf{\text{new h}}_0)，等同「已知手上有呢種動物，呢種動物有乜身體部位」
－呢一個網絡成功做到分層嘅知識表示嘅效果（睇埋深度信念網絡）。

## 長短期記憶

長短期記憶（LSTM）係一種能夠記住長期記憶嘅遞迴神經網絡：一般嘅遞迴網絡曉處理連串嘅資訊，例如係用自然語言寫嘅句子噉，但現實世界嘅解難好多時都要求一個個體能夠睇得出時間上差距大嘅因同果，例如要完全了解一個故仔嘅結局，可能要諗返起故仔開頭嘅情節。事實證明咗，普通嘅遞迴神經網絡好多時都難以應付呢啲問題。

LSTM 網絡特徵係內置一啲**門控神經細胞**（gated neuron），呢啲特殊嘅人工神經細胞有「門」（gate），曉決定要儲起乜嘢資訊同埋幾時讀取、寫入、或者刪除資訊：喺 LSTM 網絡嘅碼當中，會有演算法幫門控細胞決定幾時要改變自身嘅啟動程度；相比之下，一般嘅遞迴神經網絡冇能力控制現存嘅過去資訊會唔會喺新資訊嚟到嗰陣被替換。呢個特點令到 LSTM 網絡有能力儲資訊儲好耐，而且有能力由輸入嘅數值當中搵出時間上相距不定嘅因同果。

以下係一個基本 LSTM 入面嘅一粒細胞；方格代表成粒細胞，x_t 係喺時間點 t 嘅輸入，而 h_t 係粒細胞喺時間點 t 嘅輸出，細胞 A 有箭咀指去細胞 B 表示 A 能夠影響 B，而交叉就代表「做嘢」。

一粒 LSTM 嘅人工神經細胞除咗主細胞（c）之外仲有幾個元件：
***輸出門**（o）、
***輸入門**（i）、同埋
***遺忘門**（f）。

呢三道門當中每一道都可以當係一粒子細胞噉嚟睇，有各自嘅啟動程度值，會受到第啲人工神經細胞影響，決定自身嘅啟動程度，再按自身嘅啟動程度睇吓係咪要「做嘢」。輸出門「做嘢」嘅話會左右甚至封鎖粒細胞嘅輸出，輸入門「做嘢」嘅話會左右甚至封鎖粒細胞嘅輸入，而遺忘門「做嘢」嗰陣就可以完全刪除粒主細胞入面嘅資訊－即係重設粒主細胞嘅啟動值或者權重等。研究表明咗，LSTM 網絡可以用嚟教電腦做一啲要求長期記憶嘅作業，例如係閱讀理解呀噉。

### 閘門遞迴單位

長短期記憶仲喺 2014 年啟發咗閘門遞迴單位（GRU）嘅做法。閘門遞迴單位同長短期記憶好相似，不過閘門遞迴單位用嘅淨係得兩道「門」－
***重設門**（reset gate）位於細胞 i 同下一刻嘅 i 之間，決定粒細胞係咪要重設（忘記上一刻嘅狀態）；
***更新門**（update gate）決定 i 跟住嘅啟動有幾受現時嘅輸入狀態影響；
*閘門遞迴單位基本上就係長短期記憶冇咗輸出門。
想像下圖：

當中
:o_t 係時間點 t 嘅輸出。
:x_t 係時間點 t 嘅輸入。
:h_t 係時間點 t 嘅隱藏層狀態。
:R_t 係重設門。
:Z_t 係更新門。

## 神經圖靈機

神經圖靈機（NTM）係一種起源於 2014 年嘅**記憶增強**（memory-augmented；指有連接住網絡外嘅記憶單位）遞迴神經網絡架構，一部神經圖靈機主要有幾個部份：
*一個神經網絡**控制器**（controller）；呢個部份係一個多層感知機或者遞迴神經網絡，負責同外界互動（由外界攞向量輸入或者俾向量輸出去外界）同控制成個系統（會向系統其餘部份下指令）。
*一個記憶；呢個部份負責儲住啲記憶。
*一個或者多個**記憶讀取器**（read head）、同
*一個或者多個**記憶存寫器**（write head）。
神經圖靈機嘅結構圖解如下：

**記憶讀取**：將記憶想像成一個 N \times M 嘅矩陣，當中 N 係記憶位置嘅數量，而 M 係每個記憶位置嘅維度（簡單講就係嗰個位置可以記住幾多個數值）。設 \mathbf{M}_t 做呢個矩陣喺時間點 t 嘅狀態，\mathbf{w}_t 係一個由記憶讀取器去嗰 N 個位置嘅權重向量，而且做咗標準化，即係話
:\sum_i w_t(i) = 1,
:0 \le w_t(i) \le 1, \forall i；
喺每次做記憶讀取嗰陣，個控制器都會攞到一個 M 維嘅向量 \mathbf{r}_t，而
:\mathbf{r}_t \leftarrow  \sum_i w_t(i)\mathbf{M}_t(i)；
上述嘅嘢簡單講如下：記憶讀取器同記憶之間會有個權重，呢啲權重影響「當記憶讀取器要求提取記憶嗰陣，會有邊份記憶受到提取，而提取咗嗰份記憶就係 \mathbf{r}_t」。

**記憶存寫**：一個記憶存寫有兩個部份－**清除**（erase）同**添加**（add）；喺每一個時間點 t，記憶存寫器都會俾出三個向量－
#一個 N 維嘅權重向量 \mathbf{w}_t、
#一個 M 維嘅清除向量 \mathbf{e}_t、同
#一個 M 維嘅添加向量 \mathbf{a}_t。
每一個記憶向量 \mathbf{M}_{t-1}(i) 都會受到清除向量改造：
:\text{temp}\mathbf{M}_{t}(i) = \mathbf{M}_{t-1}(i)[\mathbf{1} - w_t(i)]\mathbf{e}_t（\mathbf{1} 係一個完全由 1 組成嘅向量）；
然後個添加向量就會做嘢：
:\mathbf{M}_{t}(i) = \text{temp}\mathbf{M}_{t}(i) + w_t(i)\mathbf{a}_t。
喺應用上，神經圖靈機可以攞嚟模擬工作記憶（記憶功能嘅一種，指個心靈暫時儲住要用嘅資訊）涉及嘅認知過程。

## 應用
### 遊戲人工智能

遞迴神經網絡喺電子遊戲人工智能上都有用：
*一個有認知能力嘅系統（例如一個人腦或者一個人工智能）可以按感知到嘅資訊建立描述世界嘅內在模型（internal model of the world）；一個內在模型係描述「世界點運作」嘅數學模型，而認知系統能夠用呢啲模型預測未來。遊戲人工智能方面嘅研究者有唔少都想教遊戲人工智能建立內在模型、以及用內在模型預測遊戲世界嘅變化並且作出決策，務求令電子遊戲入面嘅人工智能更加似真實嘅人類智能。
*電子遊戲入面嘅事件係有連串性嘅，例如一隻射擊遊戲，一個玩家喺開咗若干槍之後，佢會做「重新上子彈」呢個動作嘅機率理應會升，所以有遊戲人工智能研究者指出，零舍擅長處理連串資訊嘅遞迴神經網絡理應可以有效噉攞嚟教遊戲嘅 NPC 預測未來；簡單嘅例子有一個遞迴神經網絡，以「遊戲世界現時狀態」做輸入、「預計遊戲世界下一秒嘅狀態」做輸出。

;例子：VMC 模型
有研究者就試過整一個遞迴神經網絡系統用嚟做電子遊戲人工智能，個系統有以下嘅部份：
***V**（visual）：一個視覺感官系統，呢個系統以「控制緊嗰個 NPC 嘅鏡頭見到嘅影像」做 `input`，俾出「遊戲世界而家嘅狀態」做 `output`；
***M**（memory）：一個記憶系統，呢個系統係一個遞迴神經網絡，`input` 係「遊戲世界而家嘅狀態」，`output` 係「預計遊戲世界未來嘅狀態」；
***C**（decision）：一個決策系統，呢個系統會攞 **V** 同 **M** 嘅 `output` 做自己 `input`，決定要採取乜嘢行動（「行動」係 `output`）。
呢個系統嘅圖解如下：

喺每一個時間點 t，呢個網絡會做以下嘅嘢：
#**環境**（environment）會俾一幅「個鏡頭見到嘅影像」（實用上會係一個好多維嘅向量 \text{image}_{t}）去 **V** 嗰度；
#**V** 可以係一個神經網絡（睇卷積神經網絡同埋深度學習），`output`（v_{t}）嘅數值表示「見到啲乜」（例：1 代表障礙物、2 代表敵人...）；而家假設 **V** 用監督式學習訓練咗，能夠作出準確嘅判斷；
#**M** 會攞自己上一個時間點嘅狀態（m_{t-1}）同 v_{t} 做 `input`，`output`（m_{t}）嘅向量表示「預計嘅 \text{image}_{t+1}（下一刻會見到嘅嘢）」，而如果考慮到遊戲世界同玩家行為嘅隨機性嘅話，m_{t} 可以變成「預計嘅 \text{image}_{t+1} 嘅概率分佈」；
#**C** 會係另一個遞迴神經網絡，攞 v_{t} 同 m_{t} 做自己嘅 `input`，並且計出邊個行動能夠帶嚟最大嘅收益同決定要採取邊個行動（`output`）；喺電子遊戲當中，可能嘅行動－要撳邊個掣－數量一般相當有限，所以可以用維度唔高嘅向量表示；睇埋強化學習。
#**C** 嘅 `output` 會引致環境改變，返去步驟 1。
研究表明咗，噉嘅神經網絡系統能夠教人工智能玩遊戲。

### 第啲應用
*機械翻譯
*機械人嘅控制
*對時間序列作出預測
*對時間序列作出異常檢測
*教人工智能作曲
*教人工智能學文法
*手寫辨識
... 等等。

## 睇埋
*人工神經網絡
*前饋神經網絡
*迴響狀態網絡
*AlphaGo
*聯結主義

## 文獻

*Elman, Jeffrey L. (1990). "Finding Structure in Time" (PDF). *Cognitive Science*. 14 (2): 179–211.
*Graves, A., Wayne, G., & Danihelka, I. (2014). [Neural turing machines](https://arxiv.org/pdf/1410.5401.pdf%20(http://Neural%20Turning%20Machines)%20) (PDF). arXiv preprint arXiv:1410.5401.
*Hu, S. G., Liu, Y., Liu, Z., Chen, T. P., Wang, J. J., Yu, Q., ... & Hosaka, S. (2015). Associative memory realized by a reconfigurable memristive Hopfield neural network (PDF). *Nature communications*, 6(1), 1-8.
*Li, Shuai; Li, Wanqing; Cook, Chris; Zhu, Ce; Yanbo, Gao (2018). "Independently Recurrent Neural Network (IndRNN): Building a Longer and Deeper RNN" (PDF).
*Siegelmann, H. T., & Sontag, E. D. (1992, July). On the computational power of neural nets (PDF). In *Proceedings of the fifth annual workshop on Computational learning theory* (pp. 440-449).

## 註釋

## 引述

## 拎
*Seq2SeqSharp LSTM/BiLSTM/Transformer recurrent neural networks framework running on CPUs and GPUs for sequence-to-sequence tasks.