О правильном использовании dropout в RNNs (Keras) - PullRequest
0 голосов
/ 22 мая 2018

Я запутался между тем, как правильно использовать dropout с RNN в кератах, особенно с устройствами GRU.Документация keras относится к этому документу (https://arxiv.org/abs/1512.05287), и я понимаю, что одну и ту же маску выпадения следует использовать для всех временных шагов. Это достигается с помощью аргумента отсева при указании самого слоя GRU. Что я не понимаю, так это:

  1. Почему в Интернете есть несколько примеров, включая собственный пример keras (https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py) и назначение «Обнаружение триггерного слова» в курсе «Модели секвенций» Эндрю Нг, где ониявно добавьте выпадающий слой "model.add (Dropout (0.5))", который, в моем понимании, будет добавлять разные маски к каждому временному шагу.

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

Я сам обучил модель, которая использует различные dropou• маскируется на каждом шаге по времени, и хотя я не получил результатов, как хотел, модель может превосходить тренировочные данные.Это, в моем понимании, делает недействительными «накопление шума» и «потеря сигнала» на всех временных шагах (у меня есть 1000 временных рядов, которые вводятся в слои GRU).

Любые идеи,объяснения или опыт с ситуацией будут полезны.Спасибо.

ОБНОВЛЕНИЕ:

Чтобы прояснить ситуацию, я упомяну выдержку из документации keras о Dropout Layer ("noise_shape: 1D целочисленный тензор, представляющий форму двоичной маски выпадения, которая будетумножить на вход. Например, если ваши входы имеют форму (batch_size, временные шаги, функции) и вы хотите, чтобы маска выпадения была одинаковой для всех временных шагов, вы можете использовать noise_shape = (batch_size, 1, features ").Полагаю, можно видеть, что при явном использовании слоя Dropout и необходимости одинаковой маски на каждом временном шаге (как упомянуто в статье) нам необходимо отредактировать этот аргумент noise_shape, чего не было в примерах, которые я связывал ранее.

1 Ответ

0 голосов
/ 26 марта 2019

Как Астериск объяснил в своем комментарии, есть принципиальная разница между выпадением в повторяющейся единице и выпадением после выхода устройства.Это архитектура из учебника keras , который вы указали в своем вопросе:

model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(Bidirectional(LSTM(64)))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

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

То, что Гал и Гахрамани предлагают в своей статье (которую вы связали в вопросе), это отсев в периодическомБлок.Там вы сбрасываете входную информацию между временными шагами последовательности.Я нашел этот пост очень полезным для понимания статьи и ее связи с реализацией keras.

...