За последние несколько лет глубокое обучение зарекомендовало себя как многообещающий подход к самым разным проблемам искусственного интеллекта. Возможно, это станет важным шагом к созданию ИИ вообще. При глубоком обучении создаётся отдельная система, способная решать целый комплекс задач, используя один и тот же «мозг» – или компьютерную программу с минимальными изменениями.
Вы уже сталкивались с глубоким обучением – именно этот подход используют Google и Facebook для подбора тегов к вашим фотографиям. В рамках проекта DeepMind (принадлежит Google) людям удалось научить искусственный интеллект играть в некоторые компьютерные игры 80-х, написанные для Atari. Компьютер совершенствовал своё мастерство, работая непосредственно с экраном и симулятором консоли. Сначала он учился играть, потом – играть хорошо, а под конец натренировался действовать практически безошибочно.
Несколько месяцев тому назад я решил применить похожий подход к покеру. Мы знаем, что различные варианты покера требуют различного набора знаний. Даже между игрой на коротких и полных столах разница получается довольно существенная. Однако у всех разновидностей покера есть что-то общее, и мы не раз сталкивались с тем, как хорошие игроки выигрывали браслеты WSOP в тех играх, в которых практически не имели опыта. Бертран Гроспелье в 2011 году стал чемпионом мира по стаду хай с бай-ином $10,000, впервые в жизни сыграв в турнире в эту игру. Питер Джеттен, ранее лишь изредка игравший в китайский покер на миролимитах, выиграл представительный турнир по OFC на Багамах. Кристиан Фам по ошибке зарегистрировался в турнир по безлимитному 2-7 сингл-дро за $1,500 и выиграл его на Мировой серии-2015.
Если один и тот же ИИ может пройти две разные компьютерные игры, может быть, я смогу создать «бота микс-игр»? И вот, через несколько месяцев мучений у меня появился ИИ, играющий... хэдз-ап 2-7 трипл-дро.
Почему трипл-дро? Во-первых, это отличная игра, популярная на высоких лимитах в онлайне и офлайне, где она уступает только холдему и омахе. В этой игре много экшена, и её одинаково любят и лузовые игроки, и ниты.
Правила очень просты – вам сдают пять закрытых от соперников карт, общих карт нет. Цель – за три обмена собрать слабейшую руку, без пар, стритов или флешей. Туз – сильнейшая карта, поэтому лучшей возможной рукой, которую также называют «колесо», будет 7x 5x 4x 3x 2x .
Это также идеальный пример игры в «европейском стиле», в которой игрок, находящийся позади (меняющий больше карт), имеет лучшие шансы усилить свою руку. Грубо говоря, за исключением случая, когда у одного из игроков готовая семёрка или восьмёрка (что случается достаточно редко), невозможно быть далеко позади. При наличии гладкого дро вы практически никогда не тянете вмёртвую и чаще всего можете коллировать по шансам.
Так как готовая рука является фаворитом против практически любого дро, иногда полезно блефовать с плохой рукой, не меняя карт и пытаясь выбить соперника ставками. Довольно часто оппонент не сможет собрать руку и выбросит на ривере. Но тот, кто блефует слишком часто или не в тех ситуациях, жертвует своими шансами собрать хорошую руку при обмене.
В хэдз-апе следует играть большинство рук за одну ставку и довольно часто доходить по последнего обмена. Для вэлью играются хорошие готовые руки и сильные дро. Но нельзя фолдить пограничные руки слишком часто, иначе вас уничтожит соперник, способный много блефовать.
Хэдз-ап идеален для тренировки ИИ. Компьютер может играть против самого себя и совершенствовать свою игру, исходя из результатов сыгранных ранее раздач. В программировании этот метод называется бутстрэпинг (bootstrapping); аналогия – барон Мюнхаузен, способный сам себя вытащить из трясины.
При правильном подходе компьютер способен научиться играть на достаточно высоком уровне, постоянно играя сам с собой, обучаясь на основе полученного опыта и играя снова и снова. Если учёные в DeepMind научили машину играть в 50 игр для Atari, освоить 2-7 не должно быть намного сложнее: сколько карт менять, когда играть чек-рэйз, когда блефовать... В конце концов, решение в лимитном покере – это всего лишь выбор одной кнопки из двух или трёх возможных, что с точки зрения механики проще любой компьютерной игры.
ИИ в работе: раздача 2-7 трипл-дро
Давайте изучим одну из раздач, сыгранную при глубоком обучении двумя версиями ИИ. На баттоне Poker-CNN-7, на большом блайнде – Poker-CNN-76. Кстати, CNN переводится как свёрточная нейронная сеть (convolutional neural network) и не имеет отношения к новостному каналу. Ни один диктор при создании бота не пострадал.
Итак, Poker-CNN-7 находится на малом блайнде и обнаруживает у себя
8h 9c Qd Ad 3s (3, True, 150.0, '', 0, 0, '')
У него трёхкарточное дро к восьмёрке или двухкарточное дро к 9-8. У него позиция; это хорошо. ИИ принимает решение, сравнивая ожидание каждого действия. CNN-7 может заколлировать, сделать рэйз или сфолдить. В банке $150 (ИИ всегда играет на ставках $100/$200 с блайндами $50/$100), блайнды являются мёртвыми деньгами. Ожидание фолда равно нулю.
bet: невозможен
raise: $60
check: невозможен
call: $67
fold: $0.0
По мнению ИИ, на дистанции ожидание (точнее, доля банка) после лимпа или рэйза с этой рукой лежит в районе $60. Учитывая, что Poker-CNN-7 находится на баттоне, рука явно не лучшая. Однако фолд с ней будет серьёзной ошибкой.
ИИ также указывает вероятность, с которой он будет принимать то или иное решение. Теоретически оптимальная (GTO) игра требует от него балансировать диапазоны и не всегда выбирать лучшее по ожиданию решение с конкретной рукой.
В данной ситуации ИИ будет выбирать рэйз с частотой 4%, колл – в 93%, фолд – в 3% случаев. Но в нашем случае сыграли 4%, и Poker-CNN-7 сделал рэйз.
Его коллега на большом блайнде Poker-CNN-76 анализирует положение со следующей рукой:
5c 3h Kd Th Ks (3, False, 300.0, '1', 0, 0, '1')
raise: -$118 (0%)
call: -$32 (74%)
fold: $0.0 (26%)
В руках CNN-76 трёхкарточное дро с 5-3. Не так уж плохо. Но на всех улицах он будет без позиции, и у него нет ни двойки, не семёрки, ни восьмёрки. Однако в банке $300 мёртвых денег. Это пограничное решение против любого игрока, не открывающего с баттона 100% рук.
Как мы видим, ИИ считает фолд сильнейшим решением, но 100% фолдов с этой и другими похожими руками сделает стратегию авторэйза с баттона слишком выгодной, поэтому ИИ рекомендует коллировать в 3/4 случаев и фолдить в остальных. CNN-76 коллирует и переходит к первому обмену.
Его выбор очевиден – он оставляет 5c 3h и меняет три карты. А вот его соперник оказывается перед весьма интересным выбором.
Poker-CNN-7
8h 9c Qd Ad 3s (3, True, 400.0, '10', 0, 2, '10')
‘pat': $311
‘draw_2': $222
‘draw_3': $201
ИИ прав в том, что это хорошая ситуация блефовать, не меняя карт. Против оппонента, который заколлировал рэйз предро и поменял три карты, нам выгодно продемонстрировать готовую руку, так как часто он не усилится и выкинет карты после первого или второго обмена.
Этот блеф, конечно, очень хорош в вакууме – в том случае, если бы CNN-7 и CNN-76 играли между собой только одну раздачу. Однако на дистанции оппонент быстро подстроится к слишком частым блефам и начнёт коллировать со слабыми дро. В то же время частые блефы со стороны игрока на баттоне лишают его возможности усилиться при обмене.
До тех пор, пока ИИ не наберёт достаточного опыта для определения оптимальной частоты блефа, я позволяю ему блефовать на первом обмене не чаще 33% случаев. Этот случай в 33% не вошёл.
Интересно, что ИИ предпочитает менять две карты, оставляя 9c8h3s, а не три, оставляя 8h3s. С учётом уже произошедшего экшена, ожидание обоих действий чуть больше половины банка, который составляет $400.
Я показал эту раздачу Ювалу Бронштейну, который специализируется в микс-играх, и он согласился с тем, что менять три карты не лучше. Лично я в этом не уверен. 9-8 – это средняя выигрывающая комбинация на вскрытии, так что дро у нас не очень хорошее. Правда, и Реп Портер, обладатель двух браслетов WSOP (и финалист чемпионата по 2-7 TD на WSOP-2015) считает, что обмен меньшего количества карт, чем у соперника, даёт нам дополнительное преимущество: соперник чаще будет чекать после обмена и чаще фолдить без усиления. Помните, что для игрока, меняющего три карты, все двухкарточные дро оппонента выглядят одинаково, будь то 9-8-3 или 7-3-2.
Как бы то ни было, в рассматриваемой раздаче ИИ оставил 9x 8x 3x и поменял две карты.
После первого обмена Poker-CNN-76 получил три хорошие карты.
Poker-CNN-76
5c 3h 9d 7s 4c (2, False, 400.0, '', 2, 3, '10')
bet: $337 (73.4%)
check: $313 (26.6%)
По мнению Бронштейна, это простой чек-рэйз. Я же склонен согласиться с ИИ. Баттон чаще поставит после нашего чека, но не всегда. Как мы видим, обмен двух карт не всегда означает сильную руку, а наши 9-7 теряют много вэлью при ответном чеке.
CNN-76 оценивает силу своей руки как $330 в банке $400, учитывая и действия на следующих улицах. Колесо стоило бы здесь $600 или больше. CNN-76 подбрасывает монетку и делает ставку.
Poker-CNN-7
8h 9c 3s 2d 8c (2, True, 500.0, '1', 3, 2, '101')
raise: $281 (4.8%)
call: $289 (95.2%)
fold: $0 (0%)
Poker-CNN-7 поменял две карты и усилился. Свою руку он оценивает как $280 от банка $500. Конечно, эта оценка была бы существенно ниже, если бы соперник открыл карты и показал готовую 9-7. Но она базируется на полученной CNN-7 информации о том, что противник поменял три карты против двух и поставил первым после обмена. Он мог избрать такую линию со многими руками и не только готовыми. Колл в 95% случаев выглядит вполне разумным. Однако в данной раздаче монетка встала на ребро, и CNN-7 сделал рэйз.
Poker-CNN-76
5c 3h 9d 7s 4c (2, False, 700.0, '11', 2, 3, '1011')
raise: $559 (24.4%)
call: $462 (75.6%)
fold: $0
Банк продолжает расти, и вместе с ним растёт оценка своей руки у CNN-76. Не знаю, почему ИИ советует коллировать, а не рэйзить, в 3/4 случаев. Может быть, ему не хватает опыта с 3-бетами, может быть, дело в балансе. Но в этой раздаче вновь выпал менее вероятный вариант, и последовал 3-бет. Баттон заколлировал.
Poker-CNN-76
5c 3h 9d 7s 4c (2, False, 1000.0, '1110', 2, 3, '101110')
‘pat': $720
‘draw_1': $486
Конечно, CNN-76 не меняет готовую 9-7. Но любопытно узнать, как ИИ оценивает возможную ошибку с обменом одной карты. Именно этим отличается мышление игрока-человека и машины. Опытный игрок в трипл-дро скажет, что 9-7 здесь годится, а менять одну карту, пытаясь собрать семёрку – слабее. Но может ли он оценить эту ошибку в денежных знаках? Конечно, оценки Poker-CNN не идеальны, но узнавать их всё равно интересно.
CNN-7 на баттоне оказывается перед важным решением: менять две карты, чтобы собрать восьмёрку, или идти за 9-8 (то есть, как нам известно, без аутов против конкретной руки соперника).
Poker-CNN-7
8h 9c 3s 2d 8c (2, True, 1000.0, '1110', 3, 5, '101110')
‘draw_2': $389
‘draw_1': $384
Бронштейн считает, что не менять две карты – грубая ошибка, и он прав. У нас 16 аутов на 9-8, что для двух оставшихся улиц даёт вероятность 59.0%, но как часто 9-8 выиграют на вскрытии? Даже если соперник стоит с десяткой или блефует, как часто он поставит с этими руками 3-бет после первого обмена? $380 в банке $1000 выглядят очень оптимистичной оценкой для 9-8-дро против готовой руки.
Шансы собрать восьмёрку обменом двух карт дважды посчитать сложнее, так как закрытые карты соперника не являются случайными, но подсчёт в лоб даёт шанс в 27.1%. Учитывая, что при успехе мы с большой вероятностью доберём лишнюю ставку, $380 для двухкарточного дро выглядит логичной оценкой.
В очередной раз подбросив монетку, Poker-CNN-7 решает поменять одну карту. Он без аутов.
Poker-CNN-76
5c 3h 9d 7s 4c (0, False, 1400.0, '', 5, 5, '10111010')
bet: $1047 (95.6%)
check: $969 (4.4%)
После второго обмена Poker-CNN-76 оценивает свою руку в случае ставки как $1,050 в банке $1,400, поэтому ставит. CNN-7 собрал 9-8 и охотно коллирует.
Poker-CNN-7
8h 9c 3s 2d 6h (1, True, 1200.0, '1', 4, 5, '1011101')
raise: $296 (0.5%)
call: $420 (99.5%)
fold: $0 (0.0%)
Конечно, учитывая экшен, CNN-7 не считает себя фаворитом в этом банке, но шансы для коллдауна вполне достаточны.
CNN-76 снова не меняет карт, и CNN-7 должен задуматься над тем, не разбить ли ему слабую девятку.
Poker-CNN-7
8h 9c 3s 2d 6h (1, True, 1400.0, '10', 4, 5, '10111010')
‘pat': $770
‘draw_1': $582
Это смахивает на бред – ИИ только что оценивал 9-8 как $420 в банке $1200, а на следующей улице повышает её стоимость на $350! Я бы, вероятно, тоже не разбивал девятку, но оценивал свои шансы выиграть на вскрытии куда ниже.
На ривере CNN-76 снова ставит.
Poker-CNN-7
8h 9c 3s 2d 6h (0, True, 1600.0, '1', 5, 5, '101110101')
raise: -$460 (0.0%)
call: $80 (66.0%)
fold: $0 (34.0%)
Под конец CNN-7 сознаёт, что его готовая 9-8 вряд ли годится. Выгоду от колла он оценивает скромными $80 при размере банка $1600. Учитывая размер ставки соперника в $200, это эквивалентно выигрышу на вскрытии в 15.5% случаев.
В таком банке я бы тоже вздохнул и сделал колл, а в живой игре попытался бы прочитать соперника и часто сфолдил, если бы не почувствовал, что он нервничает. Оплачивать последнюю ставку в 100% случаев – не лучшая игра, но всегда фолдить 9-8 тоже плохо – нас просто задавят.
Ключевой ошибкой в раздаче был обмен одной карты вместо двух на втором обмене.
Заключение
При игре в покер с нейронной сетью раздражает отсутствие у неё внутренней логики. Думаю, вы согласитесь с тем, что оценки ИИ по большей части выглядят разумными, некоторые из них довольно интересны, но попадаются и откровенно ошибочные. Например, на ривере оценка рэйза с 9-8 никак не может составлять -$460 на лимите $100/$200.
Зато играет Poker-CNN быстро, а все его решения – прямой продукт деятельности нейронной сети. В отличие от шахматного движка, он не симулирует раздачи, не считает шансы и не ищет готовые решения в похожих ситуациях. Он лишь прогоняет введённые данные через восьмиуровневую нейросеть и получает ответ, как торговаться и менять карты. На моём лаптопе это занимает примерно полсекунды.
Poker-CNN – первая версия покерного ИИ. Он не предназначен для решения трипл-дро один на один и даже не использует правила игры. Я тренирую его на историях раздач, из которых бот может получить информацию о картах, размере банка и торговле. Нейронная сеть группирует похожие раздачи, изучает типичные последовательности действий и оценивает ожидаемый результат.
Я мог бы ввести в ИИ 50 тысяч сильнейших рук для 2-7, начиная с первого натса 7x 5x 4x 3x 2x , но это противоречит сути проекта. Вместо этого я просто загружаю раздачи в стандартном формате. Проанализировав достаточное количество раздач, ИИ должен научиться неплохо играть в покер.
Николай Яковенко в твиттере