Использование Dropout с Keras и ячейкой LSTM / GRU - PullRequest
0 голосов
/ 06 июня 2018

В Keras вы можете указать выпадающий слой следующим образом:

model.add(Dropout(0.5))

Но с помощью ячейки GRU вы можете указать выпадение в качестве параметра в конструкторе:

model.add(GRU(units=512,
        return_sequences=True,
        dropout=0.5,
        input_shape=(None, features_size,)))

Чторазличия?Является ли один предпочтительнее другого?

В документации Keras он добавляет его в качестве отдельного выпадающего слоя (см. «Классификация последовательностей с помощью LSTM»)

1 Ответ

0 голосов
/ 06 июня 2018

Повторяющиеся слои выполняют одну и ту же повторную операцию снова и снова.

На каждом временном шаге требуется два входа:

  • Ваши входы (шаг вашей последовательности)
  • Внутренние входы (например, состояния и выход предыдущего шага)

Обратите внимание, что размеры входа и выхода могут не совпадать, что означает, что «ваш вход»измерения не будут совпадать с измерениями «рекуррентный ввод (предыдущий шаг / состояния)».

Тогда на каждом повторяющемся временном шаге выполняются две операции с двумя разными ядрами:

  • Применяется одно ядрочтобы «ваши входы» обрабатывать и преобразовывать его в совместимом измерении
  • Другое (называемое keras рекуррентным ядром) применяется к входам предыдущего шага.

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

  • Выпадение при первом преобразовании ваших входных данных
  • Выпадение при применении рекуррентного ядра

Таким образом, на самом деле в слоях RNN есть два выпадающих параметра:

  • dropout, примененные к первой операции на входах
  • recurrent_dropout, примененные к другимработа с рекуррентными входами (предыдущий выход и / или состояния)

Это описание можно кодировать либо в GRUCell, либо в LSTMCell, например, в исходном коде .


Что правильно?

Это открыто для творчества.

Вы можете использовать слой Dropout(...), он не «неправильный», но, возможно, также пропустит «временные шаги»!(Если вы не установите noise_shape правильно или не используете SpatialDropout1D, что в настоящее время еще не задокументировано)

Может быть, вы хотите, а может и нет.Если вы используете параметры в повторяющемся слое, вы будете применять выпадения только к другим измерениям, не пропуская ни одного шага.Это кажется полезным для повторяющихся слоев, если только вы не хотите, чтобы ваша сеть научилась работать с последовательностями, содержащими пропуски (это последнее предложение является справочным).

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

...