了解Seq2Seq模型

sac*_*ruk 7 lstm keras tensorflow

以下是我对LSTM序列的基本序列的理解.假设我们正在处理问答环境.

你有两套LSTM(下面是绿色和蓝色).每组分别共享权重(即4个绿色单元中的每一个具有相同的权重并且与蓝色单元类似).第一个是多对一LSTM,它总结了最后一个隐藏层/单元内存的问题.

第二组(蓝色)是多对多LSTM,其与第一组LSTM具有不同的权重.输入只是答案句子,而输出是相同的句子移一.

问题有两个:1.我们是否将最后一个隐藏状态作为初始隐藏状态传递给蓝色LSTM.或者它是最后隐藏的状态和单元格记忆.2.有没有办法在Keras或Tensorflow中设置初始隐藏状态和单元格内存?如果是这样参考?

http://suriyadeepan.github.io/img/seq2seq/seq2seq2.png (图片来自suriyadeepan.github.io)

Yu-*_*ang 3

  1. 我们是否仅将最后一个隐藏状态传递给蓝色 LSTM 作为初始隐藏状态。或者是最后的隐藏状态和细胞记忆。

隐藏状态h和单元内存c都传递给解码器。

TensorFlow

seq2seq源代码中,您可以找到以下代码basic_rnn_seq2seq()

_, enc_state = rnn.static_rnn(enc_cell, encoder_inputs, dtype=dtype)
return rnn_decoder(decoder_inputs, enc_state, cell)
Run Code Online (Sandbox Code Playgroud)

如果您使用 an LSTMCell,从编码器返回的enc_state将是一个 tuple (c, h)。如您所见,元组直接传递到解码器。

喀拉斯

在 Keras 中,为 an 定义的“状态”LSTMCell也是一个元组(h, c)(注意顺序与 TF 不同)。在 中LSTMCell.call(),您可以找到:

    h_tm1 = states[0]
    c_tm1 = states[1]
Run Code Online (Sandbox Code Playgroud)

要获取从图层返回的状态LSTM,您可以指定return_state=True。返回的值是一个元组(o, h, c)。张量是该层的输出,除非您指定,否则o它将等于。hreturn_sequences=True

  1. 有没有办法在 Keras 或 Tensorflow 中设置初始隐藏状态和单元内存?如果可以参考一下?

LSTMCell###TensorFlow###调用时只需提供初始状态即可。例如官方RNN教程中:

lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
...
    output, state = lstm(current_batch_of_words, state)
Run Code Online (Sandbox Code Playgroud)

initial_state对于诸如 之类的函数也有一个争论tf.nn.static_rnn。如果您使用 seq2seq 模块,请提供rnn_decoder问题 1 的代码中所示的状态。

###凯拉斯###

initial_state在 LSTM 函数调用中使用关键字参数。

out = LSTM(32)(input_tensor, initial_state=(h, c))
Run Code Online (Sandbox Code Playgroud)

其实你可以在官方文档中找到这个用法:

###关于指定 RNN 初始状态的注意事项###

您可以通过使用关键字参数调用 RNN 层来象征性地指定它们的初始状态initial_state。的值 initial_state应该是代表 RNN 层初始状态的张量或张量列表。


编辑:

Keras 中现在有一个示例脚本 ( lstm_seq2seq.py ),展示了如何在 Keras 中实现基本的 seq2seq。该脚本还介绍了如何在训练 seq2seq 模型后进行预测。