Состояние LSTM в пакете

В настоящее время я работаю над учебником Keras для периодического обучения сети., и у меня возникли проблемы с пониманием концепции LSTM с отслеживанием состояния. Для максимальной простоты последовательности имеют одинаковую длину seq_length. Насколько я понимаю, входные данные имеют форму (n_samples, seq_length, n_features), и затем мы обучаем наш LSTM на n_samples/M пакетах размера M следующим образом:

Для каждой партии:

  1. Подайте 2D-тензоры (seq_length, n_features) и для каждого входного 2D-тензора вычислите градиент
  2. Суммируйте эти градиенты, чтобы получить общий градиент партии.
  3. Обратное распространение градиента и обновление весов

В примере из учебника подача 2D-тензоров - это подача последовательности размером seq_length букв, закодированных как векторы длины n_features. Однако в руководстве говорится, что в реализации LSTM в Keras скрытое состояние сбрасывается не после ввода всей последовательности (2D-тензор), а после подачи пакета последовательностей для использования большего контекста.

Почему сохранение скрытого состояния предыдущей последовательности и использование его в качестве начального скрытого состояния для нашей текущей последовательности улучшает обучение и прогнозы на нашем тестовом наборе, поскольку это «ранее изученное» начальное скрытое состояние не будет доступно при прогнозировании? Более того, поведение Keras по умолчанию заключается в перетасовке входных выборок в начале каждой эпохи, чтобы контекст пакета изменялся в каждую эпоху. Такое поведение кажется противоречащим сохранению скрытого состояния в пакете, поскольку контекст пакета является случайным.


person H.M.    schedule 13.01.2017    source источник


Ответы (1)


LSTM в Keras по умолчанию не имеют состояния - каждая последовательность начинается с вновь сброшенных состояний. Установив stateful=True в вашем повторяющемся слое, последовательные входы в пакете не сбрасывают состояние сети. Это предполагает, что последовательности на самом деле являются последовательными, и это означает, что в (очень неформальном) смысле вы тренируетесь на последовательностях длины batch_size * seq_length.

Почему сохранение скрытого состояния предыдущей последовательности и использование его в качестве начального скрытого состояния для нашей текущей последовательности улучшает обучение и прогнозы на нашем тестовом наборе, поскольку это «ранее изученное» начальное скрытое состояние не будет доступно при прогнозировании?

Теоретически это улучшает обучение, потому что более длинный контекст может научить сеть вещам о распределении, которые все еще актуальны при тестировании на индивидуальных более коротких последовательностях. Если сеть изучает некоторое распределение вероятностей, это распределение должно сохраняться на разных длинах последовательностей.

Более того, поведение Keras по умолчанию - перетасовать входные выборки в начале каждой эпохи, чтобы контекст пакета изменялся в каждую эпоху. Такое поведение кажется противоречащим сохранению скрытого состояния в пакете, поскольку контекст пакета является случайным.

Я не проверял, но предполагаю, что когда stateful=True, перемешиваются только партии, а не последовательности в них.

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

person tao_oat    schedule 14.01.2017
comment
Хорошо, я только что нашел в документации keras: keras.io/layers/recurrent я нашел Из того, что скрытое состояние образца в i-й позиции в партии будет подаваться как входное скрытое состояние для образца в i-й позиции в следующей партии. Означает ли это, что если мы хотим передать скрытое состояние от образца к образцу, мы должны использовать пакеты размером 1 и, следовательно, выполнять онлайн-градиентный спуск? Есть ли способ передать скрытое состояние в пакете размером ›1 и выполнить градиентный спуск для этого пакета? - person H.M.; 15.01.2017
comment
Хотел бы знать, правы ли вы. До сих пор я спотыкался о том факте, что если у вас есть batch_size ›1, похоже, не имеет смысла передавать скрытое состояние первого элемента первого пакета первому элементу второго пакета. и так далее ... Также заставляет меня сомневаться, передается ли состояние в пакете, потому что это противоречило бы предыдущей методологии. т.е. наследует ли второй элемент второй партии состояние от второго элемента первой партии или от первого элемента второй партии? - person Michael Du; 27.04.2018