Spec-Zone.ru › PyTorch 2.14

LSTM

class torch.nn.modules.rnn.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 получает выходы первой 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=размер пакетаL=длина последовательностиD=2 если bidirectional=True, иначе 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) тип данных входа — 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.modules.rnn.LSTM.html

Spec-Zone.ru

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