Spec-Zone.ru › PyTorch 2.14

LSTM

class torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, proj_size=0, device=None, dtype=None) [исходный код]

Применяет многослойную рекуррентную нейронную сеть с долгой краткосрочной памятью (LSTM) к входной последовательности. Для каждого элемента входной последовательности каждый слой вычисляет следующую функцию:

it=σ(Wiixt+bii+Whiht−1+bhi)ft=σ(Wifxt+bif+Whfht−1+bhf)gt=tanh⁡(Wigxt+big+Whght−1+bhg)ot=σ(Wioxt+bio+Whoht−1+bho)ct=ft⊙ct−1+it⊙gtht=ot⊙tanh⁡(ct)\begin{array}{ll} \\ i_t = \sigma(W_{ii} x_t + b_{ii} + W_{hi} h_{t-1} + b_{hi}) \\ f_t = \sigma(W_{if} x_t + b_{if} + W_{hf} h_{t-1} + b_{hf}) \\ g_t = \tanh(W_{ig} x_t + b_{ig} + W_{hg} h_{t-1} + b_{hg}) \\ o_t = \sigma(W_{io} x_t + b_{io} + W_{ho} h_{t-1} + b_{ho}) \\ c_t = f_t \odot c_{t-1} + i_t \odot g_t \\ h_t = o_t \odot \tanh(c_t) \\ \end{array}

где hth_t — скрытое состояние в момент времени t, ctc_t — состояние ячейки в момент времени t, xtx_t — вход в момент времени t, ht−1h_{t-1} — скрытое состояние слоя в момент времени t-1 или начальное скрытое состояние в момент времени 0, а iti_t, ftf_t, gtg_t, oto_t — это соответственно входной, забывающий, клеточный и выходной вентили. σ\sigma — сигмоидальная функция, а ⊙\odot — произведение Адамара.

В многослойной LSTM вход xt(l)x^{(l)}_t для ll-го слоя (l≥2l \ge 2) представляет собой скрытое состояние ht(l−1)h^{(l-1)}_t предыдущего слоя, умноженное на dropout-маску δt(l−1)\delta^{(l-1)}_t, где каждая δt(l−1)\delta^{(l-1)}_t является случайной величиной Бернулли, равной 00 с вероятностью dropout.

Если задан proj_size > 0, используется LSTM с проекциями. Это изменяет ячейку LSTM следующим образом. Во-первых, размерность hth_t изменяется с hidden_size на proj_size (размерности WhiW_{hi} также будут соответственно изменены). Во-вторых, выходное скрытое состояние каждого слоя умножается на обучаемую матрицу проекции: ht=Whrhth_t = W_{hr}h_t. Обратите внимание: вследствие этого выход LSTM-сети также будет иметь другую форму. Точные размеры всех переменных см. в разделах «Входы» и «Выходы» ниже. Подробнее см. https://arxiv.org/abs/1402.1128.

Параметры:
  • input_size – Число ожидаемых признаков во входных данных x
  • hidden_size – Число признаков в скрытом состоянии h
  • num_layers – Число рекуррентных слоев. Например, значение num_layers=2 означает объединение двух LSTM в stacked LSTM, где вторая LSTM получает выходы первой и вычисляет окончательные результаты. По умолчанию: 1
  • bias – Если задано False, слой не использует веса смещения b_ih и b_hh. По умолчанию: True
  • batch_first – Если задано True, входные и выходные тензоры передаются в формате (batch, seq, feature) вместо (seq, batch, feature). Обратите внимание, что это не относится к скрытым состояниям или состояниям ячейки. Подробности см. в разделах «Входы» и «Выходы» ниже. По умолчанию: False
  • dropout – Если значение отлично от нуля, добавляет слой Dropout к выходам каждого слоя LSTM, кроме последнего, с вероятностью dropout, равной dropout. По умолчанию: 0
  • bidirectional – Если задано True, используется двунаправленная LSTM. По умолчанию: False
  • proj_size – Если значение отлично от > 0, используется LSTM с проекциями указанного размера. По умолчанию: 0
Входы: input, (h_0, c_0)
  • input: тензор формы (L,Hin)(L, H_{in}) для входа без пакета, (L,N,Hin)(L, N, H_{in}) при batch_first=False или (N,L,Hin)(N, L, H_{in}) при batch_first=True; тензор содержит признаки входной последовательности. Входом также может быть упакованная последовательность переменной длины. Подробности см. в описании torch.nn.utils.rnn.pack_padded_sequence() или torch.nn.utils.rnn.pack_sequence().
  • h_0: тензор формы (D∗num_layers,Hout)(D * \text{num\_layers}, H_{out}) для входа без пакета или (D∗num_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}); содержит начальное скрытое состояние для каждого элемента входной последовательности. Если (h_0, c_0) не указаны, по умолчанию используются нули.
  • c_0: тензор формы (D∗num_layers,Hcell)(D * \text{num\_layers}, H_{cell}) для входа без пакета или (D∗num_layers,N,Hcell)(D * \text{num\_layers}, N, H_{cell}); содержит начальное состояние ячейки для каждого элемента входной последовательности. Если (h_0, c_0) не указаны, по умолчанию используются нули.

где:

