如何深度理解RNN?——看圖就好!

摘要: 還在看數學公式學習瞭解RNN?out了吧!

clipboard.png

歡迎來到循環神經網絡的插圖指南。我是邁克爾,也被稱爲LearnedVector,我是AI語音領域的機器學習工程師。如果你剛剛開始使用ML並希望在Recurrent神經網絡背後獲得一些直覺,那麼這篇文章就適合你。

循環神經網絡是一種強大的技術,如果你想進入機器學習,那麼理解它就變得非常重要了。如果你使用智能手機或經常上網,那麼你會經常使用RNN的應用程序。因爲循環神經網絡已經被用於語音識別、語言翻譯、股票預測等等,它甚至用於圖像識別來描述圖片中的內容。

所以我知道有許多關於循環神經網絡的指南,但我想以分享插圖的方式解釋我是如何理解它的。我將避免講它背後的數學知識,而專注於RNN背後的真實的含義。通過閱讀這篇文章,你應該對RNN有一個很好的理解。

序列數據

RNN是神經網絡中的一種,它擅長對序列數據進行建模處理。要理解這意味着什麼,讓我們做一個小實驗。假設你拍攝了一張球在時間上移動的靜態快照。

clipboard.png

我們還要說你想預測球的移動方向。因此,只有你在屏幕上看到的信息,你才能做到這一點。但是你可以猜測,但你提出的任何答案都是隨機的猜測。如果不知道球的位置,就沒有足夠的數據來預測球的位置。

如果你連續記錄球位置的快照,那麼你將有足夠的信息來做出更好的預測。

clipboard.png

所以這是一個序列,一個特定的順序,其中是一個事物跟隨另一個事物。有了這些信息,你現在可以看到球向右移動。

序列數據有很多種形式。音頻是一種自然的序列,你可以將音頻頻譜圖分成塊並將其饋入RNN。

clipboard.png

音頻頻譜圖切成塊

文本也是一種形式的序列,你可以將文本分成一系列字符或一系列單詞。

順序存儲

現在我們知道了RNN擅長處理預測的序列數據,但是它是如何實現的呢?

它通過我喜歡稱爲順序存儲的概念來做到這一點。獲得順序存儲的能力意味着什麼?我們通過一個小例子來說明它。

我想邀請你說出你腦海中的字母。

clipboard.png

這很簡單吧,如果你被教了這個特定的序列,你應該能夠很快記起它。

那麼現在嘗試反着說這些字母。

clipboard.png

我敢打賭,這要困難得多。除非你之前練過這個特定的序列,否則你可能會遇到困難。

現在來一個更有趣的,咱們從字母F開始。

clipboard.png

首先,你會在前幾個字母上掙扎,但是在你的大腦拿起圖案後,剩下的就會自然而然。

因此,有一個非常合乎邏輯的原因是困難的。你將字母表作爲序列學習,順序存儲是一種使大腦更容易識別序列模式的機制。

遞歸神經網絡

這樣咱們就可以知道RNN有順序存儲的這個抽象概念,但是RNN如何學習這個概念呢?那麼,讓我們來看一個傳統的神經網絡,也稱爲前饋神經網絡。它有輸入層,隱藏層和輸出層。

clipboard.png

我們如何訓練一個前饋神經網絡,以便能夠使用以前的信息來影響以後的信息呢?如果我們在神經網絡中添加一個可以傳遞先前信息的循環它將會變成什麼呢?

clipboard.png

這基本上就是一個遞歸神經網絡了。RNN讓循環機制充當高速公路以允許信息從一個步驟流到下一個步驟。

clipboard.png

將隱藏狀態傳遞給下一個步驟

此信息是隱藏狀態,它是先前輸入的表示。讓我們通過一個RNN用例來更好地理解它是如何工作的。

假設我們想要構建一個聊天機器人,以爲它們現在非常受歡迎。假設聊天機器人可以根據用戶輸入的文本對意圖進行分類。

clipboard.png

對用戶輸入的意圖進行分類

爲了解決這個問題。首先,我們將使用RNN對文本序列進行編碼。然後,我們將RNN輸出饋送到前饋神經網絡中,該網絡將對用戶輸入意圖進行分類。

假設用戶輸入:what time is it?首先,我們將句子分解爲單個單詞。RNN按順序工作,所以我們一次只能輸入一個字。

clipboard.png

將一個句子分成單詞序列

第一步是將“What”輸入RNN,RNN編碼“what”併產生輸出。

clipboard.png

對於下一步,我們提供單詞“time”和上一步中的隱藏狀態。RNN現在有關於“what”和“time”這兩個詞的信息。

clipboard.png

