我正在尝试将一个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)
。有没有人知道如何改变形状以使其发挥作用,或者是否有更好的方法?
由于
答案 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的向量它就等同于它。