Если вы когда-нибудь спросите инженера по машинному обучению, как вы будете генерировать текст или строить прогнозную модель, наиболее очевидным ответом будут рекуррентные нейронные сети (RNN), которые слишком специфичны для длительной краткосрочной памяти (LSTM). Традиционные модели более просты и работают лучше по сравнению с моделями глубокого обучения в некоторых случаях ¹. Это то, что мы исследуем в этой статье. Мы узнаем, как использовать модель Маркова для предсказания слов.

Марковская модель

Давайте разберемся, что такое марковская модель, прежде чем погрузиться в нее. Проще говоря, марковская модель - это модель, которая подчиняется марковскому свойству.

Итак, что такое марковское свойство? Говорят, что в процессе, в котором следующее состояние зависит только от текущего состояния, такой процесс следует марковскому свойству. Например, предположим, что завтрашняя погода зависит только от сегодняшней погоды или сегодняшняя цена акций зависит только от вчерашней цены акций, тогда такие процессы, как говорят, проявляют марковские свойства. С математической точки зрения, условное распределение вероятностей следующего состояния зависит от текущего состояния, а не от прошлых состояний. То есть s (t) зависит только от s (t-1), где s (t) - это состояние в момент времени т. Это то, что называется марковской моделью первого порядка.

В общем, если текущее состояние системы зависит от n предыдущих состояний, то это называется марковской моделью n -го порядка.

Последовательность событий, которые следуют модели Маркова, называется цепью Маркова.

Предсказание следующего слова

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

Подожди, а как ты это делаешь? Введите распределение вероятностей. Давайте разберемся в этом лучше на простом примере. Рассмотрим три простых предложения -

  • Мне нравится фотография.
  • Мне нравится наука.
  • Я люблю математику.

Все уникальные слова из приведенных выше предложений, такие как «я», «нравится», «любовь», «фотография», «наука» и «математика», могут образовывать разные состояния. Распределение вероятностей - это определение вероятности перехода из одного состояния в другое, в нашем случае это от одного слова к другому. В нашем сценарии из приведенных выше примеров ясно, что первое слово всегда начинается со слова «Я». Таким образом, есть 100% вероятность, что первым словом предложения будет «Я». Для второго состояния мы должны выбирать между словами «нравится» и «любовь». Распределение вероятностей теперь сводится к определению вероятности того, что следующим словом будет «нравится» или «люблю», учитывая, что предыдущее слово - «я». В нашем примере мы видим, что слово «нравится» появляется в 2 из 3 предложений после «я», тогда как слово «любовь» встречается только один раз. Следовательно, существует примерно 67% (2/3) вероятности того, что «подобное» будет успешным после «Я», и 33% (1/3) вероятности для «любви». Точно так же у «науки» и «фруктов» есть 50–50 шансов на успех «подобным». И в нашем случае за «любовью» всегда будет «математика».

Математическое представление вышеуказанной работы в виде условных вероятностей -

P(like | I) = 0.67
P(love | I) = 0.33
P(fruits | like) = P(Science | like) = 0.5
P(Mathematics | love) = 1

Вот как мы строим распределение вероятностей на основе выборочных данных.

Создание песни в стиле Эминема

А теперь давайте построим что-нибудь большое. Мы обучим модель Маркова на кучу текстов песен Эминема, а затем попытаемся сгенерировать новые тексты песен из этой модели. Типичный случай цепи Маркова. Весь код и данные для этого поста можно найти на Github.

Для нового поколения песен мы будем использовать модель Маркова 2-го порядка. Сначала нам нужно очистить данные, а затем обучить марковскую модель на очищенных данных.

Обучение модели Маркова можно разделить на следующие этапы -

  1. Токенизация
  2. Построение государственных пар
  3. Определение распределения вероятностей

Давайте разберемся в процедуре с помощью простого предложения -

Быстрая коричневая лиса прыгает через ленивую собаку.

Сначала нам нужно провести токенизацию. Токенизация - это не что иное, как разбиение предложения на слова.

Второй этап состоит в формировании пары предыдущего и текущего состояний. Поскольку мы строим марковскую модель 2-го порядка, наше предыдущее состояние будет состоять из двух слов. Для нашего примера предложения пары будут примерно такими:

(the, quick) --> brown
(quick, brown) --> fox
(brown, fox) --> jumps ...

Кроме того, мы должны рассмотреть два необычных случая. А именно первое слово и второе слово. У них обоих не будет двух предыдущих слов. Итак, мы должны относиться к ним по-другому. Для первого слова мы просто вычислим распределение начального состояния. А второе слово мы будем рассматривать как марковскую модель 1-го порядка, поскольку оно содержит одно предыдущее слово. Наконец, в конце предложения мы добавим дополнительный идентификационный токен «КОНЕЦ» и сформируем пары, например

(lazy, dog) --> END

После того, как мы сформировали пары состояний, на этапе 3 все, что нам нужно сделать, это выполнить простые подсчеты и вычислить вероятность следующих состояний, возможных для данного текущего состояния, как и раньше. Например, за словом «the» могут следовать слова «быстрый» или «ленивый». Нам нужно построить распределение вероятностей следующим образом -

the --> [quick, lazy]
{quick: 1/2, lazy: 1/2}

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

Тада! Вот и все. Теперь мы готовы протестировать наш генератор песен. Один из примеров текстов, созданных нашей марковской моделью -

and i should not be a king when you feel em
while he play piano
you better lose yourself and make her fall on her
and its absurd how people hang on every word
off a plank and
look i was but im
teeter totter caught up between being a father and a primadonna
at least once in a while
now who thinks their arms are long enough to one day grow up
but for me to try to get em motivated

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

Заключение

Как мы можем заметить, марковские модели действительно дают неплохие результаты. Следовательно, нельзя полностью списывать со счетов марковские модели. Желательно попробовать модели Маркова, прежде чем переходить к более сложным моделям, таким как LSTM. Было бы гораздо интереснее посмотреть, как будет сочетаться марковские модели и LSTM вместе.

Удачного знакомства!

Использованная литература:

  1. М. Панзнер и П. Чимиано, Сравнение скрытых марковских моделей и нейронных сетей с долговременной краткосрочной памятью для обучающих представлений действий (ссылка)
  2. Неконтролируемое машинное обучение: скрытые марковские модели в Python от ленивого программиста (ссылка)
  3. Визуальное объяснение цепей Маркова Виктора Пауэлла и Льюиса Лехе (ссылка)

Разработано в Innovation Labs @ Y Media