#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, тем самым ограничивая контекст только словами в предложении, которые произошли до него?
Это правильно.