代码之家  ›  专栏  ›  技术社区  ›  sachinruk

理解Seq2Seq模型

  •  7
  • sachinruk  · 技术社区  · 8 年前

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

    第二组(蓝色)是多对多LSTM,与第一组LSTM具有不同的权重。输入是简单的回答句,而输出是同一个句子移位一。

    问题有两个方面: 1、我们是否经过了最后一个隐藏状态 只有 和细胞存储器

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   Yu-Yang    4 年前
    1. 我们是否只将最后一个隐藏状态传递给蓝色LSTM作为初始隐藏状态。或者它是最后一个隐藏状态和细胞内存。

    两个隐藏状态 h 和细胞存储器 c 传递给解码器。

    张量流

    seq2seq source code basic_rnn_seq2seq() :

    _, enc_state = rnn.static_rnn(enc_cell, encoder_inputs, dtype=dtype)
    return rnn_decoder(decoder_inputs, enc_state, cell)
    

    如果您使用 LSTMCell enc_state 来自编码器的将是一个元组 (c, h)

    凯拉斯

    在Keras中,定义为 LSTMCell公司 (h, c) (注意,顺序不同于TF)。在里面 LSTMCell.call() ,您可以找到:

        h_tm1 = states[0]
        c_tm1 = states[1]
    

    从一个 LSTM return_state=True . 返回值是一个元组 (o, h, c) . 张量 o 是该层的输出,等于 除非您指定 return_sequences=True .

    1. 有没有办法在Keras或Tensorflow中设置初始隐藏状态和细胞记忆?如果是,请参考?

    ###张量流### 只需将初始状态提供给 LSTMCell公司 呼叫时。例如,在 official RNN tutorial

    lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
    ...
        output, state = lstm(current_batch_of_words, state)
    

    还有一个 initial_state 函数的参数,例如 tf.nn.static_rnn . 如果使用seq2seq模块,请提供以下状态: rnn_decoder 如问题1的代码所示。

    ###凯拉斯###

    使用关键字参数 初始_状态

    out = LSTM(32)(input_tensor, initial_state=(h, c))
    

    实际上,你可以在 the official documentation :

    可以通过以下方式象征性地指定RNN层的初始状态: . 的价值 应该是一个张量或张量列表,表示 RNN层的初始状态。


    编辑:

    Keras中现在有一个示例脚本( lstm_seq2seq.py

        2
  •  1
  •   Daniel Möller    8 年前

    (编辑:此答案不完整,未考虑状态转移的实际可能性。请参阅已接受的答案)。

    来自 从这个角度来看,这幅画只有两层。

    • 绿色组是一个LSTM层。

    除了传递输出外,绿色和蓝色之间没有任何通信。因此,1的答案是:

    1. 只有思想向量(该层的实际输出)被传递到另一层。

    在keras中,是这样的:

    enter image description here


    但是,访问每个步骤(图片中的每个单独绿块)并不是一件暴露的事情。所以

    1. https://github.com/fchollet/keras/issues/2995 )

    但是考虑到一个足够大的思想载体,你可以说它将学习一种方法来承载其本身重要的东西。

    • 您必须输入形状如下的内容 (sentences, length, wordIdFeatures)

    您可以选择具有单个输出 (sentences, cells)

    • 输出,如 (sentences, length, cells)

    现在,第一层是多对一(但如果您愿意,没有什么可以阻止它也是多对多)。

    但是第二个。。。这很复杂。

    • 如果思想向量是由多对一构成的。您必须设法创建一对多。(这在keras中并不微不足道,但你可以考虑在预期长度内重复思想向量,使其成为所有步骤的输入。或者用零或1填充整个序列,只保留第一个元素作为思想向量)