Регистрация и участие в Sberbank Holdem Challenge были бесплатными, к соревнованию допускались все граждане РФ старше 18 лет, кроме аффилированных лиц Сбербанка, включая сотрудников дочерних компаний. Каждому участнику было необходимо написать бота, который сможет «принимать оптимальные решения в условиях неопределённости и смоделировать поведение других игроков».

На онлайн-этапе хакатона участники представили более 3.5 тысяч ботов, среди которых было проведено более 50 тысяч турниров. В очном финале, который прошел 23-24 сентября в кампусе Корпоративного университета Сбербанка, встретились 38 команд, в общей сложности более 90 участников. Каждый час в течение двух дней боты соревновались друг с другом, а разработчики дорабатывали свои алгоритмы. По итогам финального турнира были определены три команды-победителя, которые получили 300, 200 и 100 тысяч рублей соответственно.

Команда Simple Poker заняла 3-е место, и мы рады представить ее обзор соревнования.

О Simple Poker

Команда Simple Poker образовалась в результате знакомства нескольких студентов Высшей школы Экономики с факультета программной инженерии и бизнес-информатики, объединённых одним стремлением – заниматься перспективными IT-технологиями и разрабатывать продвинутые IT-решения.

Покерным софтом мы занимаемся довольно давно, наш первый продукт, а именно Simple Nash, был опубликован более 5 лет назад – программа для расчёта равновесия Нэша при стратегии игры пуш/фолд. Программа многофункциональна и является бесплатной, что немаловажно для многих пользователей. Мы продолжили наше развитие и выпустили новый продукт Simple Postflop (программа для расчёта оптимальных стратегий на префлопе и постфлопе для банков с двумя игроками), который набрал очень большую популярность среди профессиональных игроков покер – эту программу мы развиваем и по сей день, вы можете приобрести ее в магазине GipsyTeam.

Сейчас мы разрабатываем 3 новых программы, которые на стадии beta доступны бесплатно:

– Simple 3-way – программа для расчёта равновесных стратегий в банках с тремя игроками;
– Simple Omaha – программа для расчета равновесных стратегий в омахе;
– Simple GTO Trainer – программа для обучения GTO-стратегиям, которая включает в себя несколько режимов.

Мы не планируем останавливаться на достигнутом и продолжаем работу над другими продуктами.

Битвы машины и человека набирают популярность с конца 90-х годов. Все помнят такие знаменитые поединки, как шахматные партии Каспарова и IBM Deep Blue, недавнее сражение AlphaGo против Кэ Цзе и Libratus против группы профессиональных игроков.

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

По словам организаторов, Сбербанк хотел выдать свой «ответ Чемберлену» и начать не с чего-нибудь, а сразу с Texas Holdem 9-max. «Достаточно амбициозный план», – саркастически отметили мы и зарегистрировались на это мероприятие.

Зачем нам это? Уж точно не ради приза. Все очень просто. Нам нравится заниматься разработкой ПО, задачами Machine Learning и Data Mining. Особенно приятно, когда предметная область довольно хорошо тебе знакома. Хакатоны – это особый способ убийства организма. Ты не спишь 40 часов, красными глазами пытаясь найти ошибку в далеком от совершенства коде. Red Bull и кофе перестают спасать. Иногда после такого марафона приходится выступать с так называемым питчем, пытаясь рассказать менторам о полезности продукта, состряпанного на коленке. Подобный опыт имеется у нас с запасом. Иногда мы даже побеждали.

2014 год, победа на Mail.ru SNA Hackathon Проект Prediction of User Churn

Но история не об этом. Хакатон Сбербанка проходил в 2 этапа: онлайн и офлайн. Отборочный онлайн-этап был индивидуальным и должен был выявить 100 финалистов. На офлайн-этапе финалисты разбивались на команды от 1 до 10 человек и снова решали абсолютно ту же задачу.

Задача

Офлайн-этап состоял из двух частей:

1. Непрерывная игра между ботами команд, в рамках которой тестировалась сила бота относительно остальных.
2. Финальный турнир.

Битвы между ботами проводились сериями по 10 игр между 9 случайно выбранными соперниками.

Условия игры для ботов в Sberbank Holdem Challenge

– Максимальное количество играемых раздач в 1 игре (турнире) – 50
– Стартовый стек ботов – 1,500 фишек
– Блайнды – 15/30, по ходу турнира не растут
– Время на ход в раздаче – 0.2 секунды
– Общее время, отведенное боту на серию из 10 турниров (до 500 раздач) – 300 секунд
– Размер отправляемого архива с ботом не должен превышать 1 ГБ
– Расходы по оперативной памяти бота не должны превышать 2 ГБ

Финальный турнир также состоял из двух этапов: отбор 9 лучших ботов и гранд-финал среди них.

В первой части финального этапа все последние версии ботов в течение часа играли серии игр между собой. 9 ботов с максимальным значением «среднего числа фишек», оставшегося к концу игры по итогам всех игр первой части, перешли в гранд-финал. Между отобранными 9 ботами прошла финальная битва, в ходе которой были выявлены 3 лучших бота – по тому же критерию «среднего числа оставшихся фишек».

С полными правилами проведения онлайн- и офлайн-этапов мероприятия вы можете ознакомиться здесь: https://github.com/sberbank-ai/holdem-challenge/blob/master/RULES.md

Кто участвовал

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

