如何深度理解RNN?——看圖就好!
歡迎來到迴圈神經網路的插圖指南 。我是 邁 克 爾 ,也被稱 為 LearnedVector ,我是 AI 語音領域的機器學習工程師 。如果你 剛剛 開始使用 ML 並希望在 Recurrent 神 經 網 絡 背後 獲 得一些直 覺 ,那麼 這 篇文章就適合你。
迴圈神經網路是一種強大的技術,如果你想進入機器學習,那麼理解它就變得非常重要了。如果你使用智慧手機或經常上網,那麼你會經常使用RNN的應用程式。因為迴圈神經網路已經被用於語音識別、語言翻譯、股票預測等等,它甚至用於影象識別來描述圖片中的內容。
所以我知道有許多關於迴圈神經網路的指南,但我想以分享插圖的方式解釋我是如何理解它的。我將避免講它背後的數學知識,而專注於RNN背後的真實的含義。通過閱讀這篇文章,你應該對RNN有一個很好的理解。
序列資料
RNN 是神經網路中的一種,它擅長對序列資料進行建模處理。要理解這意味著什麼,讓我們做一個小實驗。假設你拍攝了一張球在時間上移動的靜態快照。
Line"/>
我們還要說你想預測球的移動方向。因此,只有你在螢幕上看到的資訊,你才能做到這一點。但是你可以猜測,但你提出的任何答案都是隨機的猜測。如果不知道球的位置,就沒有足夠的資料來預測球的位置。
如果你連續記錄球位置的快照,那麼你將有足夠的資訊來做出更好的預測。
所以這是一個序列,一個特定的順序,其中是一個事物跟隨另一個事物。有了這些資訊,你現在可以看到球向右移動。
序列資料有很多種形式。音訊是一種自然的序列,你可以將音訊頻譜圖分成塊並將其饋入RNN。
音 頻頻譜圖 切成 塊
文字也是一種形式的序列,你可以將文字分成一系列字元或一系列單詞。
順序儲存
現在我們知道了RNN擅長處理預測的序列資料,但是它是如何實現的呢?
它通過我喜歡稱為順序儲存的概念來做到這一點。獲得順序儲存的能力意味著什麼?我們通過一個小例子來說明它。
我想邀請你說出你腦海中的字母。
這很簡單吧,如果你被教了這個特定的序列,你應該能夠很快記起它。
那麼現在嘗試反著說這些字母。
我敢打賭,這要困難得多。除非你之前練過這個特定的序列,否則你可能會遇到困難。
現在來一個更有趣的,咱們從字母F開始。
首先,你會在前幾個字母上掙扎,但是在你的大腦拿起圖案後,剩下的就會自然而然。
因此,有一個非常合乎邏輯的原因是困難的。你將字母表作為序列學習,順序儲存是一種使大腦更容易識別序列模式的機制。
遞迴神經網路
這樣咱們就可以知道RNN有順序儲存的這個抽象概念,但是RNN如何學習這個概念呢?那麼,讓我們來看一個傳統的神經網路,也稱為前饋神經網路。它有輸入層,隱藏層和輸出層。
我 們 如何 訓練 一個前 饋 神 經 網 絡 ,以便能 夠 使用以前的資訊來影響以後的資訊呢?如果我 們 在神 經 網 絡 中新增一個可以 傳遞 先前資訊的循 環 它將會變成什麼呢?
這基本上就是一個遞迴神經網路了 。 RNN 讓循 環 機制充當高速公路以允 許 資訊從一個步 驟 流到下一個步 驟 。
將 隱 藏狀 態傳遞給 下一個步 驟
此資訊是隱藏狀態,它是先前輸入的表示。讓我們通過一個RNN用例來更好地理解它是如何工作的。
假設我們想要構建一個聊天機器人,以為它們現在非常受歡迎。假設聊天機器人可以根據使用者輸入的文字對意圖進行分類。
對使用者輸入的意圖進行分類
為了解決這個問題。首先,我們將使用RNN對文字序列進行編碼。然後,我們將RNN輸出饋送到前饋神經網路中,該網路將對使用者輸入意圖進行分類。
假設使用者輸入:what time is it?首先,我們將句子分解為單個單詞。RNN按順序工作,所以我們一次只能輸入一個字。
將一個句子分成 單詞 序列
第一步是將“What”輸入RNN,RNN編碼“what”併產生輸出。
對於下一步,我們提供單詞 “time” 和上一步中的 隱 藏狀 態 。 RNN 現在有關於 “ what ” 和 “ time ” 這兩個詞的資訊 。
我 們 重複 這 個 過 程,直到最後一步。你可以通 過 最後一步看到 RNN 編碼了前面步驟中所有單詞的資訊 。
由於最 終輸 出是從序列的部分 創 建的,因此我 們應該 能 夠獲 取最 終輸 出並將其 傳遞給 前 饋層 以 對 意 圖進 行分 類 。
對於那些喜歡在這裡檢視程式碼的人來說,使用 python 展示了控制流程應該是最好的方式。
RNN 控制流的 偽 代 碼
首先,初始化網路層和初始隱藏狀態。隱藏狀態的形狀和維度將取決於你的遞迴神經網路的形狀和維度。然後迴圈輸入,將單詞和隱藏狀態傳遞給RNN。RNN返回輸出和修改的隱藏狀態,接著就繼續迴圈。最後,將輸出傳遞給前饋層,然後返回預測。整個過程就是這樣!進行遞迴神經網路的正向傳遞的控制流程是for迴圈。
梯度消失
你可能已經注意到隱藏狀態中奇怪的顏色分佈。這是為了說明RNN被稱為短期記憶的問題。
RNN 的最 終隱 藏狀 態
短期記憶問題是由臭名昭著的梯度消失問題引起的,這在其他神經網路架構中也很普遍。由於RNN處理很多步驟,因此難以保留先前步驟中的資訊。正如你所看到的,在最後的時間步驟中,“what”和“time”這個詞的資訊幾乎不存在。短期記憶和梯度消失是由於反向傳播的性質引起的,反向傳播是用於訓練和優化神經網路的演算法。為了理解這是為什麼,讓我們來看看反向傳播對深度前饋神經網路的影響。
訓練神經網路有三個主要步驟。首先,它進行前向傳遞並進行預測。其次,它使用損失函式將預測與基礎事實進行比較。損失函式輸出一個錯誤值,該錯誤值是對網路執行得有多糟糕的估計。最後,它使用該誤差值進行反向傳播,計算網路中每個節點的梯度。
梯度是用於調整網路內部權重的值從而更新整個網路。梯度越大,調整越大,反之亦然,這也就是問題所在。在進行反向傳播時,圖層中的每個節點都會根據漸變效果計算它在其前面的圖層中的漸變。因此,如果在它之前對層的調整很小,那麼對當前層的調整將更小。
這會導致漸變在向後傳播時呈指數級收縮。由於梯度極小,內部權重幾乎沒有調整,因此較早的層無法進行任何學習。這就是消失的梯度問題。
梯度向後 傳 播 時 收 縮
讓我們看看這如何適用於遞迴神經網路。你可以將迴圈神經網路中的每個時間步驟視為一個層。為了訓練一個遞迴神經網路,你使用了一種稱為通過時間反向傳播的方法。這樣梯度值在每個時間步長傳播時將呈指數級收縮。
隨著 時間 的推移,梯度會收 縮
同樣,梯度值將用於在神經網路權重中進行調整,從而允許其學習。小的漸變意味著小的調整。這將導致最前面的層沒有優化。
由於梯度消失,RNN不會跨時間步驟學習遠端依賴性。這意味著在嘗試預測使用者的意圖時,有可能不考慮“what”和“time”這兩個詞。然後網路就可能作出的猜測是“is it?”。這很模糊,即使是人類也很難辨認這到底是什麼意思。因此,無法在較早的時間步驟上學習會導致網路具有短期記憶。
LSTM和GRU
RNN 會受到短期記憶的影響,那麼我們如何應對呢?為了減輕短期記憶的影響,研究者們建立了兩個專門的遞迴神經網路,一種叫做長短期記憶或簡稱LSTM。另一個是門控迴圈單位或GRU。LSTM和GRU本質上就像RNN一樣,但它們能夠使用稱為“門”的機制來學習長期依賴。這些門是不同的張量操作,可以學習新增或刪除隱藏狀態的資訊。由於這種能力,短期記憶對他們來說不是一個問題。如果你想了解有關LSTM和GRU的更多資訊,你可以在其上檢視我的 ofollow,noindex"> 插圖視訊 。
總結
總而言之,RNN適用於處理序列資料以進行預測,但卻會受到短期記憶的影響。vanilla RNN的短期儲存問題並不意味著要完全跳過它們並使用更多進化版本,如LSTM或GRU。RNN具有更快訓練和使用更少計算資源的優勢,這是因為要計算的張量操作較少。當你期望對具有長期依賴的較長序列建模時,你應該使用LSTM或GRU。
如果你有興趣深入瞭解,這裡有一些連結解釋RNN及其變體。
OTAy" target="_blank" rel="nofollow,noindex"> https : //iamtrask.github.io/2015/11/15 ...
雲棲社群翻譯的 LSTM的“前生今世”
本文由 阿里云云棲社群 組織翻譯。
文章原標題《illustrated-guide-to-recurrent-neural-networks》
作者: Michael Nguyen 譯者:虎說八道,審校:。
文章為簡譯,更為詳細的內容,請檢視 原文 。