如何在 Tensorflow 中将一个 LSTM 的输出与文本一起输入到另一个 LSTM 中?



我正在尝试将一个 LSTM 层的输出与该层包含的文本一起输入到另一个 LSTM 层中。提供给两个 LSTM 的文本是不同的,我的目标是第二个 LSTM 根据第一个 LSTM 的理解来提高对其文本的理解。

我可以尝试在 Tensorflow 中实现它,如下所示:

# text inputs to the two LSTM's
rnn_inputs = tf.nn.embedding_lookup(embeddings, text_data)
rnn_inputs_2 = tf.nn.embedding_lookup(embeddings, text_data)
# first LSTM
lstm1Output, lstm1State = tf.nn.dynamic_rnn(cell=lstm1, 
inputs=rnn_inputs, 
sequence_length=input_lengths, 
dtype=tf.float32, 
time_major=False)
# second LSTM
lstm2Output, lstm2State = tf.nn.dynamic_rnn(cell=lstm2, 
# use the input of the second LSTM and the first LSTM here
inputs=rnn_inputs_2 + lstm1State, 
sequence_length=input_lengths_2, 
dtype=tf.float32, 
time_major=False)

这有一个问题,因为rnn_inputs_2大小为(batch_size, _, hidden_layer_size),而lstm1State大小为(batch_size, hidden_layer_size)。有没有人知道我如何更改形状以使其工作,或者是否有更好的方法?

谢谢

您将 LSTM1 的隐藏状态解释为句子嵌入(理所当然)。您现在希望将嵌入到 LSTM2 中的句子作为其决策所依据的先验知识传递。

如果我描述正确,那么您似乎正在描述一个编码器/解码器模型,并在 LSTM2 中添加了新的输入。如果这是准确的,那么我的第一个方法是将 LSTM1 的隐藏状态作为 LSTM2 的初始状态传递。这比将其添加到每个 LSTM2 时间步的输入中要合乎逻辑得多。

你还有一条额外的梯度路径从 LSTM2 通过 LSTM1 的状态回到 LSTM1,所以你不仅要训练 LSTM1 的损失函数,还要训练它提供 LSTM2 可以用来改进其损失函数的能力(假设你在同一个 sess.run 迭代中训练了 LSTM 1 和 2)。

关于这个问题:

另一个问题,如果我想介绍一个输出的 LSTM3 怎么办 也应该影响 LSTM2。在这种情况下,我会只对 LSTM3 和 LSTM1 隐藏状态并将其设置为 LSTM2 的初始状态?

求和听起来很糟糕,连接听起来不错。您可以控制 LSTM2 的隐藏状态大小,它应该具有更大的隐藏状态大小。

关于这个问题:

我没有提到的一件事 早些时候是有时 LSTM1 不会收到任何输入,显然 由于它的输入是一个句子,LSTM1 将接收不同的输入 每次。这是否会影响 LSTM1 和 LSTM2 的错误更新? 另外,这意味着我不能使用编码器-解码器系统, 右?否则你说的有道理,我现在正在运行它 并会看看它是否有助于我的表现

在这种情况下,如果 LSTM1 没有输入(因此没有输出状态),我认为合乎逻辑的解决方案是使用全零的标准隐藏状态向量初始化 LSTM2。如果你不给它一个初始的隐藏状态,这就是dynamic_rnn在引擎盖下所做的,所以如果你显式地向它传递一个 0 的向量,它是等效的。

最新更新