1. 程式人生 > >吳恩達deepLearning.ai迴圈神經網路RNN學習筆記_看圖就懂了!!!(理論篇)

吳恩達deepLearning.ai迴圈神經網路RNN學習筆記_看圖就懂了!!!(理論篇)

 

前言

目錄:

    RNN提出的背景

        - 一個問題

        - 為什麼不用標準神經網路

        - RNN模型怎麼解決這個問題

        - RNN模型適用的資料特徵

        - RNN幾種型別

    RNN模型結構

        - RNN block

        - 簡化符號表示

        - stacked RNN

        - 雙向RNN

        - 梯度消失爆炸問題

     GRU模型結構

     LSTM模型結構 

        - LSTM背後的關鍵思想

        - Step by Step理解LSTM

 

本文可以解答:

  • RNN用來解決什麼問題,什麼樣的資料特徵適合用它來解決

  • ​RNN的缺陷是什麼,LSTM,GRU是如何解決這些缺陷的

  • 理解從簡單RNN到LSTM的每個模型的結構

RNN提出背景/適用場景

一個問題

我們考慮一下這麼一個問題,任意給定一句話,判斷句子裡的單詞是不是人名的一部分。比如輸入

x : Harry Potter and Hermione Granger invented a new spell.

單詞有

['Harry', 'Potter', 'and', 'Hermione', 'Granger', 'invented', 'a', 'new', 'spell']

如果1表示單詞是人名一部分,0表示不是人名的部分,那麼輸出的y就應該是

[1, 1, 0, 1, 1, 0, 0, 0, 0]

y的組成是和x等長,相同的index對應x中元素是不是人名。我們把x中的每個單詞用one-hot向量來表徵,如下所示。

 

 

為什麼不用標準的神經網路?

 

如果我們用標準的神經網路來解決這個問題,標準神經網路的結構是這樣的

 

 

標準神經網路的流程,將樣本資料x一次性輸入,從左邊傳到右邊(輸出層)。這樣做不好的地方在於:

  • 輸入和輸出的長度不固定,比如有的句子輸入長度是10,有的句子長度就不是10。

  • 如果使用標準網路,它不能共享文字不同位置學習到的東西,比如知道Harry是人名一部分,如果第i個位置又出現了Harray,它是不能自動識別的。

 

RNN模型怎麼解決這個問題

 

 

RNN對資料的處理流程如上圖所示,它不會同時輸入資料。我們將首先輸入X1(第一個單詞Harray)得到預估值y1(Harray是不是人名一部分),然後將X1計算的結果傳遞到下一層與輸入X2(第二個單詞Potter)結合輸出對X2的預測y2(Potter是不是人名一部分),這樣y2的預測其實受X1的影響,以此類推。這樣就解決了標準神經網路帶來的問題。

 

RNN模型適用的資料特徵

 

上面的句子有個特徵:

  • States Dependency:當前的狀態和上一步的狀態是相關的;

  • 資料是序列的(sequential): 當我們說一個數據是序列的,是指資料之間有時間順序,它是在不同時間輸入的,如果我們更改順序,把句子中的單詞打亂,它就變的不同失去含義了。能用標準神經網路訓練的資料就是可以打亂順序,所以我們可以在一開始就輸入它們。

 

所以用RNN最大的動力就是它可以連線之前的資料,意味著這個模型關心之前的東西是什麼,接下來將要出現什麼。

 

RNN的幾種型別

 

除了上面的例子,RNN根據不同的輸入和輸出數量,有以下幾種型別:

 

 

one on one: 輸入一張圖片,輸出圖片中的活動。

one  to many: 輸入一張圖片,輸出描述圖片中的內容,其中輸出的內容前後是有依賴的,相關的,比如上面一張圖就是‘一個人在跑步’,‘一個’和‘人’是相關的,如果‘一個’變了,那麼‘人’可能也會變。

 

many to one: 情感分類,輸入是一個句子,輸出是評分,輸入的前後是依賴相關的。

 

many to many: 翻譯系統,將德語翻譯成英語,輸入和輸出都是相關的。

 

many to many: 語音識別,傳入一段語音,輸出是轉換成的文字。

 

RNN的模型結構

 

RNN block

 

我們的模型將會採用兩個值,t時間處,X的輸入值和前一個單元格 t-1 時間處的輸出值A。左邊是傳統的神經網路模型,它在左邊基礎上是如何變成右邊的?我們用第一個單元的運算來舉例。

 

方程①:就像我們使用簡單ANN所做的那樣,它也存在權重Wax,Waa和偏差Ba。它只是增加一個輸入值A0(前一個單元的輸出值)。 

單元有兩個不同的輸出: A1的輸出(由公式②得到)將轉到下一個單元,公式③的最終輸出Y1。

所有權重的下標意思是,第一個下標是計算某型別的量,第二個下標是你要乘以的型別。比如Wax,它乘以的是X1,要計算的是A1,所以它的下標是ax。

 

現在,讓我們進入下一個單元。整個過程如下圖所示。

 

 

簡化符號表示

 

但是為了簡化符號,後面圖中的公式都是簡化的符號, 令:

於是:

我們將

變成

符號變了,但是意思是沒有變的,只是為了方便簡寫,所以後面都是用簡化後的公式。

 

Stacked RNN

 

如果把RNN堆在一起,輸出的y又可以作為x輸入到另一個神經網路中,那麼它的結構就是這樣的。

 

雙向RNN

 

如果我們輸入以下句子:

He said, “Teddy bears are on sale!”

模型可能會判斷‘Teddy’是一個人名,是因為模型沒有考慮之後句子的含義,所以,這時候又要考慮前面又要考慮後面,就需要雙向的RNN,它的結構是這樣的: 

 

梯度消失/爆炸問題

 

