Рубрики
Без рубрики

Цепочки Маркова: обучение ИИ писать игру престолов

Цепочки Маркова уже некоторое время, и они здесь, чтобы остаться. От прогнозных клавиатур … Tagged с помощью машинного обучения, цепи Маркова, NLP, Python.

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

Вот некоторые приложения для отраслевых цепей марковских цепей:

  • Генерация текста (вы здесь для этого).
  • Финансовое моделирование и прогнозирование (включая торговые алгоритмы).
  • Логистика: моделирование будущих поставки или поездок.
  • Поисковые системы: PageRank может рассматриваться как моделирование случайного интернет -серфера с цепочкой Маркова.

До сих пор мы можем сказать, что этот алгоритм полезен, но что именно такое цепочки Марков?

Что такое цепочки Маркова?

Цепочка Маркова – это Стохастический процесс что моделирует конечный набор состояний , с фиксированным Условные вероятности прыжков от данного состояния до другого.

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

Чтобы показать, как выглядит цепочка Маркова, мы можем использовать Digraph , где каждый узел является состоянием (с меткой или связанными данными), и вес края, который идет от узла A Узел b это Вероятность прыжка из штата _ A _ Утвердить _ b _.

Вот пример, моделируя погоду как цепочку Маркова.

Источник

Мы можем выразить вероятность перехода из состояния A Утвердить b как Матричный компонент , где все Матрица характеризует нашу цепь Маркова процесс, соответствующий Матрица смежности Диграфа Анкет

Источник

Затем, если мы представляем текущее состояние в качестве однопольного кодирования, мы сможем получить условные вероятности для значений следующего состояния, взяв текущее состояние и, посмотрев на соответствующую строку.

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

Цепочки Маркова для генерации текста

Чтобы сгенерировать текст с цепочками Маркова, нам нужно определить несколько вещей:

  • Какими будут наши штаты?
  • Какие вероятности мы будем назначать перепрыгнуть из каждого состояния в другое?

Мы могли бы сделать модель на основе персонажа для генерации текста, где мы определяем наше состояние как последнее n Персонажи, которых мы видели, и попытаться предсказать следующую.

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

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

Для этого я просто создам вектор для каждой отдельной последовательности k Слова, имеющие n компонентов, где n – это общее количество различных слов в моем корпусе.

Затем я добавлю 1 в J -Т -компонент я -Т -вектор, где я является индексом i -т K-последовательность слов и J это индекс следующего слова.

Если я нормализую каждый вектор слов, у меня будет распределение вероятностей для следующего слова, учитывая предыдущее k токены.

Сбивает с толку? Давайте посмотрим пример с небольшим корпусом.

Обучение нашей сети: игрушечный пример.

Давайте представим, что мой корпус – это следующее предложение.

Это предложение имеет пять слов

Сначала мы выберем k : Количество слов наша цепь рассмотрит Перед отбором выборки/ Прогнозирование следующего один. Для этого примера давайте использовать.

Теперь, сколько отдельных последовательностей из 1 слов имеет у нашего предложения? Он имеет 5, по одному для каждого слова. Если бы у него были дублированные слова, они бы не добавили к этому номеру.

Сначала мы инициализируем матрицу 5 × 5 нулей.

После этого мы добавим 1 в столбец, соответствующий «предложению» в строке для «этого». Затем еще 1 в строке для «предложения», в столбце для «есть». Мы продолжим этот процесс, пока не пройдем через все предложение.

Это была бы полученная матрица:

Диагональная картина происходит от упорядочения слов.

Поскольку каждое слово появляется только один раз, эта модель просто генерирует одно и то же предложение снова и снова, но вы можете увидеть, как добавление больше слов может сделать это интересным.

Я надеюсь, что сейчас все становится яснее. Давайте перейдем к какому -то коду!

Кодирование нашей цепи Маркова в Python

Теперь для забавной части! Мы будем тренировать цепь Маркова на всю песню льда и огненного корпуса (ха! Вы думали, что я собираюсь ссылаться на шоу? Жаль, я книжный парень!).

Затем мы будем генерировать предложения с различными значениями для k Анкет

Для этого эксперимента я решил относиться к чему -либо между двумя пространствами как слово или токен Анкет

Традиционно, в НЛП мы рассматриваем знаки препинания (например, ‘,’ или ‘.’) Как токены. Чтобы решить это, я сначала добавлю заполнение в виде двух пространств в каждую отметку пунктуации.

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

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

У нас более 2 миллионов токенов, представляющих более 32000 различных слов! Это довольно большой корпус для одного писателя.

Если бы только он мог добавить еще на 800 тысяч …

Обучение нашей цепочки

Двигаясь дальше, вот как мы инициализируем нашу «Слово после K-последовательности» подсчитывает матрицу для произвольной k (В этом случае 2).

В корпусе есть 2185918 слов и 429582 различных последовательностей из 2 слов, каждый из которых следует одним из 32663 слов.

Это означает, что лишь чуть более 0,015% компонентов нашей матрицы будет ненулевым.

Из -за этого я использовал Scipy’s dok_matrix ( dok означает словарь клавиш), реализация разреженной матрицы, поскольку мы знаем, что этот набор данных будет чрезвычайно разреженным.

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

