我已将embedding_attention_seq2seq模块用于机器翻译任务,如指定的教程中所述:

https://www.tensorflow.org/versions/master/tutorials/seq2seq/index.html

在指定教程中模型的seq2seq_model.py中,我注意到,如果在以下几行中将use_lstm设置为false,则它们默认使用GRUCell:

# Create the internal multi-layer cell for our RNN.
single_cell = tf.nn.rnn_cell.GRUCell(size)
if use_lstm:
  single_cell = tf.nn.rnn_cell.BasicLSTMCell(size)
cell = single_cell
if num_layers > 1:
  cell = tf.nn.rnn_cell.MultiRNNCell([single_cell] * num_layers)


现在,如果编码器是双向的并且上下文考虑了两个隐藏层参数,则本教程指定为实施模型的论文here中描述的注意力机制在语义上更具意义。 seq2seq_model文件未提及双向组件。

所以我的问题是,embedding_attention_seq2seq是否默认实现了双向RNN编码器?

如果不是,是否仅采用普通LSTM编码器每个时间步的隐藏层输出,从而将上下文限制为仅出现在句子之前的句子中的单词?

最佳答案

所以我的问题是,embedding_attention_seq2seq是否默认实现了双向RNN编码器?


不,它没有实现双向RNN编码器。编码器的输出(用于建立注意力状态)构建在embedding_attention_seq2seq的前几行之内:

# Encoder.
encoder_cell = rnn_cell.EmbeddingWrapper(
    cell, embedding_classes=num_encoder_symbols,
    embedding_size=embedding_size)
encoder_outputs, encoder_state = rnn.rnn(
    encoder_cell, encoder_inputs, dtype=dtype)


第一行用嵌入包装单元格。第二个将encoder_cell向前移动到encoder_inputs上(tf/python/ops/rnn.py的第210-228行)。


  如果不是,是否仅采用普通LSTM编码器每个时间步的隐藏层输出,从而将上下文限制为仅出现在句子之前的句子中的单词?


没错

关于python - TensorFlow embedding_attention_seq2seq方法默认情况下是否实现双向RNN编码器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40044937/

10-11 00:48