Выпадающий слой до или после LSTM. В чем разница? - PullRequest
1 голос
/ 07 ноября 2019

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

ipt   = Input(shape = (shape[0], shape[1])
x     = Dropout(0.3)(ipt) ## Dropout before LSTM.
x     = CuDNNLSTM(10, return_sequences = False)(x)
out   = Dense(1, activation='relu')(x)

Мы можем добавить слой Dropout перед LSTM (как в приведенном выше коде) или после LSTM.

  • Если мы добавим его до LSTM, будет ли применено выпадение на временных шагах (различная задержка временных рядов) или другие входные функции, или они оба?

  • Если мы добавим его после LSTM и поскольку return_sequences равно False, что здесь делает отсев?

  • Есть ли какая-либо разница между опцией dropout в LSTM и выпадающий слой перед LSTM слоем?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

По умолчанию Dropout создает случайный тензор нулей и единиц. Нет шаблона, нет привилегированной оси. Таким образом, вы не можете сказать, что конкретная вещь отбрасывается, просто случайные координаты в тензоре. (Ну, он отбрасывает функции, но разные функции для каждого шага и по-разному для каждого образца)

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

  • Шаг времени падения: noise_shape = (1,steps,1)
  • Особенности сброса: noise_shape = (1,1, features)
  • Образцы сброса: noise_shape = (None, 1, 1)

Тамтакже слой SpatialDropout1D, который использует noise_shape = (input_shape[0], 1, input_shape[2]) автоматически. Это исключает одну и ту же функцию для всех временных шагов, но обрабатывает каждый образец индивидуально (каждый образец отбрасывает свою группу функций).

После LSTM у вас есть shape = (None, 10). Таким образом, вы используете Dropout так же, как и в любой полностью подключенной сети. Он отбрасывает различные группы функций для каждого образца.

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

Кроме того, есть опция recurrent_dropout, которая будет генерировать 4 маски выпадения, но должна применяться к состояниям вместо входов, каждый шаг повторяющихся вычислений.

1 голос
/ 07 ноября 2019

Вы путаете Dropout с его вариантом SpatialDropoutND (либо 1D, 2D, либо 3D). См. documentation (очевидно, вы не можете связать определенный класс).

  • Dropout применяет случайную двоичную маску для ввода, независимо от формы, кроме первогоразмерность (пакет), поэтому в этом случае он применяется к элементам и временным шагам.

  • Здесь, если return_sequences=False, вы получите вывод только из последнего временного шага, поэтому он будет иметь размер[batch, 10] в вашем случае. Выпадение случайным образом отбрасывает значение из второго измерения

  • Да, есть разница, поскольку dropout для временных шагов, когда LSTM создает последовательности (например, последовательности 10 идутчерез развернутый LSTM, и некоторые функции отбрасываются перед переходом в следующую ячейку). Dropout будет отбрасывать случайные элементы (кроме размера партии). SpatialDropout1D отбрасывает целые каналы, в этом случае некоторые временные шаги будут полностью пропущены (в случае свертки вы можете использовать SpatialDropout2D для отбрасывания каналов, либо входных, либо по сети).

...