Как ограничить прогнозирование последовательности в модели LSTM для соответствия заданному шаблону c? - PullRequest
5 голосов
/ 06 апреля 2020

Я создал текстовый генератор на уровне слов, используя модель LSTM. Но в моем случае не каждое слово подходит для выбора. Я хочу, чтобы они соответствовали дополнительным условиям:

  1. Каждое слово имеет карту: если символ является гласным, то он будет писать 1, если нет, он будет писать 0 (например, переполнение будет 10100010). Затем сгенерированное предложение должно соответствовать заданной структуре, например, 01001100 ( hi 01 и friend 001100).
  2. Последний гласный последнего слова должен быть предоставленным. Допустим, это е . ( пт e и выполнят эту работу, затем).

Таким образом, для обработки этого сценария я создал pandas кадр данных со следующей структурой:

word    last_vowel  word_map
-----   ---------   ----------
hello   o           01001
stack   a           00100
jhon    o           0010

Это мой текущий рабочий процесс:

  1. Учитывая структуру предложения, я выбираю случайное слово из кадра данных, которое соответствует шаблону. Например, если структура предложения 0100100100100, мы можем выбрать слово hello , так как его структура гласной: 01001.
  2. Я вычту выбранное слово из оставшейся структуры: 0100100100100 станет 00100100, поскольку мы удалили начальную 01001 ( hello ).
  3. Я извлекаю все слова из кадра данных, который соответствует части оставшейся структуры, в этом случае stack 00100 и jhon 0010.
  4. Я передаю текущее содержание предложения слова (просто hello к настоящему времени ) к модели LSTM, и она извлекает веса каждого слова.
  5. Но я не просто хочу выбрать лучший вариант, я хочу выбрать лучший вариант, содержащийся в выборе пункта 3. Так Я выбираю слово с наивысшей оценкой в ​​этом списке, в данном случае stack .
  6. Повторяйте от пункта 2 до тех пор, пока оставшаяся структура предложения не станет пустой.

Это работает как заклинание, но есть одно оставшееся условие dle: последний гласный в предложении.

Мой способ решения этой проблемы заключается в следующем:

  1. Создание 1000 предложений, заставляя указывать последний гласный.
  2. Получите rmse весов, возвращаемых моделью LSTM. Чем лучше результат, тем выше будет вес.
  3. Выбор предложения, которое получает более высокий ранг.

Как вы думаете, есть ли лучший подход? Может быть, GAN или обучение с подкреплением?

РЕДАКТИРОВАТЬ: Я думаю, что другой подход будет добавление WFST. Я слышал о библиотеке pynini , но я не знаю, как применить ее к моему конкретному c контексту.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

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

Теперь, если это изменение невозможно или если после прочтения моего ответа вы обнаружите, что это не находит лучшего решения, затем я предлагаю использовать алгоритм поиска пути, аналогичный обучению с подкреплением, но не статистический, поскольку веса, вычисленные с помощью обученного LSTM, являются детерминированными c. То, что вы в настоящее время используете, это, по сути, глубина вначале жадный поиск , который, в зависимости от вывода LSTM, может быть даже оптимальным. Скажите, если LSTM дает вам гарантированное монотонное увеличение суммы, которая не сильно варьируется между приемлемыми последовательными словами (поскольку разница между N-1 и N последовательностью намного больше, чем разница между различными вариантами N-го слова) , В общем случае, когда нет четкого heuristi c, чтобы помочь вам, вам придется выполнить исчерпывающий поиск. Если вы можете придумать допустимую heuristi c, вы можете использовать A * вместо Dijkstra's алгоритм в первом варианте ниже, и он будет работать быстрее, тем лучше вы heuristi c is.

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

РЕДАКТИРОВАТЬ В соответствии с запросом в комментарии здесь дополнительные детали. Вот несколько вариантов:

  1. Применить алгоритм Дейкстры несколько раз. Поиск Дейкстры находит кратчайший путь между 2 известными узлами, в то время как в вашем случае у нас есть только начальный узел (последовательность 0 длины без слов), а последние слова неизвестны.

    • Найдите все приемлемые последние слова (те, которые удовлетворяют ограничениям на шаблон и гласные).
    • Примените поиск Дейкстры для каждого из них, найдя наибольшую весовую сумму последовательности слов для каждого из них.
    • Алгоритм Дейкстры адаптирован к поиску кратчайшего пути, поэтому, чтобы применить его напрямую, вам придется сбрасывать веса на каждом шаге и выбирать наименьший из тех, которые еще не посещались. .
    • Найдя все решения (предложения, заканчивающиеся одним из тех последних слов, которые вы определили изначально), выберите наименьшее решение (это будет как раз самая большая весовая сумма среди всех решений).
  2. Измените существующий поиск в глубину, чтобы выполнить исчерпывающий поиск.

    • Выполните операцию поиска, как описано в OP, и найдите решение, если последнее шаг дает единицу (если последнее слово с правильным гласным доступно вообще), запишите вес
    • Откат на Шаг к предыдущему слову и выберите второй лучший вариант среди предыдущих слов. Вы могли бы отказаться от всех слов одинаковой длины на предыдущем шаге, если решения не было вообще. Если было решение, это зависит от того, предоставляет ли ваш LSTM различные веса в зависимости от предыдущего слова. Вероятно, так и есть, и в этом случае вы должны выполнить эту операцию для всех слов на предыдущем шаге.
    • Когда у вас заканчиваются слова на предыдущем шаге, переместитесь на один шаг вверх и перезапустите оттуда.
    • Вы сохраняете текущего победителя все время, а также список не посещенных узлов. на каждом шагу и выполнять исчерпывающий поиск. В конце концов, вы найдете лучшее решение.
0 голосов
/ 12 апреля 2020

Я хотел бы получить Поиск луча здесь.

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

Придерживаясь текущего количества кандидатов 1000, это будет выглядеть так:

  1. Создание 1000 решений-заглушек, например, с использованием случайных начальных точек или выбранных из некоторой модели «начало предложения».
  2. Для каждого кандидата вычислите лучшие расширения на основе вашей языковой модели LSTM, которые соответствуют ограничениям. Это работает так же, как и в вашем текущем подходе, за исключением того, что вы также можете попробовать более одного варианта. Например, использование 5 лучших вариантов выбора для следующего слова приведет к получению 5000 дочерних кандидатов.
  3. Подсчитайте оценку для каждого из этих кандидатов с частичным решением, а затем уменьшите до 1000 кандидатов, сохранив только лучшие варианты оценки.
  4. Повторяйте шаги 2 и 3 до тех пор, пока все кандидаты не охватят всю последовательность гласных, включая ограничение конца.
  5. Возьмите лучший результат из этих 1000 решений.

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

...