目前為止,只討論了具有一個單向隱藏層的循環神經網絡,其中隱變量和觀測值域具體的函數形式的交互方式是相當隨意的。只要交互類型建模具有足夠的靈活性,不是一個單問題。然而,對一個單層來說,可能具有相當的挑戰性。之前的線性模型中,我們通過添加更多的層來解決這個問題,而在循環神經網絡中,我們首先需要確定如何添加更多的層,以及在哪里添加額外的非線性層。
事實上,我們可以將多層循環神經網絡堆疊在一起,通過對幾個簡單層的組合,產生一種靈活的機制,特別是,數據可能與不同層的堆疊有關,例如,我們可能希望保持有關金融市場狀況的宏觀數據可用,而微觀數據只記錄較為短期的時間動態。
圖9-8展示了一個具有L個隱藏層的深度循環神經網絡,每個隱狀態都連續的傳遞當前層的下一個時間步和下一層的當前時間步。
9.3.1 函數依賴關系
我們可以將深度架構中的函數依賴關系形勢化,這個架構由圖9-8中展示的L個隱藏層構成,后續的討論主要集中在經典的循環神經網絡模型上,但是這些討論也適應于其他序列模型
假設在時間步t又一個小批量輸入數據Xt屬于Rnxd,同時,將第l個隱藏層,輸出層變量設為Ot屬于Rnxq, 設置Ht = Xt,第l個隱藏層的隱狀態使用激活函數Sigmal,則。
Ht = Sigma (Ht Wxh + Ht-1Whh + Bh)
權重Wxh屬于Rhxh,Whh屬于Rhh和偏置Bh屬于Rlxh 都是第l個隱藏層的模型參數
Ot = HtWhq + Bq
其中,權重Whq屬于Rhxq和偏置Bq屬于Rlxq都是輸出層的模型參數
與多層感知機一樣,隱藏層數L和隱藏單元數h都是超參數,也就是說,他們可以由我們調整,用門控循環單元或者長短期記憶網絡的隱狀態來代替9.8中的隱狀態進行計算,可以很容易的得到深度門控循環神經網絡或者深度長短期記憶神經網絡。
9.3.2 簡潔實現
實現多層循環神經網絡所需的許多邏輯細節在高級API中都是現成的,為簡單起見,我們僅僅示范使用此類內置函數的實現方式,長短期記憶網絡模型為例,其實現代碼與之前在9.2節中使用的代碼非常相似,實際上唯一的區別是我們指定了層的數量,而不是使用單一層這個默認值,像之前一樣,我們從加載數據集開始。
import torch
from torch import nn
from d2l import torch as d2l
batch_size, num_steps = 32,35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
這樣超參數類型架構決策也與9.2節中的決策非常相似,因為我們有不同的詞元,所以輸入和輸出都選擇相同的數量,即vocab_size,隱單元的數量仍然為256, 唯一的區別是,我們現在通過num_layers 的值來設定隱藏層數。
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
num_inputs = vocab_size
device = d2l.try_gpu()
lstm = nn.LSTM(num_inputs, num_hiddens, num_layers)
model = d2l.RNNModel(lstm_layer, len(vocab))
model=model.to(device)
9.3.3 訓練與預測
使用了長短期記憶網絡模型來實例化兩個層,因此訓練速度大大降低了。
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
小結:
在深度循環神經網絡中,隱狀態的信息被傳遞到當前層的下一個時間步和下一層的當前時間步
有許多不同風格深度循環神經網絡,如長短期記憶網絡,門控循環單元或常規循環神經網絡,這些模型在深度學習框架的高級API中都有涵蓋
總體而言,深度循環神經網絡需要大量的調參,來確保合適的收斂,模型的初始化也需要謹慎