我們看這樣一個例子:

The cat,which already ate ...(中間省略很長很長), was(預測這個單詞) full

The cats,which ate ...(中間省略很長很長), were(預測這個單詞) full

當預測一個很長的句子,而預測的值依賴於很前面的資訊(cat/cats),RNN就難以預測,這就是RNN不擅長處理的長依賴關係。為什麼呢?

 

關鍵問題就在於向後傳播。

向後傳播的目的是在每一層更新權重,為了更新權重,我們將計算損失函式的梯度,並且因為鏈式法則,會把多個梯度相乘。試想一下,如果梯度大於1,那麼多個梯度相乘將會使得數值比較大,用它來更新優化權重會比較大,這種情況我們叫做梯度爆炸(exploding gradients),這還不是大問題,因為我們可以做個梯度修剪,如果大於某個值就縮放就行了;真正的問題是,如果梯度小於1,那麼連乘梯度將使得結果非常的小,這樣它就不能更新權重,輸出的結果就沒有什麼不同,這樣的情況我們叫梯度消失(vanishing gradients),這就表明向後傳播是不能影響很前面層的。

 

這就是人們說RNN的記憶不好,如果輸入長度太長,我們就不能預測實際的值,造成這樣結果最根本原因就是神經網路中的權重更新。

 

那麼我們怎麼解決這個問題呢?

一個思想就是,與其記住所有的過去,不如選擇性的記住重要的資訊而忽略其它資訊。

 

GRU模型結構

 

如何做到選擇性的記憶之前的資訊?關鍵思想是提出了一個門控迴圈單元(Units Gated Recurrent Units),用它來控制重要資訊。

注: 圖中的tanh就是上面圖中啟用函式g的具體化函式。

 

GRU相對於RNN,多了一個綠色的框框,這個框框就是門控制器,我們把它叫做更新門,用來決定記住過去的資訊多少的,提供模型的記憶能力。

 

 

GRU第一步也是和RNN第一步一樣,用啟用函式啟用,但是它不會馬上被使用,而是作為候選值靜靜等待。接著計算GRU更新門的值,由於它採用的是sigmoid函式,所以它的輸出值範圍是在0到1之間的。所以將第2步的值乘以第1步的值實際上就是在做"選擇性記憶",如果是0,那麼就是“不記憶/不更新/不使用”,如果是1,那麼就是"記憶/更新/使用",就像一個開啟關閉的門。GRU第三步就是用更新門的值來決定當前是用新的計算值還是用之前的值。

 

它比接下來講的LSTM要簡單,引數要少,更少的引數就意味著減少過擬合,減少訓練時間。

 

LSTM的模型結構

 

LSTM背後的關鍵思想

 

LSTM的全稱是Long Short Term Memory networks,LSTM被明確設計為避免長期依賴問題。長時間記住資訊是它的預設行為,而不是它努力學習的東西。LSTM的關鍵是單元狀態(cell state),最上面那條水平線。圖中C表示,它將包含放在隱藏狀態值之外的記憶值。它有點像是傳送帶,僅僅在一些微小的線性變換下貫穿整個鏈條,資訊不加改變地流動非常容易。

LSTM可以通過門這種結構給cell state移除或增加資訊。門能夠選擇性讓資訊通過,它由sigmoid神經網路層和逐點乘法操作符組成。sigmoid層輸出0到1的數字,描述每個元件應該讓它通過多少。數值0表示都不通過,1表示讓它全部通過。

 

LSTM有三個門來保護和控制cell state的狀態。整個模型結構如下圖

 

 

圖中的三個綠色框框從左到右依次是忘記門(forget gate),更新門(update gate),輸出門(output gate)。

 

Step by Step理解LSTM

 

先整體看一下LSTM和GRU的不同:

 

 

讓我們看看右邊,前兩行其實就是和GRU一樣,第3行等式,它是計算忘記門的值,它用於更新單元狀態(第四行等式),最後第5行是計算輸出門,用於得到第6行A在t時刻的值。

 

 

第一步就是決定我們要從cell state中丟棄哪些資訊。這個決定是由叫‘forget gate layer’的sigmoid層指定的。它看起來像輸入ht-1,xt,然後為每個ct-1(t-1時刻的cell state)變數中的資料輸出0到1之間的數字。1就是保留全部,0是全部不要。

 

 

下一步是確定要在cell state下儲存哪些新資訊。

這一步包括兩個部分:

  • 首先,稱為“更新門”的sigmoid層決定了我們將更新哪些值。

  • 接下來,tanh層建立新候選值(可以新增到cell state中的值)C̃ t向量。

下一步將會結合這兩個值去對狀態進行更新。

 

 

這一步是更新cell state。

我們將舊狀態值和忘記門相乘,目的是忘記該忘記的資訊,只記住重要的資訊;然後用更新門和候選狀態相乘,目的是決定到底我們需要多少新狀態值的資訊。

最後,我們需要決定要輸出什麼。

這個輸出是在cell state基礎上計算的,但是是它的過濾版本。首先我們用sigmoid層來確定要輸出當前cell state的哪些部分;接著我們把結果送到tanh並和輸出門相乘,這樣我們就可以只輸出我們期望的那部分結果。 

因為有這三個額外的門,LSTM有著更強的記憶能力,它們控制著哪個部分需要記住,記住多少,所以它在處理序列模型的時候很受歡迎。

 

參考資料:

  • 吳恩達deeplearning.ai第五門課 Module 1: Recurrent Neural Networks (RNNs)

  • The Most Intuitive and Easiest Guide for Recurrent Neural Network

  • Must-Read Tutorial to Learn Sequence Modeling (deeplearning.ai Course #5)

  • 2015-08-Understanding-LSTMs

 

今日互動

 

文首的問題你想清楚了嗎? 

&n