領取你的遞歸神經網絡的入門教程!

介紹

領取你的遞歸神經網絡的入門教程!

人類不會每秒從頭開始思考。當你閱讀這篇文章時,你會根據你對前面的單詞的理解然後去理解之後認識的每個單詞。你不會丟掉所有東西,然後再次從頭開始思考,通常想法都是有持續性的。

傳統的神經網絡無法做到這一點,這似乎是一個主要的缺點。例如,假設你想分類電影中每個點發生的事件類型。目前還不清楚傳統神經網絡如何利用其對電影中之前事件的推理來未後來的事件提供信息。

遞歸神經網絡解決了這個問題。他們具有循環的網絡,允許信息持久。

領取你的遞歸神經網絡的入門教程!

在上圖中,一組神經網絡A查看一些輸入xt並輸出一個值ht。循環允許信息從網絡的一個步驟傳遞到下一個步驟。經常性神經網絡可以被認為是同一網絡的多個副本,每個副本都會將消息傳遞給後繼者。考慮如果我們展開循環會發生什麼:

領取你的遞歸神經網絡的入門教程!

這種鏈式性質揭示了遞歸神經網絡與序列和列表密切相關。它們是用於這種數據的神經網絡的自然架構。他們當然可以使用。在過去的幾年中,RNN應用於各種問題取得了令人難以置信的成功:語音識別、語言建模、翻譯、圖像字幕......

雖然它不是強制性的,但對讀者來說,理解WordVectors是什麼會有好處,這是一種創建Word矢量的技術。

什麼是遞歸神經網絡

“香草”型神經網絡(以及卷積網絡)的顯著侷限在於它們的API太受限制:它們接受固定大小的向量作為輸入(例如圖像)併產生固定大小的向量作為輸出(例如,不同類別的概率)。不僅如此:這些模型使用固定數量的計算步驟(例如模型中的層數)執行該映射。

經常性網絡更令人興奮的核心原因是它們允許我們對矢量序列進行操作:輸入序列、輸出或最一般情況下的序列。

一些例子可能會使這個更具體:

領取你的遞歸神經網絡的入門教程!

每個矩形都是一個矢量,箭頭表示函數(例如矩陣乘法)。輸入矢量為紅色,輸出矢量為藍色,綠色矢量為RNN狀態(稍後會詳細介紹)。

從左到右:

  • 無RNN的Vanilla處理模式,從固定尺寸輸入到固定尺寸輸出(例如圖像分類)。

  • 序列輸出(例如圖像字幕拍攝圖像並輸出一個單詞的句子)。

  • 序列輸入(例如,將給定句子分類為表達正面或負面情緒的情緒分析)序列輸入和序列輸出(例如,機器翻譯:RNN讀取英文句子,然後輸出法語句子)。

  • 同步序列輸入和輸出(例如,我們希望標記視頻的每個幀的視頻分類)。

  • 請注意,在所有情況下,長度序列都沒有預先指定的約束,因為經常變換(綠色)是固定的,並且可以按照我們的喜好多次應用。

  • 我們稍後會看到,RNN將輸入向量與它們的狀態向量組合起來,形成一個固定的(但是學習到的)函數,以產生一個新的狀態向量。

RNN計算

那麼這些事情是如何工作的?

他們接受一個輸入向量x並給出一個輸出向量y。然而,關鍵的是,這個輸出向量的內容不僅受到剛剛輸入的影響,還受到過去輸入的整個歷史記錄的影響。作為一個類,RNN的API由一個單步函數組成:

領取你的遞歸神經網絡的入門教程!

RNN類具有一些內部狀態,每次調用該步時都會進行更新。在最簡單的情況下,這個狀態由單個隱藏向量h組成。下面是Vanilla RNN中step函數的實現:

領取你的遞歸神經網絡的入門教程!

以上指定了“香草”型RNN的正向傳球。這個RNN的參數是三個矩陣

  • W_hh:基於前一個隱藏狀態的矩陣

  • W_xh:基於電流輸入的矩陣

  • W_hy:基於隱藏狀態和輸出之間的矩陣

隱藏狀態self.h用零矢量初始化。 np.tanh(雙曲正切)函數實現將激活壓縮到範圍[-1,1]的非線性。

所以它是如何工作的:

tanh中有兩個術語:一個基於前一個隱藏狀態,另一個基於當前輸入。在numpy中,np.dot是矩陣乘法。兩個中間體與加法相互作用,然後被tanh壓扁成新的狀態向量。

隱藏狀態更新的數學表示法是 -

領取你的遞歸神經網絡的入門教程!

tanh在元素上應用。

我們用隨機數初始化了RNN的矩陣,並且在訓練過程中的大部分工作都是尋找產生理想行為的矩陣,如用一些損失函數來衡量的,這些損失函數表示您希望得到的輸出類型。

那麼我們現在深入進行

領取你的遞歸神經網絡的入門教程!

換句話說,我們有兩個獨立的RNN:一個RNN正在接收輸入矢量,第二個RNN正在接收第一個RNN的輸出作為其輸入。

簡單地提一下,在實踐中,我們大多數人使用的方式與上面提到的長期短期記憶(LSTM)網絡略有不同。 LSTM是一種特殊類型的循環網絡,由於其更強大的更新方程和一些吸引人的後向傳播動態,在實踐中效果稍好。

一個例子 - 字符級語言模型

我們將訓練RNN字符級語言模型。也就是說,我們會給RNN大片的文本,並要求它給出一系列先前字符序列中下一個字符的概率分佈。這將允許我們一次生成一個新字符。

具體而言,我們將使用1-k編碼將每個字符編碼為一個矢量(即,除詞彙表中字符索引處的單個字符以外的所有零),然後使用幫助一次將它們送入RNN的一個步驟功能。然後,我們將觀察一系列4維輸出向量(每個字符一個維度),我們將其解釋為RNN當前分配給序列中接下來每個字符的置信度。這是一張圖表:

領取你的遞歸神經網絡的入門教程!

例如,我們看到,在RNN看到字符“h”的第一個時間步中,它給1.0的下一個字母為“h”,2.2為字母“e”,-3.0至“l”和4.1到“o”。由於在我們的訓練數據(字符串“hello”)中,下一個正確的字符是“e”,我們希望增加其信心(綠色)並降低所有其他字母(紅色)的置信度。

由於RNN完全由可微分操作組成,因此我們可以運行反向傳播算法(這只是遞歸應用來自演算的鏈式規則),以找出我們應該調整的每一個權重的方向,以增加分數正確的目標(綠色粗體數字)。

然後,我們可以執行參數更新,就可以在這個梯度方向上輕輕推動每個權重。如果我們在參數更新之後向RNN提供相同的輸入,我們會發現正確字符的分數(例如,第一個時間步中的“e”)會略高(例如2.3而不是2.2),不正確字符的分數會略低。

然後我們多次重複這個過程,直到網絡收斂,並且預測最終與訓練數據一致,因為正確的字符總是接下來預測的。

更技術性的解釋是我們在每個輸出向量上同時使用標準的Softmax分類器(通常也稱為交叉熵損失)。 RNN使用小批量隨機梯度下降進行訓練。

還要注意,第一次輸入字符“l”時,目標是“l”,但第二次目標是“o”。因此,RNN不能單獨依靠輸入,並且必須使用其循環連接來跟蹤上下文以實現此任務。

在測試的時候,我們會向RNN提供一個角色,並分配下一個可能出現的角色。


分享到:


相關文章: