RNN¶
- class torch.nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity='tanh', bias=True, batch_first=False, dropout=0.0, bidirectional=False, device=None, dtype=None)[source][source]¶
對輸入序列應用一個多層 Elman RNN,並使用 或 非線性函數。對於輸入序列中的每個元素,每一層都會計算以下函數:
其中 是時間點 t 的隱藏狀態 (hidden state), 是時間點 t 的輸入,而 是時間點 t-1 時前一層的隱藏狀態,或是時間點 0 的初始隱藏狀態。如果
nonlinearity
是'relu'
,那麼會使用 來取代 。# Efficient implementation equivalent to the following with bidirectional=False def forward(x, hx=None): if batch_first: x = x.transpose(0, 1) seq_len, batch_size, _ = x.size() if hx is None: hx = torch.zeros(num_layers, batch_size, hidden_size) h_t_minus_1 = hx h_t = hx output = [] for t in range(seq_len): for layer in range(num_layers): h_t[layer] = torch.tanh( x[t] @ weight_ih[layer].T + bias_ih[layer] + h_t_minus_1[layer] @ weight_hh[layer].T + bias_hh[layer] ) output.append(h_t[-1]) h_t_minus_1 = h_t output = torch.stack(output) if batch_first: output = output.transpose(0, 1) return output, h_t
- 參數 (Parameters)
input_size – 輸入 x 預期的特徵數量
hidden_size – 隱藏狀態 h 中的特徵數量
num_layers – 遞迴層 (recurrent layers) 的數量。例如,設定
num_layers=2
表示堆疊兩個 RNN 以形成一個 堆疊 RNN (stacked RNN),第二個 RNN 接收第一個 RNN 的輸出並計算最終結果。預設值:1nonlinearity – 要使用的非線性函數 (non-linearity)。可以是
'tanh'
或'relu'
。預設值:'tanh'
bias – 如果
False
,則該層不使用偏差權重 (bias weights) b_ih 和 b_hh。預設值:True
batch_first – 如果
True
,則輸入和輸出張量將以 (batch, seq, feature) 而不是 (seq, batch, feature) 的形式提供。 請注意,這不適用於隱藏或單元狀態 (cell states)。 有關詳細信息,請參閱下面的「輸入/輸出」部分。預設值:False
dropout – 如果非零,則在每個 RNN 層 (除了最後一層) 的輸出上引入一個 Dropout 層,dropout 機率等於
dropout
。預設值:0bidirectional – 如果
True
,則成為雙向 RNN。預設值:False
- 輸入 (Inputs): input, hx
input:形狀為 的 tensor,用於非批次輸入 (unbatched input);當
batch_first=False
時,形狀為 ,或者當batch_first=True
時,形狀為 ,包含輸入序列的特徵。輸入也可以是 packed variable length sequence。詳情請參閱torch.nn.utils.rnn.pack_padded_sequence()
或torch.nn.utils.rnn.pack_sequence()
。hx:形狀為 的 tensor,用於非批次輸入;或者形狀為 的 tensor,包含輸入序列批次的初始隱藏狀態。如果未提供,則預設為零。
其中:
- 輸出:output, h_n
output: 形狀為 的張量,適用於未分批的輸入, 當
batch_first=False
或 當batch_first=True
,包含RNN最後一層的輸出特徵 (h_t),針對每個 t。如果給定一個torch.nn.utils.rnn.PackedSequence
作為輸入,則輸出也將是一個 packed sequence。h_n:形狀為 的張量,用於未批次輸入,或是形狀為 的張量,用於包含批次中每個元素的最終隱藏狀態。
- 變數
weight_ih_l[k]:第 k 層的可學習輸入到隱藏層的權重,當 k = 0 時形狀為 (hidden_size, input_size)。否則,形狀為 (hidden_size, num_directions * hidden_size)。
weight_hh_l[k]:第 k 層的可學習隱藏層到隱藏層的權重,形狀為 (hidden_size, hidden_size)。
bias_ih_l[k]:第 k 層的可學習輸入到隱藏層的偏置,形狀為 (hidden_size)。
bias_hh_l[k]:第 k 層的可學習隱藏層到隱藏層的偏置,形狀為 (hidden_size)。
注意
所有的權重和偏置都初始化自 ,其中 。
注意
對於雙向 RNN,前向和後向分別是方向 0 和 1。當
batch_first=False
時,分割輸出層的範例:output.view(seq_len, batch, num_directions, hidden_size)
。注意
對於未批次輸入,會忽略
batch_first
參數。警告
在某些版本的 cuDNN 和 CUDA 上,RNN 函數存在已知的不確定性問題。您可以透過設定以下環境變數來強制執行確定性行為
在 CUDA 10.1 上,設定環境變數
CUDA_LAUNCH_BLOCKING=1
。這可能會影響效能。在 CUDA 10.2 或更新版本上,設定環境變數(注意開頭的冒號符號)
CUBLAS_WORKSPACE_CONFIG=:16:8
或CUBLAS_WORKSPACE_CONFIG=:4096:2
。請參閱 cuDNN 8 發布說明 以取得更多資訊。
注意
如果滿足以下條件:1) 啟用 cudnn,2) 輸入資料位於 GPU 上,3) 輸入資料的 dtype 為
torch.float16
4) 使用 V100 GPU,5) 輸入資料不是PackedSequence
格式,則可以選擇持續性演算法來提高效能。範例
>>> rnn = nn.RNN(10, 20, 2) >>> input = torch.randn(5, 3, 10) >>> h0 = torch.randn(2, 3, 20) >>> output, hn = rnn(input, h0)