遞歸神經(jīng)網(wǎng)絡(luò)的圖解指南:直觀理解
如果你想學(xué)習(xí)機(jī)器學(xué)習(xí),理解遞歸神經(jīng)網(wǎng)絡(luò)這一強(qiáng)大技術(shù)非常重要。如果你使用智能手機(jī)或經(jīng)常上網(wǎng),你很有可能已經(jīng)使用過應(yīng)用了RNN的應(yīng)用程序。遞歸神經(jīng)網(wǎng)絡(luò)用于語音識別,語言翻譯,股票預(yù)測; 甚至用于圖像識別來描述圖片中的內(nèi)容。
網(wǎng)上已經(jīng)有許多關(guān)于遞歸神經(jīng)網(wǎng)絡(luò)的指南,本文通過分享插圖以及解釋我是如何理解它的。我將避免所有數(shù)學(xué)公式,而是專注于RNN背后的直覺。在這篇文章的最后,希望你應(yīng)該對RNN有一個很好的理解,并有所啟發(fā)。
序列數(shù)據(jù)
RNN是神經(jīng)網(wǎng)絡(luò),擅長建模序列數(shù)據(jù)。要理解這意味著什么,讓做一個實驗。假設(shè)你拍攝一張移動的球在時間上的靜態(tài)快照。
此時你想預(yù)測球的移動方向。因此,當(dāng)你只有在屏幕上看到的信息時,你將如何做呢?可以繼續(xù)猜測,你提出的任何答案都是隨機(jī)的猜測。如果不知道球的位置,就沒有足夠的數(shù)據(jù)來預(yù)測球的位置。
如果你連續(xù)記錄球的位置的許多快照,你將有足夠的信息來做出更好的預(yù)測。
所以這是一個序列,一個特定的順序,一個跟著另一個。有了這些信息,您現(xiàn)在可以看到球向右移動。
序列數(shù)據(jù)有多種形式。音頻是一種自然序列, 你可以將音頻頻譜圖分成塊并將其輸入RNN。
音頻頻譜圖切成塊
文本是另一種形式的序列。你可以將文本分成一系列字符或一系列單詞。
順序記憶
RNN擅長處理預(yù)測的序列數(shù)據(jù),其通過順序記憶的概念來做到這一點。下面邀請你說出你腦海中的字母。
這很簡單吧,如果你學(xué)過這個特定序列,它應(yīng)該很快被腦海反饋出來。
現(xiàn)在嘗試反向說字母。
我敢打賭,這要困難得多。除非你之前練過這個特定的序列,否則你可能會遇到困難。
下面從字母F開始。
首先,你會在前幾個字母上掙扎,但是在你的大腦拿起模式后,剩下的就會自然而然。順序記憶是一種使大腦更容易識別序列模式的機(jī)制。
遞歸神經(jīng)網(wǎng)絡(luò)
就像人一樣,RNN也有順序記憶的這個抽象概念,但是RNN如何復(fù)制這個概念呢?那么,來看一個傳統(tǒng)的神經(jīng)網(wǎng)絡(luò),也稱為前饋神經(jīng)網(wǎng)絡(luò)。它有輸入層,隱藏層和輸出層。
前饋神經(jīng)網(wǎng)絡(luò)
如何使得一個前饋神經(jīng)網(wǎng)絡(luò),以便能夠使用以前的信息來影響以后的信息呢?如果在神經(jīng)網(wǎng)絡(luò)中添加一個可以傳遞先前信息的循環(huán)怎么辦?
遞歸神經(jīng)網(wǎng)絡(luò)
下圖基本上就是一個遞歸的神經(jīng)網(wǎng)絡(luò), RNN具有循環(huán)機(jī)制,其充當(dāng)高速公路以允許信息從一個步驟流到下一個步驟。
將隱藏狀態(tài)傳遞給下一個步驟
此信息是隱藏狀態(tài),它是先前輸入的表示。讓通過一個RNN用例來更好地理解它是如何工作的。
假設(shè)想要構(gòu)建一個聊天機(jī)器人。假設(shè)聊天機(jī)器人可以根據(jù)用戶輸入的文本對意圖進(jìn)行分類。
對用戶輸入的文本進(jìn)行分類
解決這個問題。首先,將使用RNN對文本序列進(jìn)行編碼。然后,將RNN輸出饋送到前饋神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)將對意圖進(jìn)行分類。
好的,所以用戶輸入:
What time is it?
首先,將句子分解為單個單詞, RNN按先后順序工作,所以一次只能輸入一個字。
將一個句子分成單詞序列
第一步是將'What'輸入RNN。RNN編碼' What'并產(chǎn)生輸出。
對于下一步,提供單詞'time'和上一步中的隱藏狀態(tài)。RNN現(xiàn)在有關(guān)于'What'和'time'這兩個詞的信息。
重復(fù)這個過程,直到最后一步。你可以通過最后一步看到RNN編碼了前面步驟中所有單詞的信息。
由于最終輸出是從序列的其余部分創(chuàng)建的,因此應(yīng)該能夠獲取最終輸出并將其傳遞給前饋層以對意圖進(jìn)行分類。
對于那些喜歡查看代碼的人來說,下面的python代碼展示了上述流程。
RNN控制流的偽代碼
首先,初始化網(wǎng)絡(luò)層和初始隱藏狀態(tài)。隱藏狀態(tài)的形狀和維度將取決于你的遞歸神經(jīng)網(wǎng)絡(luò)的形狀和維度。然后循環(huán)輸入,將單詞和隱藏狀態(tài)傳遞給RNN。RNN返回輸出和修改的隱藏狀態(tài)。你繼續(xù)循環(huán),直到你說不出話來。最后,將輸出傳遞給前饋層,然后返回預(yù)測。就是這樣!進(jìn)行遞歸神經(jīng)網(wǎng)絡(luò)的正向傳遞的控制流程是for循環(huán)。
梯度消失
你可能已經(jīng)注意到隱藏狀態(tài)中奇怪的顏色分布, 這是為了說明RNN被稱為短期記憶的問題。
RNN的最終隱藏狀態(tài)
短期記憶是由梯度消失問題引起的,這在其他神經(jīng)網(wǎng)絡(luò)架構(gòu)中也很普遍。由于RNN處理更多步驟,因此難以保留先前步驟中的信息。正如你所看到的,在最后的時間步驟中,'what'和'time'這個詞的信息幾乎不存在。短期記憶和消失梯度是由于反向傳播的性質(zhì)------反向傳播是用于訓(xùn)練和優(yōu)化神經(jīng)網(wǎng)絡(luò)的算法。為了理解這是為什么,讓來看看反向傳播對深度前饋神經(jīng)網(wǎng)絡(luò)的影響。
訓(xùn)練神經(jīng)網(wǎng)絡(luò)有三個主要步驟。首先,它進(jìn)行前向傳遞并進(jìn)行預(yù)測。其次,它使用損失函數(shù)將預(yù)測與基礎(chǔ)事實進(jìn)行比較。損失函數(shù)輸出一個錯誤值,該錯誤值是對網(wǎng)絡(luò)執(zhí)行得有多糟糕的估計。最后,它使用該誤差值進(jìn)行反向傳播,計算網(wǎng)絡(luò)中每個節(jié)點的梯度。
梯度是用于調(diào)整網(wǎng)絡(luò)內(nèi)部權(quán)重的值,以便網(wǎng)絡(luò)學(xué)習(xí)。梯度越大,調(diào)整越大,反之亦然。這就是問題所在。在進(jìn)行反向傳播時,圖層中的每個節(jié)點都會根據(jù)梯度效果計算它在其前面的圖層中的漸變。因此,如果在它之前對層的調(diào)整很小,那么對當(dāng)前層的調(diào)整將更小。
這會導(dǎo)致梯度在向后傳播時呈指數(shù)級收縮。由于梯度極小,內(nèi)部權(quán)重幾乎沒有調(diào)整,因此較早的層無法進(jìn)行任何學(xué)習(xí)。這就是梯度消失問題。
梯度向后傳播時收縮
讓看看這如何適用于遞歸神經(jīng)網(wǎng)絡(luò)。你可以將遞歸神經(jīng)網(wǎng)絡(luò)中的每個時間步驟視為一個層。為了訓(xùn)練一個遞歸神經(jīng)網(wǎng)絡(luò),你使用了一種稱為反向傳播的反向傳播方法。梯度值在每個時間步長傳播時將呈指數(shù)級收縮。
隨著時間的推移,梯度會收縮
同樣,梯度用于在神經(jīng)網(wǎng)絡(luò)權(quán)重中進(jìn)行調(diào)整,從而允許其學(xué)習(xí)。小漸變意味著小的調(diào)整。這導(dǎo)致早期層不學(xué)習(xí)。
由于梯度消失,RNN不會跨時間步驟學(xué)習(xí)遠(yuǎn)程依賴性。這意味著在嘗試預(yù)測用戶的意圖時,有可能不考慮'what'和'time'這個詞。然后網(wǎng)絡(luò)必須用' is it?'做出最好的猜測。這很模糊,即使是人類也很難。因此,無法在較早的時間步驟上學(xué)習(xí)會導(dǎo)致網(wǎng)絡(luò)只具有短期記憶。
LSTM和GRU
那么RNN會受到短期記憶的影響,那么如何應(yīng)對呢?為了減輕短期記憶,創(chuàng)建了兩個專門的遞歸神經(jīng)網(wǎng)絡(luò)。一種叫做長短期記憶或簡稱LSTM。另一個是門控循環(huán)單位或GRU。LSTM和GRU本質(zhì)上就像RNN一樣,但它們能夠使用稱為'門'的機(jī)制來學(xué)習(xí)長期依賴性。這些門是不同的張量操作,可以學(xué)習(xí)添加或刪除隱藏狀態(tài)的信息。由于這種能力,短期記憶對他們來說不是一個問題。
聯(lián)系客服