N=batch sizeL=sequence lengthD=2 if bidirectional=True otherwise 1Hin=input_sizeHcell=hidden_sizeHout=proj_size if proj_size>0 otherwise 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_{cell} ={} & \text{hidden\_size} \\ H_{out} ={} & \text{proj\_size if } \text{proj\_size}>0 \text{ otherwise hidden\_size} \\ \end{aligned}
Выходы: output, (h_n, c_n)
  • output: тензор формы (L,D∗Hout)(L, D * H_{out}) для входа без пакета, (L,N,D∗Hout)(L, N, D * H_{out}) при batch_first=False или (N,L,D∗Hout)(N, L, D * H_{out}) при batch_first=True; содержит выходные признаки (h_t) последнего слоя LSTM для каждого t. Если на вход подана torch.nn.utils.rnn.PackedSequence, выход также будет упакованной последовательностью. При bidirectional=True, output будет содержать конкатенацию прямого и обратного скрытых состояний на каждом шаге последовательности.
  • h_n: тензор формы (D∗num_layers,Hout)(D * \text{num\_layers}, H_{out}) для входа без пакета или (D∗num_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}); содержит последнее скрытое состояние для каждого элемента последовательности. При bidirectional=True, h_n будет содержать конкатенацию последних прямого и обратного скрытых состояний соответственно.
  • c_n: тензор формы (D∗num_layers,Hcell)(D * \text{num\_layers}, H_{cell}) для входа без пакета или (D∗num_layers,N,Hcell)(D * \text{num\_layers}, N, H_{cell}); содержит последнее состояние ячейки для каждого элемента последовательности. При bidirectional=True, c_n будет содержать конкатенацию последних прямого и обратного состояний ячейки соответственно.
Переменные:
  • weight_ih_l[k] – обучаемые веса связи «вход—скрытое состояние» для слоя kth\text{k}^{th} (W_ii|W_if|W_ig|W_io), размером (4*hidden_size, input_size) для k = 0. В противном случае размер равен (4*hidden_size, num_directions * hidden_size). Если задано proj_size > 0, размер будет (4*hidden_size, num_directions * proj_size) для k > 0
  • weight_hh_l[k] – обучаемые веса связи «скрытое состояние—скрытое состояние» для слоя kth\text{k}^{th} (W_hi|W_hf|W_hg|W_ho), размером (4*hidden_size, hidden_size). Если задано proj_size > 0, размер будет (4*hidden_size, proj_size).
  • bias_ih_l[k] – обучаемое смещение связи «вход—скрытое состояние» для слоя kth\text{k}^{th} (b_ii|b_if|b_ig|b_io), размером (4*hidden_size)
  • bias_hh_l[k] – обучаемое смещение связи «скрытое состояние—скрытое состояние» для слоя kth\text{k}^{th} (b_hi|b_hf|b_hg|b_ho), размером (4*hidden_size)
  • weight_hr_l[k] – обучаемые веса проекции слоя kth\text{k}^{th}, размером (proj_size, hidden_size). Присутствуют только при заданном proj_size > 0.
  • weight_ih_l[k]_reverse – аналог weight_ih_l[k] для обратного направления. Присутствует только при bidirectional=True.
  • weight_hh_l[k]_reverse – аналог weight_hh_l[k] для обратного направления. Присутствует только при bidirectional=True.
  • bias_ih_l[k]_reverse – аналог bias_ih_l[k] для обратного направления. Присутствует только при bidirectional=True.
  • bias_hh_l[k]_reverse – аналог bias_hh_l[k] для обратного направления. Присутствует только при bidirectional=True.
  • weight_hr_l[k]_reverse – аналог weight_hr_l[k] для обратного направления. Присутствует только при заданных bidirectional=True и proj_size > 0.

Примечание

Все веса и смещения инициализируются из распределения U(−k,k)\mathcal{U}(-\sqrt{k}, \sqrt{k}), где k=1hidden_sizek = \frac{1}{\text{hidden\_size}}

Примечание

Для двунаправленных LSTM прямое и обратное направления обозначаются соответственно 0 и 1. Пример разделения выходных слоев при batch_first=False: output.view(seq_len, batch, num_directions, hidden_size).

Примечание

Для двунаправленных LSTM значение h_n не эквивалентно последнему элементу output: первое содержит последние прямое и обратное скрытые состояния, а последнее — последнее прямое и начальное обратное скрытые состояния.

Примечание

Аргумент batch_first игнорируется для входов без пакета.

Примечание

Значение proj_size должно быть меньше hidden_size.

Предупреждение

Для функций RNN в некоторых версиях cuDNN и CUDA известны проблемы с недетерминированностью. Детерминированное поведение можно обеспечить, задав следующие переменные среды:

Задайте переменную среды (обратите внимание на двоеточие в начале) CUBLAS_WORKSPACE_CONFIG=:16:8 или CUBLAS_WORKSPACE_CONFIG=:4096:2

Подробнее см. примечания к выпуску cuDNN 8.

Примечание

Если выполняются следующие условия: 1) включен cudnn, 2) входные данные находятся на GPU, 3) входные данные имеют dtype torch.float16, 4) используется GPU V100, 5) входные данные не представлены в формате PackedSequence, для повышения производительности может быть выбран персистентный алгоритм.

Примеры:

>>> rnn = nn.LSTM(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> c0 = torch.randn(2, 3, 20)
>>> output, (hn, cn) = rnn(input, (h0, c0))

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.nn.LSTM.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API