Tensorflow LSTM - Реализация отсева
Я следую примеру Tensorflow для LSTM (в папке Udacity) https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/6_lstm.ipynb и пытаюсь реализовать выпадение на ванильном LSTM.
Читая статью Зарембы, моя интерпретация отсева состоит только в добавлении одной строки dropped_i = tf.nn.dropout(i, 0.5)
в lstm_cell.
def lstm_cell(i, o, state):
dropped_i = tf.nn.dropout(i, 0.5) # <- here!
input_gate = tf.sigmoid(tf.matmul(i, ix) + tf.matmul(o, im) + ib)
forget_gate = tf.sigmoid(tf.matmul(i, fx) + tf.matmul(o, fm) + fb)
update = tf.matmul(i, cx) + tf.matmul(o, cm) + cb
state = forget_gate * state + input_gate * tf.tanh(update) # to keep things between -1 and +1
output_gate = tf.sigmoid(tf.matmul(i, ox) + tf.matmul(o, om) + ob)
return output_gate * tf.tanh(state), state
Мой вопрос
1) Реализация отсева это так просто? Просто добавить одну строку в ячейку LSTM? Я не уверен, что моя реализация верна.
2) Когда я применяю отсев на output_gate
так же как input_gate
затем недоумение ухудшается. Насколько я понимаю, потому что выход снова становится входным, нам нужно только применить выпадение на input_gate
, Пожалуйста, кричите на меня, если это не правильно.
Я искал GitHub, чтобы увидеть, как другие решили эту проблему, но у всех разное решение. Если бы кто-то мог дать мне подсказку или указать правильную реализацию, я был бы очень благодарен.