1. 程式人生 > >從零開始機器學習-19 RNN:迴圈神經網路

從零開始機器學習-19 RNN:迴圈神經網路

本文由 沈慶陽 所有,轉載請與作者取得聯絡!

前言

相比於適合單個物件的卷積網路(Convolutional Neural Network,CNN),迴圈網路(Recurrent Neural Network,RNN)更加適合序列型別的資料。迴圈網路應用最多的領域有:機器翻譯、語音識別、文章/音樂創作等。這是因為卷積網路的設計理念是在空間上共享引數,而迴圈網路的設計理念是在實踐上共享引數。卷積網路和迴圈網路的目的都是為了提取、尋找模式(Pattern)。

什麼是迴圈神經網路

人工神經網路(Artificial Neural Network,ANN)在一定程度上模擬了大腦中神經元之間運作的方式。在卷積神經網路中,其輸入是單張的影象(或音訊、三維的模型等),對於影象分類的場景十分有效。但事實上,生物神經網路的感知並非是靜止的單張影象的,其對世界的感知是建立在一連串影象組成的序列之上、一連串文字組成句子之上、一連串動作組成的行為之上。影象與影象之間存在聯絡、一句話中的字與字之間也存在關係…人類的大腦可以處理這些連續的輸入,是因為神經網路的連線是存在環的,而非像是卷積網路這種前饋網路中的輸入和輸出(上一層的輸出是下一層的輸入)這般存在(有向無環圖)。迴圈神經網路正是建立在這種模擬生物神經網路中環的存在的基礎上的。
假設有一個序列由事件組成(隨時間推進),我們的目標是對這個序列中的事件在每個時間點上進行預測。
一個由事件構成的序列


在上面的這個情景之下,如果序列隨時間推移的變化很小,那麼我們則可以在每個時間點使用相同的分類器。這是最基本、也是最簡單的情景,實際情況並非如此。實際上,在對某個時間點的事件進行預測的時候,我們需要將已經發生過的事件也考慮在內,這就包括了在預測點之前發生的所有事件。
一種方法是將分類器的狀態迴圈(遞迴)地使用,作為對之前發生的所有事件的總結。因為一個序列的長度可以很長,對於上百個、上千個長度的序列,也就意味著網路的深度也需要成百上千層,這顯然是不明智的做法。
另一種思想是捆綁,使用單個模型來總結過去的資訊,並將其提供給分類器,在每個時間點(步)中,將分類器的一部分連線到輸入層,另一部分連線到過去的事件,這一部分也就叫做遞迴連線層。
在對上文進行了閱讀之後,我們會更好地理解迴圈網路的結構。迴圈神經網路只有一個自連線的隱藏層,這個隱藏層的輸出就是它下一個時間點的輸入。
RNN網路模型的展開結構

後向傳播時間

RNN的訓練演算法有諸如實時迴圈學習(Real Time Recurrent Learning,RTRL)和後向傳播時間(BackPropagation Through Time,BPTT)等。因BPTT更加高效,因此常被使用。
為了更新迴圈網路中的引數的數值,我們需要反向計算網路中從輸入層一直到輸出層的引數隨時間的導數。就像普通的後向傳播演算法一樣,BPTT也是一直使用鏈式法則。但在迴圈網路中,損失函式依賴於當前時刻的輸出,也依賴於下一時刻的輸出。
在迴圈網路中更新值是互相關的。這一特性對隨機梯度下降演算法十分不利,因為隨機梯度下降演算法更加傾向於無關聯的引數更新來保證訓練的穩定性,而相關聯的更新使訓練過程變得不穩定。這種不穩定指的是梯度以指數形式增長到無窮大(梯度爆炸),或梯度迅速減小為0(梯度消失)。無論上述哪種結果都會導致最後無法完成訓練。

梯度爆炸與梯度消失

上文提到的梯度爆炸與消失這兩個問題都會造成我們的網路模型無法完成訓練,對於梯度爆炸與消失問題有相應地解決方法。
首先是梯度爆炸,解決梯度爆炸的方法有很多種。我們可以重新設計網路模型;使用ReLU作為啟用函式;使用權重正則化;使用梯度裁剪。其中,梯度裁剪是最簡單、最常用的方法。梯度裁剪具體在梯度的模增長地過大的時候減少學習的步長。
而解決梯度消失的問題則會更麻煩一些。梯度消失的後果是迴圈網路模型僅僅會記住近期的事件,而忘記過去較遠的時間發生的事件,從而造成迴圈網路在幾個時刻之後便失去作用。
為了解決梯度消失的問題,我們需要藉助長短期記憶(Long Short-Term Memory)網路。

長短期記憶 LSTM

一個迴圈網路的定義上由很多個神經元構成,每個神經元包括一個基於過去的輸入、一個新的輸入、一個輸出和一個連線到未來的輸入(相對於下一時刻的輸入)。
一個RNN網路的部分
此時中間的神經元是典型的神經元,其擁有一些權重、一些線性啟用函式等。LSTM單元的功能和普通的神經元的功能一樣,如果我們使用LSTM單元來替換這個典型神經元則不需要修改網路中的其他內容。使用LSTM網路可以有效地解決梯度消失的問題。
那麼先不談RNN網路,讓我們來了解記憶系統是如何工作的。一個具有記憶功能的系統應該具有如下三種功能:將資料寫入記憶中、從記憶中讀取資料和刪除記憶中的資料。而記憶系統的核心則是一個記憶單元。通過在記憶單元上新增輸入門(Input Gate)、輸出門(Output Gate)與遺忘門(Forge Gate)則組成了一個LSTM單元。
LSTM單元
首先是輸入門,輸入門的功能是判斷這個輸入是否要被寫入“記憶”當中。
然後是輸出門,輸出門決定是否從記憶中讀取相關內容。
最後是遺忘門,遺忘門可以判斷是否從記憶中刪除這個資料。
在一個LSTM核心中,如果一個門的值是0,則這個門關閉;若一個門的值是1,則這個門開啟。在每個指令門處,控制門開關的值並不是非0即1的,而是介於0和1之間的連續決策。也就是說當這個數處在0和1之間時,部分的資料會被儲存到記憶中。
既然控制LSTM核心的門的數值是一個連續函式,那麼我們便可以對這個函式求導。既然可以求導,那麼使用後向傳播演算法也變順理成章了。
LSTM結構
LSTM中控制每個門的值是由一個基於輸入引數的邏輯迴歸控制。每個值都有一套共享引數,在門與輸入值之間嵌入一個反曲函式tanh來將值對映到-1到1之間。由於這些函式是連續可導的,因此優化這些函式也很方便。LSTM可以使得模型對需要的資料記憶地更久,對需要忘記的記憶立刻忘記,此外,LSTM也使得對模型的優化過程更加簡單,從而解決了梯度消失的問題。

結語

RNN是一種通用的、易於訓練的模型。RNN模型可以將可變長度的序列輸入轉換為固定長度的向量,Beam搜尋、序列生成也可以將固定長度的向量轉換為序列。
從一個向量開始,從預測結果中取樣,然後再次輸入到RNN模型中進行預測。這樣就可以將一個任意長度的序列,轉換成另一個任意長度的序列。這就是機器翻譯的基礎。
同樣,我們可以將CNN和RNN結合起來。輸入一個影象,通過CNN對影象進行檢測,通過RNN對影象內容進行預測。於是,我可以得到一個自動為影象新增標題的機器學習程式。