---
# System prepended metadata

title: 遞迴神經網路
tags: [機器學習]

---

# 遞迴神經網路
###### 2021 陽明交大資訊人才培訓 by Ivor Chu
###### tags: `機器學習`

隱藏馬可夫模型
---
**序列資料**
序列資料是一組用時間排序的隨機變數，也就是説他們有先後關係，就像股票上上下下的有時間關係，語音辨識中字和字之間也有時間關係。序列資料中的隨機變數之間的關係可以被想成歷史如何影響今天，像是今天如果下雨，那會影響明天下雨的機率嗎？序列資料可以解決：
* 給定一個序列，問發生的機率
    * P(早安) > P(安早)
* 給定一個序列，預測下一個狀態
    * P(嗎|你好) > P(他|你好)
* 給定一個序列，預測一整個序列
    * P(how are you|你好嗎)

**圖機率模型**
結合圖與幾率的學習方法，每一個隨機變數都可以畫成圖上的一個點，隨機變數之間可以用圖來表示，因此我們可以用圖來描述更複雜隨機變數之間的關係，例如下圖中可以描述陰天會影像之後下雨的機率，進而影響草地溼滑的機率。圖機率模型包含三個部分：
* 代表性
    * 隨機變數之間要怎麼描述其關係，而不同的畫法則會影響學習的難易度，有的畫法很好學，有的畫法學不出東西
* 推理
    * 給定一些觀察到的狀態，估計其他隨機變數，假設今天已經觀察到草地濕了，則我應該估計是因為下雨還是因為灑水機噴的
* 學習
    * 給定很多觀察到的資料，求圖形的結構與參數，並學習這些隨機資料之間的關係

