將多層門控迴圈單元 (GRU) RNN 應用於輸入序列。對於輸入序列中的每個元素,每一層計算以下函式:
rt=σ(Wirxt+bir+Whrh(t−1)+bhr)zt=σ(Wizxt+biz+Whzh(t−1)+bhz)nt=tanh(Winxt+bin+rt⊙(Whnh(t−1)+bhn))ht=(1−zt)⊙nt+zt⊙h(t−1) 其中,ht 是時間 t 的隱藏狀態,xt 是時間 t 的輸入,h(t−1) 是層在時間 t-1 的隱藏狀態或時間 0 的初始隱藏狀態,而 rt,zt,nt 分別是重置門、更新門和新門。 σ 是 sigmoid 函式,⊙ 是 Hadamard 積。
在多層 GRU 中,第 l 層(l≥2)的輸入 xt(l) 是前一層的隱藏狀態 ht(l−1) 乘以 dropout δt(l−1) 其中每個 δt(l−1) 是一個 Bernoulli 隨機變數,其值為 0 的機率為 dropout。
- 引數
input_size – 輸入 x 中預期特徵的數量
hidden_size – 隱藏狀態 h 中的特徵數量
num_layers – 迴圈層數。例如,設定 num_layers=2 將意味著堆疊兩個 GRU 來形成一個 堆疊 GRU,第二個 GRU 接收第一個 GRU 的輸出並計算最終結果。預設值:1
bias – 如果為 False,則該層不使用偏置權重 b_ih 和 b_hh。預設值:True
batch_first – 如果為 True,則輸入和輸出張量以 (batch, seq, feature) 的形式提供,而不是 (seq, batch, feature)。請注意,這不適用於隱藏狀態或單元狀態。有關詳細資訊,請參閱下方的輸入/輸出部分。預設值:False
dropout – 如果非零,則在除最後一層外的每個 GRU 層的輸出上引入 Dropout 層,dropout 機率等於 dropout。預設值:0
bidirectional – 如果為 True,則成為雙向 GRU。預設值:False
- 輸入:input, h_0
input: tensor,形狀為 (L,Hin),表示未批處理的輸入;形狀為 (L,N,Hin),當 batch_first=False 時;或形狀為 (N,L,Hin),當 batch_first=True 時,包含輸入序列的特徵。輸入也可以是打包的可變長度序列。詳情請參閱 torch.nn.utils.rnn.pack_padded_sequence() 或 torch.nn.utils.rnn.pack_sequence()。
h_0: tensor,形狀為 (D∗num_layers,Hout) 或 (D∗num_layers,N,Hout),包含輸入序列的初始隱藏狀態。如果未提供,則預設為零。
其中
N=L=D=Hin=Hout=batch sizesequence length2 if bidirectional=True otherwise 1input_sizehidden_size
- 輸出:output, h_n
output: tensor,形狀為 (L,D∗Hout),表示未批處理的輸入;形狀為 (L,N,D∗Hout),當 batch_first=False 時;或形狀為 (N,L,D∗Hout),當 batch_first=True 時,包含 GRU 最後一層的輸出特徵 (h_t),對每個 t。如果輸入是 torch.nn.utils.rnn.PackedSequence,則輸出也將是打包序列。
h_n: tensor,形狀為 (D∗num_layers,Hout) 或 (D∗num_layers,N,Hout),包含輸入序列的最終隱藏狀態。
- 變數
weight_ih_l[k] – 第 kth 層(WirWizWin 的可學習輸入-隱藏權重,形狀為 (3*hidden_size, input_size),適用於 k = 0。否則,形狀為 (3*hidden_size, num_directions * hidden_size)。
weight_hh_l[k] – 第 kth 層(WhrWhzWhn 的可學習隱藏-隱藏權重,形狀為 (3*hidden_size, hidden_size)。
bias_ih_l[k] – 第 kth 層(birbizbin 的可學習輸入-隱藏偏置,形狀為 (3*hidden_size)。
bias_hh_l[k] – 第 kth 層(bhrbhzbhn 的可學習隱藏-隱藏偏置,形狀為 (3*hidden_size)。
注意
所有權重和偏置都從 U(−k,k) 初始化,其中 k=hidden_size1。
注意
對於雙向 GRU,前向和後向分別為方向 0 和 1。例如,當 batch_first=False 時,分割輸出層的方式為:output.view(seq_len, batch, num_directions, hidden_size)。
注意
對於未批處理的輸入,batch_first 引數被忽略。
注意
新門 nt 的計算方式與原始論文和其他框架略有不同。在原始實現中,Hadamard 積 (⊙) 運算是在與權重矩陣 W 相乘並加上偏置之前,對 rt 和前一個隱藏狀態 h(t−1) 之間進行的。
nt=tanh(Winxt+bin+Whn(rt⊙h(t−1))+bhn) 這與 PyTorch 實現不同,PyTorch 實現是在 Whnh(t−1)後完成的。
nt=tanh(Winxt+bin+rt⊙(Whnh(t−1)+bhn)) 為了效率,此實現方式特意有所不同。
注意
如果滿足以下條件:1) 啟用了 cudnn,2) 輸入資料在 GPU 上 3) 輸入資料的 dtype 為 torch.float16 4) 使用 V100 GPU,5) 輸入資料不是 PackedSequence 格式,則可以選擇持久化演算法來提高效能。
示例
>>> rnn = nn.GRU(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> output, hn = rnn(input, h0)