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, возможно, представляет собой нулевое слово.