![](https://i.imgur.com/sUbqchH.png)

圖形資料可以彈性的加入先驗知識，因為某些變數就是這樣互相影響，這樣可以幫助我們不用去假設一個很大的假設模型，同時因為有些變數具有獨立性，像是某變數才會影響某變數，這樣可以大幅簡化模型複雜度。

**隱藏馬可夫模型**
隱藏馬可夫模型專門拿來處理序列問題，他有一個性質叫馬可夫性質，也就是只考慮昨天怎麼影響今天，歷史發生什麼事都與今天無關，因此他每次都會是t-1會影響t，可以寫成P(Xt|Xt-1)。下圖為隱藏馬可夫模型的範例，可以由每個事件對晴天、陰天或雨天的機率來推算出某兩相連的事件對晴天、陰天或雨天的機率為何。
![](https://i.imgur.com/dPdFTf8.png)


遞迴式神經網路訓練過程
---
**遞迴式神經網路**
遞迴式神經網路是用來處理序列資料，而這些序列資料是有時間順序，不能將其對換順序，這個特性導致遞迴式神經網路不能用普通的神經網路來訓練，因為普通的神經網路並沒有順序性，每一層神經元只是上一層的加總而已，並不會考慮到其位子，因此要設計新的架構來處理此類問題。此外，遞迴式神經網路也需要有記憶性，在馬可夫模型中只會紀錄上一刻與下一刻之間的關係，但在遞迴式神經網路中需要考慮到這一刻與這一刻之前所有變數的關係，也就是說要考慮到整個歷史對這一刻的影響，但這樣的模型會過於複雜，因此在每一個時間點都會加入新的資訊給隱藏狀態。首先會有一層神經網路的向量，而每個輸入資料會經過一個U來轉成一個較小的向量並加入下一個時間點的神經網路中，同時現在的隱藏狀態h需要經過一個學習得到的權重W(決定哪些記憶重要)，這個W會是一個矩陣，將這兩的東西加起來後再經過一個激活函數就會成為這個時間點的預測值，並傳入下一個時間點。他和傳統神經網路不同在於每個時間點都會加入隱藏狀態(記憶)，每個時間點都會含過去到現在的資訊，並用來計算輸出。遞迴式神經網路與馬可夫模型不同在於遞迴式神經網路擁有的隱藏狀態是一個連續的向量，可以容納更多歷史的訊息。
![](https://i.imgur.com/5atQeJ3.png)
y0到yt是標籤序列而x0到xt是輸入序列，P(yt|x0, x1, ..., xt)可以被寫成P(yt|h, xt)，而h代表壓縮所有歷史資訊，這樣可以被看作爲每個時間點都會在歷史上塞新的資訊給他。

**延展計算過程**
時間序列有一個問題，他是個可變的時間長度，一個數學式子寫完後是死的，像對你的計算圖就一定是固定的，但RNN中你輸進去的資訊有時很常有時很短，你的計算圖沒辦法固定，這時就要創建一個長度為最長可能的計算圖來做計算。此外，在每一個時間點他的U、W、O參數都是相同的(因為輸出會回到輸入)，因此參數會共用，那這樣梯度要怎麼算？
![](https://i.imgur.com/1oyGhyb.png)
遞迴式神經網路的計算圖如上所示，當資料進入神經網路中會乘上一個權重，並且加上這個時間點的新資訊後再經過激活函數當輸出，而這些資訊會傳遞至下一次計算並重複這個步驟。


序列至序列學習架構
---
**序列表徵**
ht裡包含了所有壓縮過的歷史資訊，他可以被視為表徵因為它將資料轉換為一個新的描述他的方式。當數入一組序列資料時，例如一段話，會把整句話的意義壓縮至隱藏層的向量中。下圖為將兩個RNN黏再一起已達到翻譯的效果，第一個RNN叫Encoder而第二個RNN叫Decoder，Encoder將中文句子的意義壓縮至神經網路中，而Decoder從神經網路中根據他儲存的表徵來轉換成另一種語言。
![](https://i.imgur.com/t7vAdNz.png)
同樣的邏輯也可以運用在摺積神經網路上，當你今天做完摺積後會得到一組表徵或是意義，這時只要丟入RNN去做解碼就可以達到幫圖片上標題的功能。
![](https://i.imgur.com/ovufrcb.png)


訓練遞迴式神經網路
---
**隨時間向後梯度傳遞**
一般的神經網路需透過梯度向後傳遞，但RNN多了時間，所以同時也需要傳遞時間。在RNN中每個參數重複參與每個時間點的計算過程，所以計算梯度時可以直接把梯度隨時間加總並往後移。從計算圖來看，假設我們到了最後一個時間點，我們使用他的輸出和資料的標籤來算loss，我們先把輸出yt+2做微分來看要怎麼調輸出，接著再往下調ht+2的輸入，但是每一層神經網路是由兩個輸入所組成的，因此不但要往下傳遞梯度到U，還要橫向傳遞到W，以此類推的傳至每一層神經網路，每一次傳下去的過程還可以順便算W，因為W夾在兩個神經網路中間。
![](https://i.imgur.com/RUIeV7C.png)
在計算loss對W的微分時，可以直接從Wt順著計算圖往上走到loss，並把路上遇到的值都乘起來，再對他做微分，不過問題是每一層加入的記憶都不一樣，他們算出來的梯度都會不太一樣，雖然他們乘的過程都一樣，每個W對loss也都有些貢獻，但每個時間點獲得的梯度不一樣，有的算出來方向可能會指東、有的可能會指西，這時我們就要把他們全部加在一起統合成一個梯度，接著我們就可以拿這個總和的微分來調整W的值，對於U因為他也有和W相同的性質，所以計算U的梯度時也是算其總和。
![](https://i.imgur.com/KvYOfYr.png)
![](https://i.imgur.com/VG5lIzo.png)

**訓練上的困難**
理論上RNN有非常長的記憶性，從loss上看，當你要調整loss時竟然和所有時間點都有關係，意思說所有輸入進來的資料都有可能和loss有關係，因此很難記得長期記憶關係。接著是梯度衰減與爆炸，再計算每一層神經網路的梯度時需要由上往回推並在每一層乘上W矩陣，從公式上來看每一次求梯度要乘上W的n次方，若今天W矩陣中的數值很大或很小，乘完的梯度會有可能變非常大或非常小。在一般的神經網路中不會發生這個問題，因為每一層的W都不一樣，有可能上下抵銷，但在RNN中卻是重複使用，所以我們會希望W有很好的性質，像是值接近於1，這樣一直乘才會維持穩定。這個問題也會進而導致再計算梯度時權重佔比不均，因為是算梯度的總和，因此若越乘越小的話到很深層的神經網路數值會變很小，相比較淺層的神經網路數值會比較大，調整梯度時自然就會比較傾向於較淺的神經網路(數值較大影響力較大)。
![](https://i.imgur.com/Cgk1LMG.png)


短期記憶性模型
---
**短期記憶性**
在RNN中因為W值重複使用的關係，導致再計算梯度時較深層的神經網路的影響力不足於較淺層的神經網路，這樣會讓雖然可以儲存長期記憶的RNN實際訓練上卻表現得和馬卡夫模型一樣，幾乎只考慮到時間順序較近的資料，讓RNN很容易遺忘強記憶而丟失他的優勢。在下圖中，計算梯度時只著重於Xt+2，至於X1就幾乎沒什麼影響，因為數值已經太小。
![](https://i.imgur.com/RCouu5x.png)

**Long-Short Term Memory 模型**
Long-Short Term Memory 可以調控資料參與計算的比例，像是強迫較深層的神經網路的數值提升並把較淺層的神經網路降低，達到再計算梯度時每一層神經網路都會有均衡的比重，在資料進入時會被乘上一個0到1之間的權重來決定此筆資料參與計算的比例，這樣可以適時的降低只有較淺層的神經網路才可以參與計算的問題，並且暫時緩和短期記憶性的問題，至於要如何決定讓哪些資料參與計算也是學來的，所以相比一般的RNN他會多學一個資料比重的參數。
![](https://i.imgur.com/ILWFGBt.png)
另外的方法是調控過去記憶參與計算的比例，簡單來說就是適時的遺忘，若碰到沒有用的資訊時就要禁止他進入計算，他會利用一個0到1之間的參數來當作一個閥門來調控之前記憶進入計算的比例。
![](https://i.imgur.com/h5p44Z7.png)

**數學公式**
Long-Short Term Memory 是一個很彈性的模型，他可以長期的調配短期的記憶，並且學習去保留重要的資訊和遺忘不重要的資訊。下圖為此模型會用到的數學公式，其會用到Sigmoid激活函數，這樣才可以生成0到1之間的數來調配資料的比重。
![](https://i.imgur.com/AIXATr8.png)


其他筆記
---
* [人工智慧與機器學習](https://hackmd.io/@ivorchu/BkCeyJydd)
* [深度學習](https://hackmd.io/@ivorchu/rJ3DPsgud)
* [卷積神經網路](https://hackmd.io/@ivorchu/SkIIoLkOu)
* [遞迴神經網路](https://hackmd.io/@ivorchu/Hkoaoildu)
* [最新深度學習研究進展](https://hackmd.io/@ivorchu/SJLdGwPuO)