選單

一文讀懂迴圈神經網路!

本文轉自量子位

一文讀懂迴圈神經網路!

AI識別你的語音、回答你的問題、幫你翻譯外語,都離不開一種特殊的迴圈神經網路(RNN):長短期記憶網路(Long short-term memory,LSTM)。

圖解教程的作者Michael Nguyen是一名AI語音助理方面的機器學習工程師。

下面,跟著量子位一起來

學習一下~

短期記憶問題

RNN受限於短期記憶問題。如果一個序列足夠長,那它們很難把資訊從較早的時間步傳輸到後面的時間步。因此,如果你嘗試處理一段文字來進行預測,RNN可能在開始時就會遺漏重要資訊。

在反向傳播過程中,RNN中存在梯度消失問題。梯度是用於更新神經網路權重的值,梯度消失問題是指隨著時間推移,梯度在傳播時會下降,如果梯度值變得非常小,則不會繼續學習。

梯度更新規則

因此,在RNN中,梯度小幅更新的網路層會停止學習,這些通常是較早的層。由於這些層不學習,RNN無法記住它在較長序列中學習到的內容,因此

它的記憶是短期的。

解決方案:LSTM和GRU

LSTM和GRU是克服短期記憶問題提出的解決方案,它們引入稱作

“門”

的內部機制,可以調節資訊流。

一文讀懂迴圈神經網路!

這些門結構可以學習序列中

哪些資料是要保留的重要資訊,哪些是要刪除的

。透過這樣做,它可以沿著長鏈序列傳遞相關資訊來執行預測。幾乎所有基於RNN的先進結果都是透過這兩個網路實現的。LSTM和GRU經常用在語音識別、語音合成和文字生成等領域,還可用來為影片生成字幕。

當你看完這篇文章時,我相信你會對LSTM和GRU在處理長序列的突出能力有充分了解。下面我將透過直觀解釋和插圖來進行介紹,並儘可能繞開數學運算。

直觀認識

我們從一個思考實驗開始。當你在網路上購買生活用品時,一般會先閱讀商品評論來判斷商品好壞,以確定是否要購買這個商品。

一文讀懂迴圈神經網路!

當你檢視評論時,你的大腦下意識地只會記住重要的關鍵詞。你會選擇“amazing”和“perfectly balanced breakfast”這樣的詞彙,而不太關心“this”,“give”,“all”,“should”等字樣。如果有人第二天問你評論內容,你可能不會一字不漏地記住它,而是記住了主要觀點,比如“下次一定還來買”,一些

次要內容自然會從記憶中逐漸消失。

在這種情況下,你記住的這些詞能判定了這個餐廳的好壞。這基本上就是LSTM或GRU的作用,它可以學習

只保留相關資訊來進行預測

,並忘記不相關的資料。

RNN回顧

為了理解LSTM或GRU如何實現這一點,接下來

回顧下RNN

。RNN的工作原理如下:首先單詞被轉換成機器可讀的向量,然後RNN逐個處理向量序列。

逐個處理向量序列

在處理時,它把先前的隱藏狀態傳遞給序列的下一步,其中隱藏狀態作為神經網路記憶,它包含相關網路已處理資料的資訊。

把隱藏狀態傳遞給下個時間步

下面來介紹

RNN中每個cell單元是如何計算隱藏狀態的。

首先,將輸入和先前隱藏狀態組合成一個向量,向量中含有當前輸入和先前輸入的資訊。這個向量再經過啟用函式Tanh後,輸出新的隱藏狀態,或網路記憶。

RNN單元

啟用函式Tanh

啟用函式Tanh用於幫助調節流經網路的值,且Tanh函式的輸出值始終在區間(-1, 1)內。

當向量流經神經網路時,由於存在各種數學運算,它經歷了許多變換。因此,想象下讓一個值不斷乘以3,它會逐漸變大並變成天文數字,這會讓其他值看起來微不足道。

無Tanh函式的向量變換

Tanh函式能讓輸出位於區間(-1, 1)內,從而調節神經網路輸出。

你可以看到這些值是如何保持在Tanh函式的允許範圍內。

有Tanh函式的向量變換

這就是RNN,它的內部操作很少,但在適當情況下(如短序列分析)效果很好。RNN使用的計算資源比它的演化變體LSTM和GRU少得多。

LSTM

LSTM的控制流程與RNN類似,它們都是在前向傳播過程中處理傳遞資訊的資料,區別在於LSTM單元的結構和運算有所變化。

一文讀懂迴圈神經網路!

LSTM單元及其運算

這些運算能讓LSTM具備選擇性保留或遺忘某些資訊的能力

,下面我們將逐步介紹這些看起來有點複雜的運算。

核心概念

LSTM的核心概念為其

單元狀態

和各種

結構。

單元狀態相當於能傳輸相關資訊的通路

,讓資訊在序列鏈中傳遞下去,這部分可看作是網路的“記憶”。理論上,在序列處理過程中,單元狀態能一直攜帶著相關資訊。因此,在較早時間步中獲得的資訊也能傳輸到較後時間步的單元中,這樣能減弱短期記憶的影響。

