Python 为什么在LSTM中添加relu激活后我会得到Nan?

Python 为什么在LSTM中添加relu激活后我会得到Nan?,python,tensorflow,lstm,relu,Python,Tensorflow,Lstm,Relu,我有一个简单的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.dynami

我有一个简单的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%可复制的。

当您在
lstm单元
内使用
relu激活功能
时,可以保证单元的所有输出以及单元状态将严格
=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))

谢谢你的解释!所以它在没有任何激活的情况下工作,因为细胞可以有Noup值。默认情况下,单元内的激活函数为
tanh
。换句话说,如果在定义单元格时不提供任何激活函数,则默认情况下将使用
tanh
。另一方面,在没有激活函数(或线性激活函数)的情况下,由于单元中缺乏非线性,单元的学习能力将降低为线性函数。