Реализует ли метод TensorFlow embedding_attention_seq2seq двунаправленный кодировщик RNN по умолчанию?

#python #tensorflow

#python #tensorflow

Вопрос:

Я использовал модуль embedding_attention_seq2seq для задачи машинного перевода, как было описано в руководствах, указанных:

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

В seq2seq_model.py том, что указывает модель в руководстве, я заметил, что они использовали GRUCell по умолчанию, если use_lstm false в этих строках установлено значение:

 # 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)
 

Теперь механизм внимания, описанный в статье здесь, который в руководстве указан в качестве реализованной модели, имеет гораздо больший смысл, если кодировщик является двунаправленным, а контекстуализация учитывает оба параметра скрытого слоя. В файле seq2seq_model нет никакого упоминания о двунаправленном компоненте.

Итак, мой вопрос в том, реализует ли embedding_attention_seq2seq двунаправленный кодировщик RNN по умолчанию?

Если нет, он просто принимает выходные данные скрытого уровня каждого временного шага обычного кодировщика LSTM, тем самым ограничивая контекст только словами в предложении, которые произошли до него?

Ответ №1:

Итак, мой вопрос в том, реализует ли 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 (строки 210-228 из tf/python/ops/rnn.py ).

Если нет, он просто принимает выходные данные скрытого уровня каждого временного шага обычного кодировщика LSTM, тем самым ограничивая контекст только словами в предложении, которые произошли до него?

Это правильно.