Seq2Seq с пониманием Кераса

Для самообучения я пытаюсь реализовать простую модель последовательность-последовательность с использованием Keras. Хотя я понял основную идею и в Интернете есть несколько учебных пособий, я все еще борюсь с некоторыми основными концепциями, когда смотрю эти учебные пособия:

  • Учебник Keras: я пытался принять этот учебник. К сожалению, это для последовательностей символов, но я стремлюсь к последовательностям слов. Есть блок для объяснения необходимых словосочетаний, но в настоящее время он выдает ошибки "неправильного измерения" - но это нормально, вероятно, некоторые ошибки подготовки данных с моей стороны. Но что еще более важно, в этом уроке я ясно вижу 2 типа ввода и 1 тип вывода: encoder_input_data, decoder_input_data, decoder_target_data
  • Учебное пособие по MachineLearningMastery. Здесь сетевая модель выглядит совсем иначе: она полностью последовательна с 1 входом и 1 выходом. Из того, что я могу сказать, здесь декодер получает только выходные данные кодера.

Правильно ли говорить, что это действительно два разных подхода к Seq2Seq? Какой из них может быть лучше и почему? Или я неправильно прочитал 2-й урок? Я уже получил понимание в классификации последовательностей и маркировке последовательностей, но с последовательностью к последовательности это еще не щелкнуло должным образом.

1 ответ

Решение

Да, эти два подхода разные, и есть и другие варианты. MachineLearningMastery немного упрощает вещи, чтобы сделать их доступными. Я считаю, что метод Keras может работать лучше и это то, что вам нужно, если вы захотите перейти на seq2seq с вниманием, которое почти всегда имеет место.

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

    model.add(RepeatVector(tar_timesteps))

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

Я также рекомендовал бы учебник по Pytorch, который я считаю наиболее подходящим методом.

Изменить: я не знаю вашу задачу, но что вы хотели бы для встраивания слов

x = Embedding(num_encoder_tokens, latent_dim)(encoder_inputs)

Перед этим вам нужно отобразить каждое слово в словаре в целое число, превратить каждое предложение в последовательность целых чисел и передать эту последовательность целых чисел в модель (слой вложения latent_dim может быть равен 120). Таким образом, каждое ваше слово теперь представлено вектором размером 120. Также ваши входные предложения должны быть одинакового размера. Поэтому найдите подходящую максимальную длину предложения и превратите каждое предложение в эту длину и добавьте ноль, если предложения короче, чем max len, где 0, возможно, представляет собой нулевое слово.

Другие вопросы по тегам