Spec-Zone.ru › PyTorch 2

LSTM

class torch.nn.LSTM(self, input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, proj_size=0, device=None, dtype=None) [source]

Применяет многослойный рекуррентный нейронный модуль 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 предыдущего слоя, умноженного на значение дропаута δ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.

END_OF_DOCUMENT_MARKER
Параметры
  • 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. По умолчанию: 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=размер_входаHcell=размер_скрытого_состоянияHout=размер_проекции, если размер_проекции>0, иначе размер_скрытого_состояния\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. Можно обеспечить детерминированное поведение, установив следующие переменные окружения:

На CUDA 10.1 установите переменную окружения CUDA_LAUNCH_BLOCKING=1. Это может повлиять на производительность.

На CUDA 10.2 или более поздней версии установите переменную окружения (обратите внимание на ведущий символ двоеточия) CUBLAS_WORKSPACE_CONFIG=:16:8 или CUBLAS_WORKSPACE_CONFIG=:4096:2.

См. cuDNN 8 Release Notes для получения дополнительной информации.

Примечание

Если соблюдены следующие условия: 1) cuDNN включен, 2) входные данные находятся на графическом процессоре, 3) тип входных данных torch.float16, 4) используется графический процессор 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))

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

Spec-Zone.ru

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