Обучение агента освоению простой игры через самостоятельную игру

Обучение агента игре

Симулируйте игры и предсказывайте результаты.

Робот, вычисляющий сложение. Изображение автора с помощью DALL-E 2.

Введение

Неужели удивительно, что всё, что вам нужно для превосходства в игре с полной информацией, есть для всех видно в правилах игры?

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

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

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

Решение игры SumTo100

Игра

Игра, которую мы собираемся обсудить, называется SumTo100. Цель игры – достичь суммы 100, складывая числа от 1 до 10. Вот правила:

  1. Инициализировать сумму = 0.
  2. Выбрать первого игрока. Два игрока ходят по очереди.
  3. Пока сумма < 100:
  • Игрок выбирает число от 1 до 10 включительно. Выбранное число добавляется к сумме, не превышая 100.
  • Если сумма < 100, играет другой игрок (т.е. мы возвращаемся к пункту 3).

4. Игрок, добавивший последнее число (достигнувший 100), побеждает.

Два улитки, занимающиеся своими делами. Изображение автора с помощью DALL-E 2.

Начинать с такой простой игры имеет множество преимуществ:

  • Пространство состояний имеет только 101 возможное значение.
  • Состояния можно отобразить на 1D-сетке. Эта особенность позволит нам представить функцию значений состояний, изученную агентом, в виде столбчатой диаграммы 1D.
  • Оптимальная стратегия известна: – Достигнуть суммы 11n + 1, где n ∈ {0, 1, 2, …, 9}

Мы можем визуализировать значение состояния оптимальной стратегии:

Рисунок 1: Оптимальные значения состояний для SumTo100. Изображение автора.

Состояние игры – это сумма после того, как агент завершил свой ход. Значение 1.0 означает, что агент обязательно выиграет (или уже победил), в то время как значение -1.0 означает, что агент обязательно проиграет (при условии, что оппонент играет оптимально). Промежуточное значение представляет оценочный возврат. Например, значение состояния 0.2 означает незначительно положительное состояние, а значение состояния -0.8 представляет вероятную проигрыш.

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

Генерация игр, сыгранных случайными игроками

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

На рисунке 2 показан пример игры, сыгранной двумя случайными игроками:

Рисунок 2: Пример игры, сыгранной случайными игроками. Изображение автора.

В этом случае, второй игрок выиграл игру, набрав сумму 100.

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

На рисунке 3 показаны взаимодействия между агентом, оппонентом (механизм выбора хода которого неизвестен) и игровым авторитетом:

Рисунок 3: Взаимодействие между агентом, оппонентом и игровым авторитетом. Изображение автора.

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

Наш список случайно сыгранных матчей предоставит нам набор данных для первого этапа обучения. Возьмем пример игры с рисунка 2, мы хотим наказать ходы, сделанные игроком 1, так как его поведение привело к проигрышу. Состояние, полученное после последнего действия, получает значение -1.0, так как оно позволило оппоненту победить. Другие состояния получают скидочные отрицательные значения с коэффициентом γᵈ, где d – это расстояние до последнего состояния, достигнутого агентом. γ (гамма) – это коэффициент скидки, число ∈ [0, 1], которое выражает неопределенность в эволюции игры: мы не хотим так сильно наказывать ранние решения, как последние. На рисунке 4 показаны значения состояний, связанные с решениями, принятыми игроком 1:

Рисунок 4: Значения состояний, с точки зрения игрока 1. Изображение автора.

Случайные игры генерируют состояния со своим целевым ожидаемым возвратом. Например, достижение суммы 97 имеет целевое ожидаемое значение возврата -1.0, а сумма 73 имеет целевое ожидаемое значение возврата -γ³. Половина состояний принимает точку зрения игрока 1, а другая половина – точку зрения игрока 2 (хотя это не имеет значения в случае игры SumTo100). Когда игра заканчивается победой агента, соответствующие состояния получают также скидочные положительные значения.

Обучение агента предсказывать возврат игр

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

Рисунок 5: Эволюция потерь в зависимости от эпохи. Изображение автора.

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

Выучила ли нейронная сеть вообще что-нибудь?

К счастью, поскольку состояния могут быть представлены в виде одномерной сетки чисел от 0 до 100, мы можем построить график предсказанных выигрышей нейронной сети после первого раунда обучения и сравнить их с оптимальными значениями состояний на Рисунке 1:

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

Оказывается, через хаос случайных игр, нейронная сеть узнала две вещи:

  • Если вы можете достичь суммы 100, сделайте это. Это полезно знать, учитывая, что это цель игры.
  • Если вы достигаете суммы 99, вы обязательно проиграете. Действительно, в этой ситуации противник имеет только одно допустимое действие, и это действие приводит к поражению для агента.

Нейронная сеть в основном научилась завершать игру.

Чтобы научиться играть немного лучше, мы должны перестроить набор данных, симулируя игры, сыгранные между копиями агента с их свежеобученной нейронной сетью. Чтобы избежать генерации идентичных игр, игроки играют немного случайно. Хорошо работающий подход – выбирать ходы с помощью алгоритма эпсилон-жадной стратегии, используя ε = 0,5 для первого хода каждого игрока, затем ε = 0,1 для остальной части игры.

Повторение цикла обучения с лучшими и лучшими игроками

Поскольку оба игрока теперь знают, что им необходимо достичь 100, достижение суммы между 90 и 99 должно быть наказано, потому что противник воспользуется возможностью выиграть матч. Это явление видно на предсказанных значениях состояний после второго раунда обучения:

Рисунок 7: Предсказанные значения состояний после двух раундов обучения. Суммы от 90 до 99 показывают значения, близкие к -1. Изображение автора.

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

Следующая анимация показывает эволюцию предсказанных значений состояний после 25 раундов обучения:

Рисунок 8: Анимация значений состояний, изученных в процессе раундов обучения. Изображение автора.

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

Два фактора способствуют этому явлению:

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

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

Заключение

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

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

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

Спасибо за ваше время.