Как обучить модель кодировщика-декодера?

Я не очень понимаю очевидные (или фактически одинаковые?) Процедуры обучения для обучения кодировщика-декодера LSTM.

с одной стороны, в учебнике для обучения используется цикл for: https://www.tensorflow.org/tutorials/text/nmt_with_attention#training.

но здесь https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html

(первая модель)

просто использует простой

# Run training
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2)

Здесь, как говорят обе процедуры, они тренируются с помощью метода принуждения учителя.

Но я не могу понять, почему оба пути одинаковы?

Почему я могу обучать кодировщик-декодер без цикла for, как при обычном обучении модели, хотя мне нужен предыдущий шаг декодирования для обучения следующему шагу декодирования?


person ctiid    schedule 14.12.2020    source источник


Ответы (1)


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

Следующий ответ объясняет концепцию временных шагов в LSTM Что такое временной шаг в модели LSTM?

Это полезная картинка для обсуждения. введите описание изображения здесь

Для согласования с LSTM Keras API:

  • Когда указывается return_sequences = True, keras возвращает векторы h0, hN для каждого временного шага, указанные выше;
  • Когда указывается return_state = True, возвращается последний побочный вывод (стрелка вправо из самого правого блока A).

На этом изображении результат шага N зависит только от [x0, xN].

Когда у вас есть модель, как определено в вашей ссылке, которая зависит только от значений h на изображении выше, они, когда вы вычисляете потери / градиенты, математика одинакова, независимо от того, делаете ли вы это за один снимок или за цикл.

Этого не произошло бы, если бы использовалось последнее состояние LSTM (боковая стрелка от самого правого блока A на рисунке).

Из документации Keras LSTM API:

return_state: логическое. Следует ли возвращать последнее состояние в дополнение к выходным данным. По умолчанию: False.

Соответствующий комментарий в коде:

# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the 
# return states in the training model, but we will use them in inference.

Вы можете попробовать взглянуть на последовательность длины 2. Если вы вычисляете градиенты предсказания временного шага 0 и 1 за один прием, то, что касается LSTM, градиент для h0 (результат временного шага 0 ) зависит только от соответствующего входа; градиент h1 (результат временного шага 1) зависит от x0 и x1 и преобразований через LSTM. Если вы рассчитываете время градиента шаг за шагом, вы получите точно такой же расчет.

Если вы посмотрите на модели трансформаторов, вы увидите, что они используют маску для маскировки последовательности, чтобы гарантировать, что шаг N зависит только от предыдущего шага N.

person Pedro Marques    schedule 14.12.2020
comment
Извините, но трудно понять, поскольку вы используете нестандартные слова и особенно для RNN, слова не являются точными: скрытый вектор, состояния ячеек. Я не знаю, что вы имеете в виду под поэтапным вектором ... - person ctiid; 17.12.2020
comment
Почему (и откуда вы это знаете) конечное состояние (что бы вы под этим ни подразумевали) не используется моделью? И почему это зависит только от значений h. Я предполагаю, что вы на шаге h - это скрытые состояния? - person ctiid; 17.12.2020
comment
@cltid согласно ответу: выходные данные h0..hN называются return_sequences в API Keras; крайняя правая стрелка блока «A» называется последним или конечным состоянием Keras API. - person Pedro Marques; 17.12.2020
comment
Является ли самая правая стрелка стрелкой перед последней A-ячейкой? И последнее состояние означает последнее скрытое состояние (как подразумевается с возвращаемыми последовательностями, вывод последней ячейки? - person ctiid; 17.12.2020
comment
Каждая ячейка A на диаграмме принимает вход (xN), производит выход (hX) на диаграмме и состояние (стрелка вправо). last state согласно API Keras - это стрелка вправо от самой правой (конец последовательности) ячейки. На схеме эта стрелка не показана. - person Pedro Marques; 17.12.2020
comment
Формулировка как-то другая. Мне просто интересно в блоге, в каком внутреннем состоянии: он обрабатывает входную последовательность и возвращает собственное внутреннее состояние - person ctiid; 17.12.2020
comment
Внутреннее состояние - это стрелки, указывающие вправо. Но на самом деле модель использует последний вывод LSTM + внутреннее состояние. encoder_states = [state_h, state_c] Это соответствует на изображении выше hN + правый выход последнего блока 'A'. - person Pedro Marques; 17.12.2020
comment
Извините, но я не уверен, что это решает проблему. В комментарии к блогу, когда я не использую принуждение учителя, я думаю, что это тот же метод обучения, что и на сайте tf. Для меня все еще непонятно, почему обучение с помощью одного оператора fit или внутри цикла for одинаково. - person ; 20.12.2020
comment
@PedroMarques. Спасибо. Значит, должна быть возможность переписать первую модель из блога (с инструкцией fit) как ту же модель, но с использованием цикла for? Когда я использую цикл for, нужно ли мне использовать один LSTMCelll вместо слоя? как здесь: tensorflow.org/tutorials/structured_data/ - person ; 25.12.2020