Pull to refresh

Осознанные ошибки: как добавить глупость в код ИИ

Reading time 8 min
Views 21K
Original author: Mick West


Почти тридцать лет назад я работал над своим первым коммерческим проектом: Steve Davis World Snooker, одной из первых игр про бильярд, в которых был компьютерный игрок. Созданный мной искусственный интеллект был очень простым. Компьютер просто выбирал шар с самой большой «стоимостью», который можно было загнать в лузу, и забивал его.

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

К завершению проекта заказчик сообщил нам, что ИИ был «слишком хорош». Меня это озадачило. Я решил, что он хочет, чтобы в экспертном режиме компьютер был чуть менее точным. Поэтому так я и сделал. Но после этого услышал жалобы на уменьшившуюся точность, и в то же время ИИ остался слишком хорошим.

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

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

Проблема заключалась в том, что позиционной игры у ИИ не было! Конечное положение белого шара на самом деле было совершенно случайным. ИИ просто рассчитывал, куда биток должен ударить нужный шар, чтобы забить его в лузу.

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

Так в чём же была проблема? Почему же заказчики считали, что ИИ «слишком хорош», если на самом деле он был совершенно случайным?



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

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

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

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

Дизайн или код?


Это проблема дизайна или кода? В определённой степени это зависит от типа игры и от того, должны ли управляемые ИИ противники намеренно имитировать человека в той же ситуации, что и игрок.

В игре один на один, например, в бильярде, шахматах или покере, решения ИИ очень детерминированы на уровне чистого кода. В игре «один против всех», например, в FPS, обычно ожидается, что противники будут слабее человека.

В конце концов, вы же попали в ситуацию, в которой один человек сражается с бесконечными ордами врагов. В других жанрах, в частности, гоночных играх, игрок противостоит равным ему противникам. Здесь ожидаемый уровень ИИ находится где-то между ИИ шахмат и FPS.

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

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

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

Один на один!


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

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

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

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

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

Снижая количество вычислений, мы создаём ИИ, который пытается выиграть, но настолько ограничен, что это приводит к нереалистичному геймплею. Но разве игроков на самом деле волнует то, что происходит в логике игры? Что если мы не будем урезать ИИ, пусть вместо этого он играет в полную силу, но может умышленно «слить» игру?

Намеренный проигрыш


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

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

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

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

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

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

Скрытые гандикапы


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

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

Однако людям, играющим против компьютера, не нравится, когда им дают такое преимущество, и они предпочитают играть всей доской против ИИ примерно их уровня.

Программисты Fritz нашли такое решение: ИИ самостоятельно создаёт такие ситуации, которые человек (немного подумав) может использовать, чтобы получить преимущество в позиции или фигурах. После того, как игрок получит такое преимущество, ИИ продолжает играть, стремясь к победе.

Здесь ИИ ни в коем случае не становится более «тупым». Во всяком случае, на самом деле выполняется немного больше вычислений с большей сложностью.

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

ИИ в покере


Когда я программировал ИИ для World Series of Poker компании Left Field, вычисления ИИ в сущности были одинаковыми для всех уровней сложности.

На основании известных карт компьютер вычислял шансы на выигрыш, и оценивал силу руки противника на основании истории ставок. Затем шансы использовались для вычисления уровня доходности, на основании которого принималось решение (спасовать, ответить или поднять ставку).

Есть много особых правил и исключений, но в целом это всё. Искусственные игроки проводили одинаковые сложные расчёты, симулировали десятки тысяч раскладов для вычисления доходности.

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

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

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

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



Такие намеренные ошибки были реализованы вероятностным способом. Имитирующий глупость ИИ не всегда пасовал, когда казалось, что живой игрок блефует, он просто имел бо́льшую вероятность этого.

Такой подход очень хорошо сработал в покере, игре с высокой долей случайности, потому что игрок никогда не мог понять в каждой конкретной ситуации, что ИИ на самом деле совершает ошибку.

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

Искусственная неточность


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

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

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

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

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

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

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

Удачный жребий


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

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

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

Список литературы


Liden, Lars. «Artificial Stupidity: The Art of Intentional Mistakes», in AI Game Programming Wisdom 2, Charles River Media, 2004. http://lars.liden.cc/Publications/Downloads/2003_AIWisdom.pdf

Lopez, Steven. «Intelligent Mistakes», Chessbase News, 2005. http://www.chessbase.com/newsdetail.asp?newsid=2579
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+54
Comments 24
Comments Comments 24

Articles