如何深度理解RNN?——看图就好!
歡迎來到循環(huán)神經(jīng)網(wǎng)絡(luò)的插圖指南。我是邁克爾,也被稱為LearnedVector,我是AI語音領(lǐng)域的機器學(xué)習(xí)工程師。如果你剛剛開始使用ML并希望在Recurrent神經(jīng)網(wǎng)絡(luò)背后獲得一些直覺,那么這篇文章就適合你。
循環(huán)神經(jīng)網(wǎng)絡(luò)是一種強大的技術(shù),如果你想進入機器學(xué)習(xí),那么理解它就變得非常重要了。如果你使用智能手機或經(jīng)常上網(wǎng),那么你會經(jīng)常使用RNN的應(yīng)用程序。因為循環(huán)神經(jīng)網(wǎng)絡(luò)已經(jīng)被用于語音識別、語言翻譯、股票預(yù)測等等,它甚至用于圖像識別來描述圖片中的內(nèi)容。
所以我知道有許多關(guān)于循環(huán)神經(jīng)網(wǎng)絡(luò)的指南,但我想以分享插圖的方式解釋我是如何理解它的。我將避免講它背后的數(shù)學(xué)知識,而專注于RNN背后的真實的含義。通過閱讀這篇文章,你應(yīng)該對RNN有一個很好的理解。
序列數(shù)據(jù)
RNN是神經(jīng)網(wǎng)絡(luò)中的一種,它擅長對序列數(shù)據(jù)進行建模處理。要理解這意味著什么,讓我們做一個小實驗。假設(shè)你拍攝了一張球在時間上移動的靜態(tài)快照。
我們還要說你想預(yù)測球的移動方向。因此,只有你在屏幕上看到的信息,你才能做到這一點。但是你可以猜測,但你提出的任何答案都是隨機的猜測。如果不知道球的位置,就沒有足夠的數(shù)據(jù)來預(yù)測球的位置。
如果你連續(xù)記錄球位置的快照,那么你將有足夠的信息來做出更好的預(yù)測。
所以這是一個序列,一個特定的順序,其中是一個事物跟隨另一個事物。有了這些信息,你現(xiàn)在可以看到球向右移動。
序列數(shù)據(jù)有很多種形式。音頻是一種自然的序列,你可以將音頻頻譜圖分成塊并將其饋入RNN。
音頻頻譜圖切成塊
文本也是一種形式的序列,你可以將文本分成一系列字符或一系列單詞。
順序存儲
現(xiàn)在我們知道了RNN擅長處理預(yù)測的序列數(shù)據(jù),但是它是如何實現(xiàn)的呢?
它通過我喜歡稱為順序存儲的概念來做到這一點。獲得順序存儲的能力意味著什么?我們通過一個小例子來說明它。
我想邀請你說出你腦海中的字母。
這很簡單吧,如果你被教了這個特定的序列,你應(yīng)該能夠很快記起它。
那么現(xiàn)在嘗試反著說這些字母。
我敢打賭,這要困難得多。除非你之前練過這個特定的序列,否則你可能會遇到困難。
現(xiàn)在來一個更有趣的,咱們從字母F開始。
首先,你會在前幾個字母上掙扎,但是在你的大腦拿起圖案后,剩下的就會自然而然。
因此,有一個非常合乎邏輯的原因是困難的。你將字母表作為序列學(xué)習(xí),順序存儲是一種使大腦更容易識別序列模式的機制。
遞歸神經(jīng)網(wǎng)絡(luò)
這樣咱們就可以知道RNN有順序存儲的這個抽象概念,但是RNN如何學(xué)習(xí)這個概念呢?那么,讓我們來看一個傳統(tǒng)的神經(jīng)網(wǎng)絡(luò),也稱為前饋神經(jīng)網(wǎng)絡(luò)。它有輸入層,隱藏層和輸出層。
我們?nèi)绾斡?xùn)練一個前饋神經(jīng)網(wǎng)絡(luò),以便能夠使用以前的信息來影響以后的信息呢?如果我們在神經(jīng)網(wǎng)絡(luò)中添加一個可以傳遞先前信息的循環(huán)它將會變成什么呢?
這基本上就是一個遞歸神經(jīng)網(wǎng)絡(luò)了。RNN讓循環(huán)機制充當(dāng)高速公路以允許信息從一個步驟流到下一個步驟。
將隱藏狀態(tài)傳遞給下一個步驟
此信息是隱藏狀態(tài),它是先前輸入的表示。讓我們通過一個RNN用例來更好地理解它是如何工作的。
假設(shè)我們想要構(gòu)建一個聊天機器人,以為它們現(xiàn)在非常受歡迎。假設(shè)聊天機器人可以根據(jù)用戶輸入的文本對意圖進行分類。
對用戶輸入的意圖進行分類
為了解決這個問題。首先,我們將使用RNN對文本序列進行編碼。然后,我們將RNN輸出饋送到前饋神經(jīng)網(wǎng)絡(luò)中,該網(wǎng)絡(luò)將對用戶輸入意圖進行分類。
假設(shè)用戶輸入: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)該能夠獲取最終輸出并將其傳遞給前饋層以對意圖進行分類。
對于那些喜歡在這里查看代碼的人來說,使用python展示了控制流程應(yīng)該是最好的方式。
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ī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ò)有三個主要步驟。首先,它進行前向傳遞并進行預(yù)測。其次,它使用損失函數(shù)將預(yù)測與基礎(chǔ)事實進行比較。損失函數(shù)輸出一個錯誤值,該錯誤值是對網(wǎng)絡(luò)執(zhí)行得有多糟糕的估計。最后,它使用該誤差值進行反向傳播,計算網(wǎng)絡(luò)中每個節(jié)點的梯度。
梯度是用于調(diào)整網(wǎng)絡(luò)內(nèi)部權(quán)重的值從而更新整個網(wǎng)絡(luò)。梯度越大,調(diào)整越大,反之亦然,這也就是問題所在。在進行反向傳播時,圖層中的每個節(jié)點都會根據(jù)漸變效果計算它在其前面的圖層中的漸變。因此,如果在它之前對層的調(diào)整很小,那么對當(dāng)前層的調(diào)整將更小。
這會導(dǎo)致漸變在向后傳播時呈指數(shù)級收縮。由于梯度極小,內(nèi)部權(quán)重幾乎沒有調(diào)整,因此較早的層無法進行任何學(xué)習(xí)。這就是消失的梯度問題。
梯度向后傳播時收縮
讓我們看看這如何適用于遞歸神經(jīng)網(wǎng)絡(luò)。你可以將循環(huán)神經(jīng)網(wǎng)絡(luò)中的每個時間步驟視為一個層。為了訓(xùn)練一個遞歸神經(jīng)網(wǎng)絡(luò),你使用了一種稱為通過時間反向傳播的方法。這樣梯度值在每個時間步長傳播時將呈指數(shù)級收縮。
隨著時間的推移,梯度會收縮
同樣,梯度值將用于在神經(jīng)網(wǎng)絡(luò)權(quán)重中進行調(diào)整,從而允許其學(xué)習(xí)。小的漸變意味著小的調(diào)整。這將導(dǎo)致最前面的層沒有優(yōu)化。
由于梯度消失,RNN不會跨時間步驟學(xué)習(xí)遠(yuǎn)程依賴性。這意味著在嘗試預(yù)測用戶的意圖時,有可能不考慮“what”和“time”這兩個詞。然后網(wǎng)絡(luò)就可能作出的猜測是“is it?”。這很模糊,即使是人類也很難辨認(rèn)這到底是什么意思。因此,無法在較早的時間步驟上學(xué)習(xí)會導(dǎo)致網(wǎng)絡(luò)具有短期記憶。
LSTM和GRU
RNN會受到短期記憶的影響,那么我們?nèi)绾螒?yīng)對呢?為了減輕短期記憶的影響,研究者們創(chuàng)建了兩個專門的遞歸神經(jīng)網(wǎng)絡(luò),一種叫做長短期記憶或簡稱LSTM。另一個是門控循環(huán)單位或GRU。LSTM和GRU本質(zhì)上就像RNN一樣,但它們能夠使用稱為“門”的機制來學(xué)習(xí)長期依賴。這些門是不同的張量操作,可以學(xué)習(xí)添加或刪除隱藏狀態(tài)的信息。由于這種能力,短期記憶對他們來說不是一個問題。如果你想了解有關(guān)LSTM和GRU的更多信息,你可以在其上查看我的插圖視頻。
總結(jié)
總而言之,RNN適用于處理序列數(shù)據(jù)以進行預(yù)測,但卻會受到短期記憶的影響。vanilla RNN的短期存儲問題并不意味著要完全跳過它們并使用更多進化版本,如LSTM或GRU。RNN具有更快訓(xùn)練和使用更少計算資源的優(yōu)勢,這是因為要計算的張量操作較少。當(dāng)你期望對具有長期依賴的較長序列建模時,你應(yīng)該使用LSTM或GRU。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的如何深度理解RNN?——看图就好!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码整洁之道(一)最佳实践小结
- 下一篇: 阿里测试环境运维及研发效率提升之道