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 к последовательности входных данных.
Для каждого элемента во входной последовательности каждый слой вычисляет следующую функцию:
где — скрытое состояние в момент
t, — состояние ячейки в моментt, — входной сигнал в моментt, — скрытое состояние слоя в моментt-1или начальное скрытое состояние в момент0, а , , , — это входные, забывающие, ячейки и выходные шлюзы, соответственно. — это сигмоидальная функция, а — это произведение Адамара.В многослойном LSTM входной сигнал -го слоя () является скрытым состоянием предыдущего слоя, умноженного на значение дропаута , где каждое — это случайная величина Бернулли, которая равна с вероятностью
dropout.Если
proj_size > 0указано, будет использоваться LSTM с проекциями. Это изменяет ячейку LSTM следующим образом. Во-первых, размерность будет изменена сhidden_sizeнаproj_size(размерности будут изменены соответственно). Во-вторых, выходное скрытое состояние каждого слоя будет умножаться на обучаемую проекционную матрицу: . Обратите внимание, что в результате этого форма вывода сети 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
-
input_size – Количество ожидаемых признаков на входе
- Входные данные: input, (h_0, c_0)
-
-
input: тензор формы для не-пакетного ввода, , когда
batch_first=Falseили , когдаbatch_first=True, содержащий признаки входной последовательности. Вход может также представлять собой упакованную последовательность переменной длины. Смотритеtorch.nn.utils.rnn.pack_padded_sequence()илиtorch.nn.utils.rnn.pack_sequence()для подробностей. - h_0: тензор формы для не-пакетного ввода или содержащий начальное скрытое состояние для каждого элемента в последовательности. По умолчанию равен нулям, если (h_0, c_0) не предоставлены.
- c_0: тензор формы для не-пакетного ввода или содержащий начальное состояние ячейки для каждого элемента в последовательности. По умолчанию равен нулям, если (h_0, c_0) не предоставлены.
где:
-
input: тензор формы для не-пакетного ввода, , когда
- Выходные данные: output, (h_n, c_n)
-
-
output: тензор формы для не-пакетного ввода, когда
batch_first=Falseили когдаbatch_first=True, содержащий выходные признаки(h_t)с последнего слоя LSTM для каждойt. Если на вход поданаtorch.nn.utils.rnn.PackedSequence, выход также будет упакованной последовательностью. Когдаbidirectional=True,outputбудет содержать конкатенацию прямых и обратных скрытых состояний на каждом шаге времени в последовательности. -
h_n: тензор формы для не-пакетного ввода или содержащий конечное скрытое состояние для каждого элемента в последовательности. Когда
bidirectional=True,h_nбудет содержать конкатенацию конечных прямых и обратных скрытых состояний соответственно. -
c_n: тензор формы для не-пакетного ввода или содержащий конечное состояние ячейки для каждого элемента в последовательности. Когда
bidirectional=True,c_nбудет содержать конкатенацию конечных прямых и обратных состояний ячейки соответственно.
-
output: тензор формы для не-пакетного ввода, когда
- Переменные
-
-
weight_ih_l[k] – обучаемые веса вход-скрытый слоя слоя
(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] – обучаемые веса скрытый-скрытый слоя слоя
(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] – обучаемый смещение вход-скрытый слоя слоя
(b_ii|b_if|b_ig|b_io), формы(4*hidden_size) -
bias_hh_l[k] – обучаемый смещение скрытый-скрытый слоя слоя
(b_hi|b_hf|b_hg|b_ho), формы(4*hidden_size) -
weight_hr_l[k] – обучаемые проекционные веса слоя, формы
(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.
-
weight_ih_l[k] – обучаемые веса вход-скрытый слоя слоя
Примечание
Все веса и смещения инициализируются из , где
Примечание
Для двунаправленных 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