我已将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编码器的每个时间步的隐藏层输出,从而将上下文仅限于句子中之前发生的单词?
答案 0 :(得分:3)
所以我的问题是,embedding_attention_seq2seq默认是否实现了双向RNN编码器?
不,它没有实现双向RNN编码器。编码器的输出(用于建立注意状态)是在columns: [
{ field: "field1", title: "Field 1", locked: true, width:200 },
{ field: "field2", title: "Field 2", width: 1000 }
]
的前几行内构建的:
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
的第210-228行。
如果没有,它是否只是简单地采用普通LSTM编码器的每个时间步的隐藏层输出,从而将上下文仅限于句子中之前发生的单词?
那是对的。