Spec-Zone.ru › PyTorch 1

LSTM

class torch.nn.LSTM(*args, **kwargs) [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 >= 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.

Параметры:
  • 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
Входы: вход, (h_0, c_0)
  • вход: тензор формы (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}
Выходы: выход, (h_n, c_n)
  • выход: тензор формы (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 игнорируется для невложениных входных данных.

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

Известны проблемы с непредсказуемостью для функций 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/1.13/generated/torch.nn.LSTM.html

Spec-Zone.ru

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