Разница между двумя моделями Sequence to Sequence Models (с RepeatVector и без него)

Я пытаюсь понять, в чем разница между этой моделью, описанной здесь, следующий:

from keras.layers import Input, LSTM, RepeatVector
from keras.models import Model

inputs = Input(shape=(timesteps, input_dim))
encoded = LSTM(latent_dim)(inputs)

decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(input_dim, return_sequences=True)(decoded)

sequence_autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)

и описанная здесь модель последовательности для последовательности второе описание

В чем разница ? У первого есть RepeatVector, а у второго его нет? Разве первая модель не принимает скрытое состояние декодеров в качестве начального состояния для прогноза?

Есть ли документ, описывающий первый и второй?


person texaspythonic    schedule 24.07.2018    source источник


Ответы (1)


В модели, использующей RepeatVector, они не используют никаких причудливых прогнозов и не имеют дело с состояниями. Они позволяют модели делать все внутри, а RepeatVector используется для преобразования вектора (batch, latent_dim) (который не является последовательностью) в (batch, timesteps, latent_dim) (который теперь является правильной последовательностью).

Теперь в другой модели, без RepeatVector, секрет кроется в этой дополнительной функции:

def decode_sequence(input_seq):
    # Encode the input as state vectors.
    states_value = encoder_model.predict(input_seq)

    # Generate empty target sequence of length 1.
    target_seq = np.zeros((1, 1, num_decoder_tokens))
    # Populate the first character of target sequence with the start character.
    target_seq[0, 0, target_token_index['\t']] = 1.

    # Sampling loop for a batch of sequences
    # (to simplify, here we assume a batch of size 1).
    stop_condition = False
    decoded_sentence = ''
    while not stop_condition:
        output_tokens, h, c = decoder_model.predict([target_seq] + states_value)

        # Sample a token
        sampled_token_index = np.argmax(output_tokens[0, -1, :])
        sampled_char = reverse_target_char_index[sampled_token_index]
        decoded_sentence += sampled_char

        # Exit condition: either hit max length
        # or find stop character.
        if (sampled_char == '\n' or len(decoded_sentence) > max_decoder_seq_length):
            stop_condition = True

        # Update the target sequence (of length 1).
        target_seq = np.zeros((1, 1, num_decoder_tokens))
        target_seq[0, 0, sampled_token_index] = 1.

        # Update states
        states_value = [h, c]

    return decoded_sentence

Это запускает цикл на основе stop_condition для создания временных шагов один за другим. (Преимуществом этого является создание предложений без фиксированной длины).

Он также явно принимает состояния, сгенерированные на каждом шаге (чтобы сохранить правильную связь между каждым отдельным шагом).


Короче:

  • Модель 1: создает длину, повторяя скрытый вектор
  • Модель 2: создает длину, повторяя новые шаги до тех пор, пока не будет достигнуто условие остановки.
person Daniel Möller    schedule 24.07.2018
comment
Вы сказали, что можете составлять предложения без фиксированной длины, возможно ли это также с данными временных рядов? Если да, не могли бы вы привести пример, основанный на форме (Нет, временные интервалы, количество функций)? - person texaspythonic; 24.07.2018
comment
Нет никакой разницы между предложениями и временными рядами, оба представляют собой данные в форме (batch, steps, features), которые слепо интерпретируются моделью. --- Вы можете следовать точно той же процедуре, которую они использовали в этой модели, или вы можете следовать подходу с отслеживанием состояния, который я создал в этих ответах: stackoverflow.com/questions/47594861/ --- stackoverflow.com/questions/48760472/ - person Daniel Möller; 24.07.2018
comment
Я попробовал кое-что, но мой прогноз требует того же размера партии, что и в обучении, и не является переменным. Я сделаю еще один пост с моим кодом для этого. - person texaspythonic; 24.07.2018
comment
посмотрите здесь, пожалуйста, stackoverflow.com /вопросы/51501726/ - person texaspythonic; 24.07.2018
comment
другой вопрос: использует ли модель с RepeatVector исходное состояние кодировщика в качестве исходного состояния декодера в прогнозе? - person texaspythonic; 24.07.2018
comment
Нет, эта модель использует только латентные данные и ничего больше. (Он создает свои собственные состояния по мере прохождения шагов, но внутренне и невидим для пользователя). - person Daniel Möller; 24.07.2018