圖解 RNN (循環(huán)神經(jīng)網(wǎng)絡(luò)) 背后的數(shù)學(xué)原理
引言
現(xiàn)在,關(guān)于機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和人工神經(jīng)網(wǎng)絡(luò)的討論越來越多了。但程序員往往只想把這些魔幻的框架用起來,大多并不想知道背后到底是如何運(yùn)作的。但是如果我們能夠掌握這些背后的原理,對于使用起來豈不更好。
今天我們就來討論下循環(huán)神經(jīng)網(wǎng)絡(luò)及其背后的基本數(shù)學(xué)原理,這些原理使得循環(huán)神經(jīng)網(wǎng)絡(luò)能夠做到其他神經(jīng)網(wǎng)絡(luò)做不到的事情。
? RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))。
這篇文章的目的是對循環(huán)神經(jīng)網(wǎng)絡(luò)的功能、結(jié)構(gòu)提供一個(gè)直觀的認(rèn)識。
一個(gè)神經(jīng)網(wǎng)絡(luò)通常取自變量 X(或一組自變量)和因變量y ,然后它學(xué)習(xí)X 和 y之間的映射(我們稱之為訓(xùn)練),一旦訓(xùn)練完成,當(dāng)給定一個(gè)新的自變量,就能預(yù)測相應(yīng)的因變量。
但如果數(shù)據(jù)的順序很重要呢?想象一下,如果所有自變量的順序都很重要呢?
讓我來直觀地解釋一下吧。
只要假設(shè)每個(gè)螞蟻是一個(gè)獨(dú)立變量,如果一個(gè)螞蟻朝著不同的方向前進(jìn),對其他螞蟻來說都沒關(guān)系,對吧?但是,如果螞蟻的順序很重要怎么辦?
此時(shí),如果一只螞蟻錯過或者離開了群體,它將會影響到后面的螞蟻。
那么,在機(jī)器學(xué)習(xí)空間中,哪些數(shù)據(jù)的順序是重要的呢?
- 自然語言數(shù)據(jù)的詞序問題
- 語音數(shù)據(jù)
- 時(shí)間序列數(shù)據(jù)
- 視頻/音樂序列數(shù)據(jù)
- 股市數(shù)據(jù)
- 等等
那么 RNN 是如何解決整體順序很重要的數(shù)據(jù)呢?我們用自然文本數(shù)據(jù)為例來解釋 RNN。
假設(shè)我正在對一部電影的用戶評論進(jìn)行情感分析。
從這部電影好(This movie is good) — 正面的,再到這部電影差(This movie is bad) — 負(fù)面的。
我們可以通過使用簡單的詞匯袋模型對它們進(jìn)行分類,我們可以預(yù)測(正面的或負(fù)面的),但是等等。
如果影評是這部電影不好(This movie is not good),怎么辦?
BOW 模型可能會說這是一個(gè)積極的信號,但實(shí)際上并非如此。而 RNN 理解它,并預(yù)測它是消極的信息。
一. RNN 如何做到的呢?
1.各類 RNN 模型
(1)、一對多
RNN 接受一個(gè)輸入,比如一張圖像,并生成一個(gè)單詞序列。
(2)、多對一
RNN 接受一個(gè)單詞序列作為輸入,并生成一個(gè)輸出。
(3)、多對多
接下來,我們正專注于第二種模式多對一。RNN 的輸入被視為時(shí)間步長。
示例: 輸入(X) = [" this ", " movie ", " is ", " good "]
this 的時(shí)間戳是 x(0),movie 的是 x(1),is 的是 x(2),good 的是 x(3)。
2. 網(wǎng)絡(luò)架構(gòu)及數(shù)學(xué)公式
下面讓我們深入到 RNN 的數(shù)學(xué)世界。
首先,讓我們了解 RNN 單元格包含什么!我希望并且假設(shè)大家知道前饋神經(jīng)網(wǎng)絡(luò),F(xiàn)FNN 的概括,
? 隱藏層只有單一神經(jīng)元的前饋神經(jīng)網(wǎng)絡(luò)示例。
? 具有單一隱藏層的前饋神經(jīng)網(wǎng)絡(luò)。
在前饋神經(jīng)網(wǎng)絡(luò)中,我們有 X(輸入)、H(隱藏)和 Y(輸出)。我們可以有任意多的隱藏層,但是每個(gè)隱藏層的權(quán)值 W 和每個(gè)神經(jīng)元對應(yīng)的輸入權(quán)值是不同的。
上面,我們有權(quán)值 Wy10 和 Wy11,分別對應(yīng)于兩個(gè)不同的層相對于輸出 Y 的權(quán)值,而 Wh00、Wh01 等代表了不同神經(jīng)元相對于輸入的不同權(quán)值。
由于存在時(shí)間步長,神經(jīng)網(wǎng)絡(luò)單元包含一組前饋神經(jīng)網(wǎng)絡(luò)。該神經(jīng)網(wǎng)絡(luò)具有順序輸入、順序輸出、多時(shí)間步長和多隱藏層的特點(diǎn)。
與 FFNN 不同的是,這里我們不僅從輸入值計(jì)算隱藏層值,還從之前的時(shí)間步長值計(jì)算隱藏層值。對于時(shí)間步長,隱藏層的權(quán)值(W)是相同的。下面展示的是 RNN 以及它涉及的數(shù)學(xué)公式的完整圖片。
在圖片中,我們正在計(jì)算隱藏層的時(shí)間步長 t 的值:
? 不同的激活函數(shù)。
上面我們只計(jì)算了 Ht,類似地,我們可以計(jì)算所有其他的時(shí)間步長。
步驟:
需要注意的是:
一旦前饋輸入完成,我們就需要計(jì)算誤差并使用反向傳播法來反向傳播誤差,我們使用交叉熵作為代價(jià)函數(shù)。
3. BPTT(時(shí)間反向傳播)
如果你知道正常的神經(jīng)網(wǎng)絡(luò)是如何工作的,剩下的就很簡單了,如果不清楚,可以參考本號前面關(guān)于人工神經(jīng)網(wǎng)絡(luò)的文章。
我們需要計(jì)算下面各項(xiàng),
- 1、相對于輸出(隱藏和輸出單元)的總誤差如何變化?
- 2、相對于權(quán)重(U, V, W)的輸出如何變化?
因?yàn)?W 對于所有的時(shí)間步長都是一樣的,我們需要返回到前面,來進(jìn)行更新。
? RNN 中的 BPTT。
記住 RNN 的反向傳播和人工神經(jīng)網(wǎng)絡(luò)的反向傳播是一樣的,但是這里的當(dāng)前時(shí)間步長是基于之前的時(shí)間步長計(jì)算的,所以我們必須從頭到尾遍歷來回。
如果我們運(yùn)用鏈?zhǔn)椒▌t,就像這樣
? 反向傳播鏈?zhǔn)椒▌t。
在所有時(shí)間步長上的 W 都相同,因此按鏈?zhǔn)椒▌t展開項(xiàng)越來越多。
回到實(shí)例
現(xiàn)在我們回過頭來談?wù)勎覀兊那楦蟹治鰡栴},這里有一個(gè) RNN,
我們給每個(gè)單詞提供一個(gè)詞向量或者一個(gè)熱編碼向量作為輸入,并進(jìn)行前饋和 BPTT,一旦訓(xùn)練完成,我們就可以給出新的文本來進(jìn)行預(yù)測。它會學(xué)到一些東西,比如不+積極的詞 = 消極的。
RNN 的問題 → 消失/爆炸梯度問題
由于 W 對于所有的時(shí)間步長都是一樣的,在反向傳播過程中,當(dāng)我們回去調(diào)整權(quán)重時(shí),信號會變得要么太弱要么太強(qiáng),從而導(dǎo)致要么消失要么爆炸的問題。