在網路訓練過程中,可透過門結構來新增或移除資訊,不同神經網路都可

透過單元狀態上的門結構來決定去記住或遺忘哪些相關資訊

Sigmoid

門結構中包含Sigmoid函式,這個啟用函式與Tanh函式類似。但它的

輸出區間

不是(-1, 1),而是

(0, 1)

,這有助於更新或忘記資料,因為任何數字乘以0都為0,這部分資訊會被遺忘。同樣,任何數字乘以1都為相同值,這部分資訊會完全保留。透過這樣,網路能瞭解哪些資料不重要需要遺忘,哪些數字很重要需要保留。

Sigmoid輸出區間為(0, 1)

下面會深入介紹下不同門結構的功能。LSTM單元中有

三種調節資訊流的門結構

:遺忘門、輸入門和輸出門。

遺忘門

遺忘門能決定應丟棄或保留哪些資訊。來自先前隱藏狀態的資訊和當前輸入的資訊同時輸入到Sigmoid函式,輸出值處於0和1之間,越接近0意味著越應該忘記,越接近1意味著越應該保留。

遺忘門操作輸入門

輸入門用來更新單元狀態。先將先前隱藏狀態的資訊和當前輸入的資訊輸入到Sigmoid函式,在0和1之間調整輸出值來決定更新哪些資訊,0表示不重要,1表示重要。你也可將隱藏狀態和當前輸入傳輸給Tanh函式,並在-1和1之間壓縮數值以調節網路,然後把Tanh輸出和Sigmoid輸出相乘,Sigmoid輸出將決定在Tanh輸出中哪些資訊是重要的且需要進行保留。

輸入門操作單元狀態

這裡已經具備足夠資訊來計算單元狀態。首先把先前的單元狀態和遺忘向量逐點相乘,如果它乘以接近0的值,則意味在新的單元狀態中可能要丟棄這些值;然後把它和輸入門的輸出值逐點相加,把神經網路發現的新資訊更新到單元狀態中,這樣就得到了新的單元狀態。

計算單元狀態輸出門

輸出門能決定下個隱藏狀態的值,隱藏狀態中包含了先前輸入的相關資訊。當然,隱藏狀態也可用於預測。首先把先前的隱藏狀態和當前輸入傳遞給Sigmoid函式;接著把新得到的單元狀態傳遞給Tanh函式;然後把Tanh輸出和Sigmoid輸出相乘,以確定隱藏狀態應攜帶的資訊;最後把隱藏狀態作為當前單元輸出,把新的單元狀態和新的隱藏狀態傳輸給下個時間步。

輸出門操作

這裡

總結下

,遺忘門能決定需要保留先前步長中哪些相關資訊,輸入門決定在當前輸入中哪些重要資訊需要被新增,輸出門決定了下一個隱藏狀態。

程式碼示例

這裡還提供了一個用Python寫的示例程式碼,來讓大家能更好地理解這個結構。

一文讀懂迴圈神經網路!

首先,我們連線了先前的隱藏狀態和當前輸入,這裡定義為變數combine;

把combine變數傳遞到遺忘層中,以刪除不相關資料;

再用combine變數建立一個候選層,用來保留可能要新增到單元狀態中的值;

變數combine也要傳遞給輸出層,來決定應把候選層中的哪些資料新增到新的單元狀態中;

新的單元狀態可根據遺忘層、候選層和輸入層和先前的單元狀態來計算得到;

再計算當前單元輸出;

最後把輸出和新的單元狀態逐點相乘可得到新的隱藏狀態。

從上面看出,LSTM網路的控制流程實際上只是

幾個張量操作和一個for迴圈

。你還可以用隱藏狀態進行預測。結合這些機制,LSTM能在序列處理過程中有選擇性地保留或遺忘某些資訊。

GRU

介紹完LSTM的工作原理後,下面來看下門控迴圈單元GRU。GRU是RNN的另一類演化變種,與LSTM非常相似。GRU結構中

去除了單元狀態,而使用隱藏狀態來傳輸資訊。

它只有兩個門結構,分別是更新門和重置門。

一文讀懂迴圈神經網路!

GRU單元結構更新門

更新門的作用類似於LSTM中的遺忘門和輸入門,它能決定要丟棄哪些資訊和要新增哪些新資訊。

重置門

重置門用於決定丟棄先前資訊的程度。

這兩部分組成了GRU,它的張量操作較少,因此

訓練它比LSTM更快一點

。在選擇網路時很難判斷哪個更好,研究人員通常會兩個都試下,透過效能比較來選出更適合當前任務的結構。

總結

總而言之,RNN適用於處理序列資料和預測任務,但會受到短期記憶的影響。LSTM和GRU是兩種透過引入門結構來減弱短期記憶影響的演化變體,其中門結構可用來調節流經序列鏈的資訊流。目前,LSTM和GRU經常被用於語音識別、語音合成和自然語言理解等多個深度學習應用中。