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

Автор оригинала: 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
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 23

    +6
    Для тех, кто зайдёт в комментарии за этой картинкой:
    Скрытый текст
    image
      +2
      Не знаю, как другим, а вот мне интересно учиться от игр. Одна победа на десять поражений в честном сражении с компьютером — гораздо ценнее, чем десять побед на одно поражение там, где компьютер даёт игроку красиво победить. Кажется, людей вроде меня называют хардкорщиками.
        +1
        Не скажу за биллиард и покер, но в том что касается традиционных настолок, таких как Шахматы и Го — очень важно, чтобы противники играли приблизительно на одном уровне. Чтобы учиться, желательно, чтобы противник играл немного сильнее. Немного (здесь) — ключевое слово! Если компьютер рвёт вас «как тузик грелку» чему либо научиться принципиально сложно. В этом плане, статья очень годная. Да, и ещё. Когда вы учитесь играть — дело не в победах (тем более в их количестве). Это всего лишь индикатор вашего прогресса. Важно чтобы он рос. Абсолютные значения не принципиальны (это касается и учебных партий с людьми, разумеется).
          +3
          Нет у Вас никаких шансов на «честную победу» ни в какой игре с компьютером, основанной на скилах. Есть шансы на одиночные победы в играх, основанных на чистой вероятности (типа рулетки), но это же не «честная победа», а просто случай.
            0
            Ну в целом оно так, но это идеальный случай. У меня, например, AI очень слабенький, победить не сложно. Я конечно работаю над тем чтобы сделать его сильнее, но пока годится только чтобы играть с детьми. Тут дело не только в том, что я нуб в разработке AI (это так), но и в серьёзных ограничениях производительности, в связи с выбранной архитектурой.

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

            Есть игры с неполной информацией (да тот же "Дурак"). Если делать AI видящий все карты на руках, играть будет не очень интересно. А вот AI накапливающий информацию по ходу игры — совсем другое дело. И он будет сильнее среднего человека, просто потому что не забывает ничего что накопил (соответственно надо думать о том, чтобы он как-то поддавался, но при этом не лажал совсем откровенно). Это поле не паханное, на самом деле.
              0
              Нет у Вас никаких шансов на «честную победу» ни в какой игре с компьютером, основанной на скилах.

              Вы вообще-то занимаетесь совершенно другим классом игр. Если не видите разницы — попробуйте сыграть в TF2 против пулеметчика с аим-ботом.

                0
                Я занимаюсь довольно широким классом игр. Не только дискретными. Другой вопрос, что именно сейчас я занимаюсь традиционными настольными играми. Это просто один из этапов.
                +1
                просто потому что не забывает ничего что накопил (соответственно надо думать о том, чтобы он как-то поддавался, но при этом не лажал совсем откровенно).


                Или просто ограничить ему память на карты, так что бы он как средний человеческий игрок запоминал например только вышедшие крупные козыри, а не все карты в принципе.
                0
                Согласен, всё зависит от жанра игры. Однако шансы на победу есть не только в рулетке. Там, где есть свобода выбора (хотя бы относительная) — например, в стратегиях — сражение с самым сложным ИИ представляет собой скорее сражение с его автором. С его парадигмой, с подходом к написанию ИИ. Это поиск слабых мест. С другой стороны, это уже не игра, а тестирование какое-то — но мне нравится.
                  +1
                  Там, где есть свобода выбора (хотя бы относительная) — например, в стратегиях — сражение с самым сложным ИИ представляет собой скорее сражение с его автором. С его парадигмой, с подходом к написанию ИИ.
                  Эта эпоха стремительно катится к своему закату. Нет в AlphaGo никаких «парадигм». К компьютерным стратегиям этот подход пока неприменим («доска» на порядки больше по размеру, чем Го'шные 19x19, а потребление в мегаватты несколько не то, что может себе позволить средний игрок), но уже отчётливо видно, что скоро и в стратегиях «боты» будут заменены на ИИ достаточно общего плана просто слегка натасканный на правила игры конкретной стратегии…
                    +1
                    Как же я жду цивилизации с нормальным ИИ!)
                +1
                Знаете, это зависит от реализации ИИ.
                Человек должен чувствовать, что может победить. Я тоже люблю играть с более сильным противником, не важно, будь то ИИ или человек, но в некоторых ситуациях я опускаю руки и просто понижаю планку) Например, в КС ГО (я не уверен, стандартные ли это боты, либо какая-то модификация от сообщества моддеров.) на одном из DM серверов боты стреляют на опережение — ты не успел выйти из укрытия, а пуля уже у тебя в голове, при этом они постоянно крутятся вокруг своей оси как какие-то турели, а когда не хотят победить, даже не пытаются стрелять в тебя. И это чертовски раздражает! Ты просто понимаешь, что у тебя нет шансов против ботов, если им выпадет задача тебя убить, а не поддаться. В статье об этом и говорится, причем по несколько раз повторяется одна и та же мысль (Зачем? Проблема оригинала или перевод корявый?).
                  0
                  Про CS:GO — это т.н. spinbot. Часть функционала более сложных читов для обычных игроков (конечно, может быть использовано и в обычных ботах). С счастью, большинство читов ЛЮДИ определяют более-менее стабильно, и голосованием просто выгоняют читера (или за некоторое время читер получает пачку жалоб в steam).
                  Если не считать спинбот — то стрельба «на опережение» — стандартная тактика, когда видишь, что противник бежит в определённом направлении, но _твоя_ точность движения мышкой не позволяет быстро прицелиться по движущейся мишени, приходится прицелиться чуть далее по ходу движения игрока (есть запас времени в какие-то доли секунды), и далее выстрелить, когда уже цель близка (чтобы учесть запаздывание реакции и пинг) или на линии прицела. Тут сильно влияет то, как человек определяет (предсказывает) дальнейшее движение противника, некоторых можно легко предсказать, других — сложно.
                –1
                кхм, кхм… Hearthstone же…
                Hearthstone
                image
                  +3
                  А не правильнее ли ставить AI в те же условия, что и живого игрока, имитируя ограничения человека?
                  Скажем в бильярде — добавлять случайность к углу и силе удара, но не после того как AI этот удар идеально расчитал, а чтобы сам AI учитывал что может промазать. В шахматах — можно ограничивать использование готовых дебютов, и искусственно выкидывать ходы противника из просчета. В FPS — давать AI картину мира с задержкой.

                  Если AI сначала специально поддается, а потом отыгрывается как бог без 5-ти фигур — не думаю что это как-то прям супер-интересно.
                    +1
                    Мне кажется, что целью ИИ, который априори играет лучше человека в какую-то игру, должно быть не «подыграть», а «научить человека играть лучше».

                    Вот с таким играть будет интересно. Он должен стараться подвести человека к обнаружению каких-то особенностей игры, помогающих победить.
                      0
                      Интересно, когда уже сделают некий режим «обучения», когда после игры против компьютера будет показываться видеоролик, где компьютер подробно разберёт все твои ошибки, и подскажет, как можно было бы сделать лучше в той или иной ситуации. Это был бы прорыв!
                      А если ещё и подберёт какие-нибудь упражнения (игры, или что-то ещё) для тренировки какого-либо навыка (реакция, тактика, выдержка, память, и т.п.) — вовсе цены не будет такому решению!
                        0
                        В шахматах, например, это уже реализовано. Есть анализ партии, с разбивкой лучший/обычный ход/неточность/ошибка/зевок. Позиция на доске оценивается численно (например +10 — белые сильно выигрывают или -1,5 — черные немного лучше). Там где сделан слабый ход, показывается сильнейший, и в комментариях несколько следующих ходов — понятна идея хода, развитие атаки. Всё достаточно удобно и работает в браузере, т.е. далеко не мегаватты вычислений.
                        При этом компьютер победил чемпиона мира 20 лет назад и все это время шахматный AI прогрессировал, во многом в качестве помощника живому гроссмейстеру. В го чемпион мира проиграл только в этом году, подождем лет 15 :)
                        Ситуацию с RTS не знаю, но вроде AI еще не может стабильно побеждать топ-игроков. Опять же не факт, что сообществом будет востребован компьютерный советник, способный к рекомендациям «здесь можно на 2 секунды раньше заказать постройку» или «выгоднее заказать улучшение брони вместо трех солдат».
                        Карты с тренировкой микро-менеджмента я помню еще в первом StarCraft. Например, убить «собачками» кучу зилотов. Первая эмоция «это нереально, у него 6 целых зилотов остаются», потом оставалось 2… а потом я понял, что игра интересней, чем оттачивание техники, и забросил.
                          0
                          Откройте для себя lichess.org
                        +5

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

                          0
                          Спасибо за статью, я сейчас работаю в т.ч. над AI для одной коллекционной карточной игры, попробую вдохновится написанным. А то пока у меня там всё как в первом примере про бильярд — в некоторых случаях AI просто забивает на алгоритм и ходит случайно, чтобы не быть слишком сложным…
                            +1

                            При всём уважении к Фрицу назвать его современной шахматной программой сложно. Пик его славы прошёл году в 2006-м.
                            Метод, которым во Фрице реализован гандикап, тоже сложно назвать реалистичным: зевок фигуры, а потом игра в силу супергроссмейстера всю оставшуюся часть партии. Гораздо правильнее, на мой взгляд, поступили программисты Чессмастера, разработав несколько десятков настроек параметров разной силы, от новичка до Каспарова и выше. И у них получилось — любители до сих пор весьма ценят эту программу!
                            Да, и ещё. Из-за техники форсированных шахов и разменов даже замедленная в 1000 раз шахматная программа не будет делать совсем уж глупых действий. Никогда не подставит под бой фигуру, а при случае может объявить вам мат в десять, скажем, ходов. Что тоже для новичка не характерно...

                              0
                              «ИИ должен быть более умным, чтобы казаться менее умным.»

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

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

                              Самое читаемое