Вот код для этого:

Есть две вещи, которые, возможно, привлекли ваше внимание здесь. Первый – это альфа Гиперпараметр.

Это наша цепь Творчество : (обычно небольшая или нулевая) шанс, что оно выберет совершенно случайное слово вместо того, что предлагается корпусом.

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

Для всех примеров, которые я покажу, я использовал альфа значение 0.

Во -вторых, это функция Weesed_choice. Мне пришлось реализовать его, так как случайный пакет Python не поддерживает взвешенный выбор над списком с более чем 32 элементами, не говоря уже о 32000.

Результаты: сгенерированные предложения

Прежде всего, как базовая линия, я попробовал детерминированный подход: что произойдет, если мы выберем слово, используем и всегда перейдем к наиболее вероятному слову после текущего?

Результаты не в восторге, если не сказать больше.

**I** am not have been a man , and the Wall . " " " " 
**he** was a man , and the Wall . " " " " " " " 
**she** had been a man , and the Wall . " " " " " "

Поскольку мы детерминистичны, «А» всегда сопровождается «человеком», «всегда сопровождается« стеной »(хе -хе) и так далее.

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

Теперь для какого -то фактического поколения я попытался использовать стохастическую цепь Маркова из 1 слова и значение 0 для альфа.

Результаты цепи марковки с 1 словом

Вот некоторые из полученных предложений из 15 слов, с семенным словом жирными буквами.

' **the** Seven in front of whitefish in a huge blazes burning flesh . I had been' ' 
**a** squire , slain , they thought . " He bathed in his head . The' ' 
**Bran** said Melisandre had been in fear I've done . " It must needs you will' ' 
**Melisandre** would have feared he'd squired for something else I put his place of Ser Meryn' ' 
**Daenerys** is dead cat - TOOTH , AT THE GREAT , Asha , which fills our' ' 
**Daenerys** Targaryen after Melara had worn rich grey sheep to encircle Stannis . " The deep'

Как вы можете видеть, полученные предложения довольно бессмысленные, хотя и намного интереснее, чем предыдущие.

Каждая отдельная пара слов имеет какой-то смысл, но вся последовательность-чистая не-последовательность.

Модель действительно изучила некоторые интересные вещи, например, как Дейенерис обычно сопровождается Таргариен, и «боялся», – это довольно хорошая конструкция только для знания предыдущего слова.

Однако, в целом, я бы сказал, что это далеко не так хорошо, насколько это возможно.

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

Результаты с цепями марковки с двумя словами

Сеть из двух слов выпустила еще несколько интересных предложений.

Несмотря на то, что он также обычно заканчивается совершенно случайным, большая часть его вывода может на самом деле немного обмануть вас в начале (акцент мой) Анкет

' **the world**. _And Ramsay loved the feel of grass_ _welcomed them warmly_ , the axehead flew'' 
**Jon Snow**. _You are to strike at him_ . _The bold ones have had no sense_'' 
**Eddard Stark** had done his best to give her _the promise was broken_ . By tradition the'' 
**The game** of thrones , so you must tell her the next buyer who comes running ,'' 
**The game** trail brought her messages , strange spices . _The Frey stronghold was not large enough_'' 
**heard the** scream of fear . I want to undress properly . Shae was there , fettered'

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

Любое чувство синтаксиса, грамматики или семантики явно отсутствует.

Кстати, я вообще не выбрасывал эти предложения, это первые выходы, которые я пробовал.

Не стесняйтесь Играйте с кодом самостоятельно и вы можете поделиться самыми странными предложениями, которые вы получаете в комментариях!

В качестве последнего эксперимента давайте посмотрим, что мы получаем с цепью Маркова из 3 слов.

Результаты цепи с 3 словами

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

' **I am a** master armorer , lords of Westeros , sawing out each bay and peninsula until the'' 
**Jon Snow is** with the Night's Watch . I did not survive a broken hip , a leathern'' 
**Jon Snow is** with the Hound in the woods . He won't do it . " Please don't'' 
**Where are the** chains , and the Knight of Flowers to treat with you , Imp . "'' 
**Those were the** same . Arianne demurred . " So the fishwives say , " It was Tyrion's'' 
**He thought that** would be good or bad for their escape . If they can truly give us'' 
**I thought that** she was like to remember a young crow he'd met briefly years before . "'

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

Вывод

Реализация цепочки Маркова намного проще, чем может показаться, и обучение ее на реальном корпусе было весело.

Результаты были откровенно лучше, чем я ожидал, хотя я мог установить планку слишком низким после моего маленького фиаско LSTM.

В будущем я могу попробовать обучить эту модель еще более длинными цепями или совершенно другим корпусом.

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

Как вы думаете, какой корпус принесет более интересные результаты, особенно для более длинной цепочки? Дай мне знать в комментариях!

Если вы хотите узнать еще больше о цепях Маркова, рассмотрите возможность проверки Эта углубленная книга Анкет Это партнерская ссылка, что означает, что я получаю небольшую комиссию от нее .

Оригинал: “https://dev.to/strikingloo/markov-chains-training-ai-to-write-game-of-thrones-25d6”