Ближе к окончанию онлайн-этапа подтянулись профессиональные участники хакатонов и специалисты по ML (Machine Learning). Некоторых ребят добирали вне конкурса, но попасть в призы им не удалось. Можно сделать натянутый вывод о том, что в покере на данном этапе экспертные знания и понимание предметной области играют более весомую роль, чем серьезная техническая подготовка и опыт работы с ИИ.

Онлайн-этап и «особый» холдем

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

Организаторы выложили двух baseline-ботов (С++ и Python). И, о чудо, для того, чтобы попасть в топ-50, достаточно было даже сделать сабмит этого baseline-бота на C++. Его логика была довольно простой – бот ставил олл-ин, если его эквити было больше 60% против 3,000 рандомных рук оппонента. Логика Python бота не отличалась, но эквити он считал в разы медленнее, не укладываясь в отведенное время на ход.

Baseline-бот, сабмит которого позволял пройти офлайн-этап

Такой большой перебор мы связываем с недочетами PyPokerEngine, с помощью которого проходило тестирование (HM считал EV по одним правилам, а движок использовал другие):

– Не учитывался стрит от туза.
– При равных комбинациях движок учитывал шестую и седьмую карты для определения победителя.

К окончанию онлайн-этапа большинство недочетов были устранены. Texas Holdem стал похож на себя. Реализовав не самое замысловатое решение, мы с набором диапазонов и правил прошли во второй этап.

Офлайн-этап

Офлайн-этап проходил в Корпоративном университете Сбербанка в Подмосковье. Здесь стоить сказать спасибо организаторам. «Сбер» смог не только выделить помещение под кодинг, но и разместить 100+ человек в неплохих гостиничных номерах. Думаю, многие студенты, приехавшие на мероприятие, мечтают о подобном в своих общежитиях. Большинство подобных соревнований не предусматривают того, что человек нуждается в отдыхе. Приходится спать на пуфиках, диванах в переговорных или просто на полу.

Сам комплекс просторный. Со множеством мест, где можно поработать и отдохнуть. Были доступны тренажерный зал и бассейн, который мы посетить не успели. Завтрак, обед, ужин + кофе-брейки включены. В целом, очень неплохо. Надеюсь, Сбербанк сможет и во фронт-офисах поднять уровень и отладить процессы так же, как в Корпоративном университете.

Хронология событий

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

Результат и выводы

После первого командного этапа наш бот занял 3-е место. Не попасть в топ-9 было бы для нас полным позором.

Общий командный этап

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

Финальные турниры 9 лучших ботов

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

Результат турниров с участием людей

Наши выводы:

1) в условиях нехватки времени стоит сконцентрировать силы на более простых решениях, сфокусироваться на их конфигурировании и доработках;

2) всегда стоит использовать систему контроля версий для быстрого отката состояния и трассировки изменений;

3) необходимо как можно быстрее проходить цикл: development – deployment – analysis – evaluation;

4) важно четко разделять роли и назначать ответственных.

Обзор 3 лучших решений

Первое место занял Дмитрий (fcll). Его решение было основано на системе правил в зависимости от позиции и ситуации на столе. Бот играл достаточно агрессивно. Эта стратегия была выбрана верно с учетом большого числа ботов, играющих очень тайтово, и наличия откровенно слабых ботов.

Игровая статистика финальной версии бота fcll (719 турниров)

На бота, занявшего второе место, также стоит обратить внимание. Его автор Евгений сумел обучить бота на логах лидера, используя CatBoost. Это очень классный подход, который на удивление хорошо сработал. Им получилось воспользоваться, потому что у каждого участника был доступ к логам всех игр с открытыми картами, и ботами отыгрывалось большое количество рук, на которых можно было реализовать обучение. Решение доступно на GitHub, так что с ним можно ознакомиться. Фактически бот Евгения изучал стратегию лидера и пытался её повторять, что у него получилось довольно неплохо.

Игровая статистика финальной версии бота RandomBot (934 турнира)

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

Игровая статистика финальной версии бота simplepoker (822 турнира)

Лог сыгранных раздач в формате движка, на котором проводилось соревнование, можно скачать тут: https://drive.google.com/open?id=0B7WVjmSt-QObajVWSnQzZ0RhY2s

Мы на коленке написали конвертер логов в формат, пригодный для HM’а. Сконвертированные раздачи офлайн-этапа можно скачать тут: https://yadi.sk/d/kJfa-TjF3NLC2f

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

Чего не хватило на хакатоне

В первую очередь, не хватило менторов/наставников. Их не было как со стороны покера, так и со стороны ML. Хакатоны – не только соревнования, но и возможность узнать что-то новое. Апробировать методы, средства, технологии. Услышать критику от опытных гуру. Профессиональные игроки в покер также могли бы дать интересный фидбек участникам и поделиться своим опытом, рассказать о стратегиях игры.

Во-вторых, не хватило вычислительных мощностей. На офлайн-этапе на весь тестовый контур было выделено 32GB оперативной памяти на всех участников! Размер загружаемого решения ограничивался 1GB. Поэтому мысли о расчете и использовании рассчитанных GTO стратегий в HU и 3-max спотах отпали сами собой.

Зачем покер Сбербанку и что будет дальше

Инициатором проведения хакатона выступил Департамент рисков Сбербанка. Организаторы считают, что решение покера и разработка систем, работающих в условиях меняющейся среды, может найти применение в бизнес-задачах. К таким задачам представители банка относят ценообразование, управление риск-доходностью, стратегии продвижения продуктов, кредитные стратегии и другие.

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

Команда проекта simplepoker.com Роман, Александр, Михаил, Роман