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

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

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

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

Модель оценки рук

Целью этой модели является определение силы руки. Результатом работы этой модели является классификация типов покерных комбинаций, представленных целыми числами от 0 до 9. Эти классификации соответствуют следующим рукам в относительном порядке (ничего, одна пара, две пары, тройка, стрит, флеш, фулл-хаус, каре, стрит-флеш, флеш-рояль).

Входные данные функции этой модели показаны в таблице ниже на рисунке № 2.

Ранг представлен целыми числами от 0 до 13, где 0 означает отсутствие карты. Масть представлена ​​целыми числами от 0 до 4, где 0 означает отсутствие карты.

Этот набор входных данных не идеален для моей конкретной игры, потому что существует много разных типов покера. Я создаю этот ИИ для игры в техасский холдем, разновидность покера, где каждому игроку раздаются две личные карты, доступные только для их использования, а затем раздаются пять общих карт, которые могут использовать все игроки. Это означает, что в любой момент времени игроку доступны семь потенциальных карт (известных или неизвестных). Таким образом, обучение модели с использованием 5 карт создает проблемы с реализацией, которые могут вызвать дополнительную классификацию промахов. К сожалению, мне не удалось найти существующие наборы обучающих данных из семи карт, однако это можно обойти программно.

Для обучения и тестирования использовался Набор данных по покерным рукам Калифорнийского университета в Ирвине. Этот набор данных содержит 25 010 покерных рук, помеченных соответствующей силой руки.

Как вы можете видеть на рисунке №3, в этом наборе данных экспоненциально больше слабых рук, чем сильных рук, хотя это точно для статистической вероятности рук, это искусственно увеличивает точность модели, не обучая модель более сильным рукам. Это наиболее очевидно в моей попытке использовать нейронную сеть для классификации. Моя модель попытки нейронной сети показана на рисунке №4.

Нейронная сеть (глубокое обучение)

Эта модель дала точность 51% с данными тестирования. Учитывая, что это проблема числовой классификации, это ужасная производительность. Основываясь на данных, представленных на рисунке № 5, я считаю, что это связано с тем, что модель перетренирована с руками с низкой силой и недостаточно обучена с руками с высокой силой. Хотя я думаю, что это решаемая проблема путем уравнивания количества сильных и слабых рук, у меня нет доступных данных для этого. Поэтому, основываясь на том, что это проблема численной классификации с четкими признаками сигналов, я хотел попробовать и использовать классическую модель дерева решений, которую не так легко взвесить подавляющим числом рук с низкой силой.

Дерево решений (классическое машинное обучение)

После быстрого теста, в котором без особых настроек у меня была точность в 80%, я удваиваю ставку на более тщательное тестирование различных конфигураций Дерева решений. В частности, я проверил достоверность максимальных листовых узлов, параметров разделения, максимальной глубины и минимального количества выборок на разделение. Это включало 2800 отдельных конфигураций, самая сильная из которых обеспечивала точность 96,86%. Хотя в настоящее время я доволен этой точностью, требуется дополнительное тестирование связанных моделей на основе дерева, которые должны значительно повысить точность. К сожалению, ошибка, обнаруженная в этой модели, потенциально связана с ошибкой, обнаруженной в нейронной сети, как показано на рисунке № 6.

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

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

Модель игрового решения

Построение этой модели принесло с собой проблему, с которой сталкивался любой, кто занимался глубоким обучением, — нехватку наборов данных. Из-за финансовой ценности данных об играх в покер нам потребовалось много времени, чтобы найти какие-либо данные об играх, в которых участвовали профессиональные игроки с записанными руками всех игроков. Не зная всех раздач за столом, я не смог бы обучить эту модель так, как нужно, потому что у меня не было бы профиля функций для фолдов и блефов. В итоге я использую данные, полученные, когда Pluribus играл с профессиональными игроками. Pluribus — покерный бот, разработанный Facebook в сотрудничестве с Университетом Карнеги-Меллона. Хотя я хотел бы использовать данные без Pluribus в качестве места для сидения, я не смог их найти. Хотя это данные, которые я использовал для обучения на этом этапе, мои сценарии предварительной обработки используют журналы игр Poker Star (крупная компания, занимающаяся онлайн-турнирами в покере) в качестве входных данных. Это заслуга Kevin Wang, который написал скрипт преобразования, который преобразует необработанные игровые данные Pluribus в игровые журналы Poker Star.

Предварительная обработка

Приходилось проводить большую предварительную обработку, потому что мне нужно было настроить каждый ход как образец. Поэтому в каталоге «Game-Data-Preprocessing» есть скрипт, который считывает все файлы txt из своего «raw-data» и преобразует данные журнала игры в данные CSV, которые записываются в «data-out». Выходные данные включают в себя руку игрока, общие карты, процент от общего количества фишек игрока, процент фишек плательщиков, на которые они поставили, процент от общего количества фишек стола в банке, текущую стадию игры (0–4 повторяется каждый раз). типа раздаются общие карты.), ход, сделанный игроком (0–2, (фолд, колл, ставка)), результат (0 для плохого результата, 1 для положительного результата) и рейтинг руки игрока (созданный с помощью оценки руки). Модель).

Pluribus состоял из 9908 игр, в каждой из которых участвовало множество игроков. Из-за большого количества игр, которые необходимо было обработать для создания обучающих данных, были использованы данные только на 300 игр. Я планирую в будущем обработать все данные и обучить результат, но из-за ограничений по времени это пока невозможно. Было обработано 300 игр, в общей сложности было 2536 различных моментов принятия решений, каждый из которых был записан как образец в наборах обучающих данных.

Модель

Сама модель представляет собой простой последовательный дизайн, который можно увидеть на рисунке № 7 ниже.

Эта модель при обучении на полных 2571 (10% выборок, сохраненных для тестовых данных) выборок дала точность 68,11% с тестовыми данными. Со следующей классификацией, показанной на рисунке № 8.

Результирующие прогнозы снисходительны, но есть много испытаний и улучшений, которые необходимо реализовать. Некоторые области интереса увеличивают размер/разнообразие обучающих данных. Это должно быть легко сделать, учитывая время, необходимое для предварительной обработки всех наборов данных игровых журналов Pluribus. Обратите внимание, что, исходя из среднего количества ходов за игру из 300 обработанных (8,57 за игру), их должно быть более 84 000 выборок для обучения. Другим потенциальным улучшением будет переход от использования целочисленного значения 0–9 для представления силы руки к использованию соответствующего процентного шанса получить эту силу. Это должно дать более дифференцированный ввод в модель принятия решений, что приведет к более точному представлению возрастающей силы каждого шага в силе рук.

Если вы хотите построить этот проект, код и инструкции по запуску каждого скрипта находятся на Github.