Какая разница между "скрытыми" и "выходными" в 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.

LSTM diagram

Размер партии не включен.

Ответ 2

Выходное состояние - это тензор всех скрытых состояний от каждого временного шага в RNN (LSTM), а скрытое состояние, возвращаемое RNN (LSTM), является последним скрытым состоянием из последнего временного шага из входной последовательности. Вы можете проверить это, собирая все скрытые состояния с каждого шага и сравнивая их с выходным состоянием (при условии, что вы не используете pack_padded_sequence).