[Quant 1.6] 從數(shù)理的角度理解一下RNN (1)
我先放資源
第一個是MIT的一本深度學習教材的RNN章節(jié),作者是Ian Goodfellow & Yoshua Bengio &?Aaron Courville
https://www.deeplearningbook.org/contents/rnn.html#pf7
第二個是吳恩達 (Andrew Ng)博士的網(wǎng)課

吳博士的網(wǎng)課主要從NLP的角度出發(fā)介紹RNN,里面有幫助的理解的例子。但是它的notation我看不太習慣。然后那本教材我感覺是給更厲害的quant或者數(shù)據(jù)科學/AI專業(yè)的學生讀的,細節(jié)非常之多,我個人啃起來感覺吃力。這篇想把零零散散的知識點總結(jié)一下。(以下內(nèi)容可能有很多理解錯誤的地方,后續(xù)我發(fā)現(xiàn)問題的話會編輯。然后我會有很多中英文穿插著,畢竟面試可能會被問到,我也借這個專欄強化一下記憶。)

1. RNN相比于DNN
神經(jīng)網(wǎng)絡(luò)的三個基本元素是模型、損失函數(shù)和優(yōu)化器。在[Quant 1.3] 里面,我們介紹了DNN的基本原理。DNN是由輸入層、多個隱藏的全連接層和輸出層構(gòu)成。每個隱藏的全連接層都搭配一個激活函數(shù) (sigmoid, relu, hypobolic tangent)。
訓練一個DNN是要先初始化一個神經(jīng)網(wǎng)絡(luò)出來,這里面有隨機的參數(shù)。然后我們分批將訓練集中的tensor輸入到神經(jīng)網(wǎng)絡(luò)中(forward函數(shù)),利用輸出和標簽值計算損失,優(yōu)化器再進行backward propogation逐步更新參數(shù)減小損失。多次迭代之后我們就得到了自己的DNN模型。

DNN可以很好的學習靜態(tài)的cross-sectional數(shù)據(jù)。就像我們在邏輯回歸[Quant 1.2]中舉的例子:給定一個人的身高,體重,臂展,臥推重量等作為輸入,訓練一個DNN來判斷這個人的性別。但是它在學習panel data表格數(shù)據(jù)的時候會出現(xiàn)一些明顯的不足。在判斷一個人的性別時,我們的樣本中的人是沒有順序的,但是如果我們想要用每一天的因子來預測第二天的股票價格漲跌,樣本中的因子則是有時間順序的。換句話說,人和人之間的關(guān)聯(lián),只要是隨機抽樣,一個人的身高,體重,臂展,臥推重量等指標不應該影響到對另一個人的性別的預測。但是,每一天的因子可能不只會影響到第二天股價的漲跌,或許還會影響第三天、第四天或者更長。但是在利用DNN預測股票漲跌時,我們卻只用了目標預測日前一天的因子。
為了考慮到每一日的指標對股票價格變動的更長遠的影響,我們也對DNN進行了一些改良,例如在輸入中加入很多滯后因子,像是昨日的開盤價,前日的收盤價等等。但是這樣就非常的主觀。在選擇滯后的因子時,到底應該選擇滯后多少天以內(nèi)的?如果我們滯后的天數(shù)不夠多,神經(jīng)網(wǎng)絡(luò)學習到的因果關(guān)系可能就沒那么明顯;而如果選擇的天數(shù)太多,則會加重DNN的計算量。
因此,與其自行篩選這些滯后的因子,不如讓神經(jīng)網(wǎng)絡(luò)自己來決定如何取舍由近到遠的歷史數(shù)據(jù)來優(yōu)化預測結(jié)果。這就是RNN相對于DNN的優(yōu)勢。概括來講,在處理有序輸入的時候,RNN能夠通過訓練來篩選并利用所有已輸入的有序信息來做出預測。

2. 什么時候我們能用上RNN?
當我們的自變量是有順序的,且順序靠前的自變量或因變量會影響順序靠后的因變量時??梢岳斫鉃閟erially correlated。

3. Vanilla RNN的基本結(jié)構(gòu)
我們剛說過了,RNN可以通過訓練來篩選并利用已經(jīng)輸入到神經(jīng)網(wǎng)絡(luò)內(nèi)的歷史信息來做出預測。那么這個歷史信息在神經(jīng)網(wǎng)絡(luò)內(nèi)是如何體現(xiàn)的呢?我們使用狀態(tài)變量state 來儲存歷史信息。
RNN的結(jié)構(gòu)可以用兩種圖來表示,一種叫circuit diagram,另一種叫time-unfolded computational graph。Vanilla RNN (以下簡稱RNN)是所有RNN中最簡單的一類,它沒有門結(jié)構(gòu)。
接下來我想介紹三種常見的RNN結(jié)構(gòu):

