Какая разница между "скрытыми" и "выходными" в PyTorch LSTM?
У меня возникли проблемы с пониманием документации для модуля PyTorch LSTM (а также RNN и GRU, которые похожи). Что касается результатов, в нем говорится:
Выходы: вывод, (h_n, c_n)
- output (seq_len, batch, hidden_size * num_directions): тензор, содержащий выходные характеристики (h_t) из последнего уровня RNN, для каждого t. Если в качестве входного сигнала указано значение параметра torch.nn.utils.rnn.PackedSequence, выход также будет упакованной последовательностью.
- h_n (num_layers * num_directions, batch, hidden_size): тензор, содержащий скрытое состояние для t = seq_len
- c_n (num_layers * num_directions, batch, hidden_size): тензор, содержащий состояние ячейки для t = seq_len
Кажется, что output
значения переменных и h_n
дают значения скрытого состояния. h_n
просто избыточно предоставляет последний шаг времени, который уже включен в output
, или есть что-то еще для этого, чем это?
Ответы
Ответ 1
Я сделал диаграмму. Имена следуют за документами PyTorch, хотя я переименовал num_layers
в w
.
output
содержит все скрытые состояния в последнем слое ("последний" по глубине, а не по времени). (h_n, c_n)
содержит скрытые состояния после последнего timestep, t = n, так что вы можете потенциально передать их в другой LSTM.
Размер партии не включен.
Ответ 2
Выходное состояние - это тензор всех скрытых состояний от каждого временного шага в RNN (LSTM), а скрытое состояние, возвращаемое RNN (LSTM), является последним скрытым состоянием из последнего временного шага из входной последовательности. Вы можете проверить это, собирая все скрытые состояния с каждого шага и сравнивая их с выходным состоянием (при условии, что вы не используете pack_padded_sequence).