捷徑

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,並使用 tanh\tanhReLU\text{ReLU} 非線性函數。對於輸入序列中的每個元素,每一層都會計算以下函數:

ht=tanh(xtWihT+bih+ht1WhhT+bhh)h_t = \tanh(x_t W_{ih}^T + b_{ih} + h_{t-1}W_{hh}^T + b_{hh})

其中 hth_t 是時間點 t 的隱藏狀態 (hidden state),xtx_t 是時間點 t 的輸入,而 h(t1)h_{(t-1)} 是時間點 t-1 時前一層的隱藏狀態,或是時間點 0 的初始隱藏狀態。如果 nonlinearity'relu',那麼會使用 ReLU\text{ReLU} 來取代 tanh\tanh

# 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 的輸出並計算最終結果。預設值:1

  • nonlinearity – 要使用的非線性函數 (non-linearity)。可以是 'tanh''relu'。預設值:'tanh'

  • bias – 如果 False,則該層不使用偏差權重 (bias weights) b_ihb_hh。預設值:True

  • batch_first – 如果 True,則輸入和輸出張量將以 (batch, seq, feature) 而不是 (seq, batch, feature) 的形式提供。 請注意,這不適用於隱藏或單元狀態 (cell states)。 有關詳細信息,請參閱下面的「輸入/輸出」部分。預設值:False

  • dropout – 如果非零,則在每個 RNN 層 (除了最後一層) 的輸出上引入一個 Dropout 層,dropout 機率等於 dropout。預設值:0

  • bidirectional – 如果 True,則成為雙向 RNN。預設值:False

輸入 (Inputs): input, hx
  • input:形狀為 (L,Hin)(L, H_{in}) 的 tensor,用於非批次輸入 (unbatched input);當 batch_first=False 時,形狀為 (L,N,Hin)(L, N, H_{in}),或者當 batch_first=True 時,形狀為 (N,L,Hin)(N, L, H_{in}),包含輸入序列的特徵。輸入也可以是 packed variable length sequence。詳情請參閱 torch.nn.utils.rnn.pack_padded_sequence()torch.nn.utils.rnn.pack_sequence()

  • hx:形狀為 (Dnum_layers,Hout)(D * \text{num\_layers}, H_{out}) 的 tensor,用於非批次輸入;或者形狀為 (Dnum_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}) 的 tensor,包含輸入序列批次的初始隱藏狀態。如果未提供,則預設為零。

其中:

N=batch sizeL=sequence lengthD=2 if bidirectional=True otherwise 1Hin=input_sizeHout=hidden_size\begin{aligned} N ={} & \text{batch size} \\ L ={} & \text{sequence length} \\ D ={} & 2 \text{ if bidirectional=True otherwise } 1 \\ H_{in} ={} & \text{input\_size} \\ H_{out} ={} & \text{hidden\_size} \end{aligned}
輸出:output, h_n
  • output: 形狀為 (L,DHout)(L, D * H_{out}) 的張量,適用於未分批的輸入, (L,N,DHout)(L, N, D * H_{out})batch_first=False(N,L,DHout)(N, L, D * H_{out})batch_first=True,包含RNN最後一層的輸出特徵 (h_t),針對每個 t。如果給定一個 torch.nn.utils.rnn.PackedSequence 作為輸入,則輸出也將是一個 packed sequence。

  • h_n:形狀為 (Dnum_layers,Hout)(D * \text{num\_layers}, H_{out}) 的張量,用於未批次輸入,或是形狀為 (Dnum_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}) 的張量,用於包含批次中每個元素的最終隱藏狀態。

變數
  • 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)

注意

所有的權重和偏置都初始化自 U(k,k)\mathcal{U}(-\sqrt{k}, \sqrt{k}),其中 k=1hidden_sizek = \frac{1}{\text{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:8CUBLAS_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)

文件

取得 PyTorch 的全面開發者文件

檢視文件

教學

取得針對初學者和進階開發者的深入教學

檢視教學

資源

尋找開發資源並取得您問題的解答

檢視資源