Почему я получаю Nan после добавления активации relu в LSTM? - PullRequest
1 голос
/ 24 марта 2019

У меня есть простая сеть LSTM, которая выглядит примерно так:

lstm_activation = tf.nn.relu

cells_fw = [LSTMCell(num_units=100, activation=lstm_activation), 
            LSTMCell(num_units=10, activation=lstm_activation)]

stacked_cells_fw = MultiRNNCell(cells_fw)

_, states = tf.nn.dynamic_rnn(cell=stacked_cells_fw,
                              inputs=embedding_layer,
                              sequence_length=features['length'],
                              dtype=tf.float32)

output_states = [s.h for s in states]
states = tf.concat(output_states, 1)

Мой вопрос Когда я не использую активацию (активации = нет) или использую tanh, все работает, но когда я переключаю relu, у меня постоянно появляется «потеря NaN во время тренировки», почему это так? Воспроизводится на 100%.

1 Ответ

1 голос
/ 24 марта 2019

Когда вы используете relu activation function внутри lstm cell, гарантируется, что все выходы из ячейки, а также состояние ячейки будут строго >= 0. Из-за этого ваши градиенты становятся чрезвычайно большими и взрываются. Например, запустите следующий фрагмент кода и обратите внимание, что выходные данные никогда не бывают < 0.

X = np.random.rand(4,3,2)
lstm_cell = tf.nn.rnn_cell.LSTMCell(5, activation=tf.nn.relu)
hidden_states, _ = tf.nn.dynamic_rnn(cell=lstm_cell, inputs=X, dtype=tf.float64)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(hidden_states))
...