下面一種是最典型也是最基礎(chǔ)的RNN結(jié)構(gòu):

左邊是circuit diagram,右邊是unfolded computational graph。unfolded computational graph相對好理解一些,左邊circuit diagram黑色的方框表示:當運算通過方框所在的箭頭時,時間+1。也就是說通過W矩陣的線性變換之后,變成了
。兩張圖對應相同的RNN表達式
這種RNN屬于many-to-many,它的一個例子是:是一支股票在第t個時間段內(nèi)產(chǎn)生的新聞(單位時間內(nèi)的輿情指數(shù)),
是這支股票在第t個時間段的下一個時間段內(nèi)價格是上漲還是下跌,而
是t時刻對
的預測值。注意這里
是
?measurable。
那么和DNN類似的,這個神經(jīng)網(wǎng)絡(luò)的訓練過程就是:先初始化參數(shù),然后輸入
,用上面的一串表達式,我們可以依次計算出
。假如我們用的optimizer是SGD,那么我們需要計算
對
的梯度,再結(jié)合我們設(shè)定的學習率來更新這些參數(shù)。這樣,第一個循環(huán)就完成了。
第二個循環(huán)和第一個循環(huán)相似,只不過被求梯度的loss變成了前兩次迭代的loss之和。....

下面是第二種RNN結(jié)構(gòu):

教材中只給了unfolded computational graph。這張圖對應的RNN表達式是:
其實和第一種RNN結(jié)構(gòu)非常相似了。只不過沒有在每一個time step輸出,而只在最后一個timestep輸出。所以我們稱它為many-to-one的RNN。
這種RNN的一個例子是,我們逐個輸入一句話中的每個字/單詞,輸出這句話對應的情緒評分。如果大家使用過Grammarly的話,會發(fā)現(xiàn)它會分析你輸入的句子的情緒,可能是開心、憤怒、悲傷、猶豫之類的。從quant的角度,我們可以用這種RNN模型來快速獲得market sentiment,對名人的推特或者新聞事件分析來預判資產(chǎn)價格長短期的走向。
參數(shù)代入的方式和第一種many-to-many的RNN非常相似,除了只有在最后的time step 才有輸出。


第三種RNN。它訓練時的表達式是
和前面兩種神經(jīng)網(wǎng)絡(luò)最明顯不同的地方是,這種神經(jīng)網(wǎng)絡(luò)的輸入不隨時間的改變而改變。其次,標簽
除了用于和預測值一起計算loss以外,還會用于隱藏變量
的計算。光看這個RNN可能會沒什么概念,我們只要用一個例子說明這個RNN的作用就可以理解了。
我們現(xiàn)在想做的事情是描述一張圖片的內(nèi)容,那么我們訓練集的構(gòu)成就是成千上萬張圖片和他們對應的內(nèi)容語句。在訓練模型的時候,我們在每一個step都將圖片作為RNN的輸入,除此之外,標簽值
既作為上一個step的預測目標,也要作為當前step的輸入之一。假如我們現(xiàn)在有一張??的圖片,它對應的標簽是“一個蘋果”。訓練時在隨機初始化好各個參數(shù)之后,在第一個迭代內(nèi),我們輸入??圖片
,初始化好的state?
,而對于
我們需要輸入的是標簽中的第一個字“一”。而在這次迭代內(nèi),我們的預測值是
,而它的訓練目標是
,也就是第二個字“個”。同時,
“個”也作為第二次迭代的輸入。以此類推。
所以大家可以理解,之所以訓練時的標簽值既作為上一步的訓練目標也作為當前步的輸入,是因為我們想讓預測時候產(chǎn)出的句子是一個通順的句子。在模型訓練好之后,我們將另一個蘋果圖片輸入進入,這個時候輸出的內(nèi)容會和初始化的參數(shù)有關(guān)系。因此每一次輸入這個新的蘋果圖片是得到的結(jié)果不一定是完全一樣的。但是我們會希望結(jié)果是"蘋果"或者"一個蘋果",而不是“蘋一個果”這種話。所以這種
和
的聯(lián)系在這類RNN的應用中是有必要的。
在我們用訓練好的模型預測時,測試集的圖片都是沒有標簽的,所以我們要用上一步的預測結(jié)果來代替標簽,作為這一步的輸入。因此測試的時候,表達式就稍微改動的變成了
