如何将一个LSTM的输出与Text一起输入Tensorflow中的另一个LSTM?

时间:2018-02-02 23:06:19

标签: tensorflow nlp deep-learning 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)。有没有人知道如何改变形状以使其发挥作用,或者是否有更好的方法?

由于

1 个答案:

答案 0 :(得分:1)

您将LSTM1的隐藏状态解释为嵌入句子(理所当然)。现在,您希望将嵌入LSTM2的句子作为先验知识传递给LSTM2。

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

你还有一个额外的好处是有一个额外的梯度路径从LSTM2传递到LSTM1状态回到LSTM1,所以你不仅要训练LSTM1 LSTM1的损失函数,还要训练LSTM1提供某些东西的能力LSTM2可用于改善其损失函数(假设您在相同的sess.run迭代中训练LSTM 1和2)。

关于这个问题:

  

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

总结听起来很糟糕,连接声音很好。您可以控制LSTM2的隐藏状态大小,它应该具有更大的隐藏状态大小。

关于这个问题:

  

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

在这种情况下,如果LSTM1没有输入(因此没有输出状态),我认为逻辑解决方案是使用全零的标准隐藏状态向量初始化LSTM2。如果你没有给它一个初始的隐藏状态,这就是dynamic_rnn在幕后做的事情,所以如果你明确地传递一个0的向量它就等同于它。