我們重複這個過程,直到最後一步。你可以通過最後一步看到RNN編碼了前面步驟中所有單詞的信息。

clipboard.png

由於最終輸出是從序列的部分創建的,因此我們應該能夠獲取最終輸出並將其傳遞給前饋層以對意圖進行分類。

clipboard.png

對於那些喜歡在這裏查看代碼的人來說,使用python展示了控制流程應該是最好的方式

clipboard.png

RNN控制流的僞代碼

首先,初始化網絡層和初始隱藏狀態。隱藏狀態的形狀和維度將取決於你的遞歸神經網絡的形狀和維度。然後循環輸入,將單詞和隱藏狀態傳遞給RNN。RNN返回輸出和修改的隱藏狀態,接着就繼續循環。最後,將輸出傳遞給前饋層,然後返回預測。整個過程就是這樣!進行遞歸神經網絡的正向傳遞的控制流程是for循環。

梯度消失

你可能已經注意到隱藏狀態中奇怪的顏色分佈。這是爲了說明RNN被稱爲短期記憶的問題。

clipboard.png

RNN的最終隱藏狀態

短期記憶問題是由臭名昭着的梯度消失問題引起的,這在其他神經網絡架構中也很普遍。由於RNN處理很多步驟,因此難以保留先前步驟中的信息。正如你所看到的,在最後的時間步驟中,“what”和“time”這個詞的信息幾乎不存在。短期記憶和梯度消失是由於反向傳播的性質引起的,反向傳播是用於訓練和優化神經網絡的算法。爲了理解這是爲什麼,讓我們來看看反向傳播對深度前饋神經網絡的影響。

訓練神經網絡有三個主要步驟。首先,它進行前向傳遞並進行預測。其次,它使用損失函數將預測與基礎事實進行比較。損失函數輸出一個錯誤值,該錯誤值是對網絡執行得有多糟糕的估計。最後,它使用該誤差值進行反向傳播,計算網絡中每個節點的梯度。

clipboard.png

梯度是用於調整網絡內部權重的值從而更新整個網絡。梯度越大,調整越大,反之亦然,這也就是問題所在。在進行反向傳播時,圖層中的每個節點都會根據漸變效果計算它在其前面的圖層中的漸變。因此,如果在它之前對層的調整很小,那麼對當前層的調整將更小。

這會導致漸變在向後傳播時呈指數級收縮。由於梯度極小,內部權重幾乎沒有調整,因此較早的層無法進行任何學習。這就是消失的梯度問題。

clipboard.png

梯度向後傳播時收縮

讓我們看看這如何適用於遞歸神經網絡。你可以將循環神經網絡中的每個時間步驟視爲一個層。爲了訓練一個遞歸神經網絡,你使用了一種稱爲通過時間反向傳播的方法。這樣梯度值在每個時間步長傳播時將呈指數級收縮。

clipboard.png

隨着時間的推移,梯度會收縮

同樣,梯度值將用於在神經網絡權重中進行調整,從而允許其學習。小的漸變意味着小的調整。這將導致最前面的層沒有優化。

由於梯度消失,RNN不會跨時間步驟學習遠程依賴性。這意味着在嘗試預測用戶的意圖時,有可能不考慮“what”和“time”這兩個詞。然後網絡就可能作出的猜測是“is it?”。這很模糊,即使是人類也很難辨認這到底是什麼意思。因此,無法在較早的時間步驟上學習會導致網絡具有短期記憶。

LSTM和GRU

RNN會受到短期記憶的影響,那麼我們如何應對呢?爲了減輕短期記憶的影響,研究者們創建了兩個專門的遞歸神經網絡,一種叫做長短期記憶或簡稱LSTM。另一個是門控循環單位或GRU。LSTM和GRU本質上就像RNN一樣,但它們能夠使用稱爲“門”的機制來學習長期依賴。這些門是不同的張量操作,可以學習添加或刪除隱藏狀態的信息。由於這種能力,短期記憶對他們來說不是一個問題。如果你想了解有關LSTM和GRU的更多信息,你可以在其上查看我的插圖視頻。

總結

總而言之,RNN適用於處理序列數據以進行預測,但卻會受到短期記憶的影響。vanilla RNN的短期存儲問題並不意味着要完全跳過它們並使用更多進化版本,如LSTM或GRU。RNN具有更快訓練和使用更少計算資源的優勢,這是因爲要計算的張量操作較少。當你期望對具有長期依賴的較長序列建模時,你應該使用LSTM或GRU。

如果你有興趣深入瞭解,這裏有一些鏈接解釋RNN及其變體。

https://iamtrask.github.io/2015/11/15 ...

雲棲社區翻譯的LSTM的“前生今世”

本文作者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章