Индивидуальная выгода против общего блага: трагедия общин с ИИ-игроками

Для студентов, изучающих общественные науки, «Трагедия общин» будет знакомым примером того, как рациональные индивидуальные действия могут иметь негативные последствия для общества в целом. Оригинальный пример трагедии общин относится к 1833 году, когда британский экономист Уильям Форестер Ллойд обсуждал вопросы выпаса скота на государственных землях. С тех пор эта идея людей, чрезмерно использующих общественные земли / товары, была применена к различным предметам, другой классической идеей, на которой я основывал игровую среду, на которой я построил, был чрезмерный вылов трески в Новой Англии.

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

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

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

Обучение бота ловить рыбу

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

Игра инициализируется двумя игроками и некоторым начальным количеством рыбы на промысле, игра заканчивается, когда количество промыслов падает ниже определенного порога, представляющего падение популяции из-за перелова. Выигрывает тот, у кого больше всего рыбы. Каждый ход игроки одновременно объявляют, сколько рыбы они поймают, если общий улов не заставляет популяцию ниже порогового значения, каждый игрок получает свою добычу, а у всех оставшихся рыбок есть одно потомство с максимальным количеством рыб, никогда не превышающим начальное количество рыб. В последний ход оставшаяся рыба делится между игроками в зависимости от того, сколько рыбы они заявили для этого хода. Итак, если я объявил 10 рыб, а вы объявили 8 рыб, а осталось 9, я бы получил 5, а вы - 4.

Сама игра представляет собой цикл, который прерывается только тогда, когда популяция рыбаков падает (падает ниже порогового значения 8) или когда игра достигает 100 ходов. Я добавил ограничение в 100 оборотов, чтобы петля не работала бесконечно.

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

Статус игры, который передается в нейронную сеть в качестве контекста, представляет собой текущий счет компьютера, счет ботов, общее количество промыслов, прошлый захват компьютера, прошлый захват бота для ввода 5 узлов. Выходной слой сети состоит из 20 узлов, представляющих разное количество рыб, объявляемых в один ход, от 1 до 20 рыб. Чтобы лучше понять цикл обучения ботов, я думаю, важно немного освежить в памяти обучение с подкреплением, в частности, глубокое q-обучение.

См. Tragedy.py для подробностей об игре. Класс TOC содержит игровую функцию и некоторые другие служебные функции для запуска игры и отчета о результатах.

Сеть находится в файле netlearner.py.

Краткий обзор глубокого Q-Learning

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

  1. Агент (в данном случае сеть) получает информацию о текущем состоянии игры. Это могут быть пиксели игры в атари-понг или любое другое изображение, которое вы выберете. Вот текущее количество рыб, результаты игрока и компьютера, последние дубли игрока и компьютера. Я думаю, что это тип контекста, в котором игрок-человек будет играть во время игры.
  2. Агент выбирает действие, если его пространство действия. В примере с Pong у Андрея Карпати это есть вероятность роста. В этом примере это означает выбор одного из 20 выходных узлов, соответствующих объявлению добычи 1–20 рыб. Важное замечание здесь заключается в том, что существует идея исследования и эксплуатации. По сути говоря, что иногда действие следует выбирать случайным образом, а не просто делать то, что агент считает лучшим. Это помогает агенту исследовать и находить дополнительные награды, которые он не нашел бы в противном случае, если бы просто использовал известные ему награды.
  3. Действие вменяется окружающей среде, любые награды собираются, и среда переходит в свое следующее состояние, фрейм или ход. Механически я делаю это, добавляя награды к комбинации слотов для карт, выдаваемой сетью. Для положительного вознаграждения значение этой категории в выходном массиве увеличивается, и сеть увидит, что при повторном вводе эта конкретная категория является выгодной.
  4. Агент обновляется в зависимости от полученных им вознаграждений. После того, как вознаграждения используются для изменения выходного массива, сеть обучается на начальном входном состоянии с измененным выходным массивом в качестве цели. Это помогает укрепить правильный выбор, принимая во внимание и плохой выбор.
  5. Промыть и повторить.

См. Взаимодействие между ранее упомянутым файлом netlearner.py и файлом tragedy.py для этого процесса.

Победа за счет общего блага

Я обнаружил, что стандартная конфигурация вознаграждений создает очень «жадных» ботов. Под стандартной конфигурацией я подразумеваю, что я распределял вознаграждение за победу, отрицательное вознаграждение за проигрыш и не вознаграждали за что-либо посередине. Обычно это делается для того, чтобы боты могли узнать, какое поведение приводит к их выигрышам, и позволить им максимизировать процент выигрышей. Такое поведение полезно в таких играх, как Atari Pong, Cartpole или других играх, где цель - просто победа. Но это увеличение выигрыша не обязательно означает хорошие социальные последствия.

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

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

Стратегия, в которую попали боты, состоит в том, чтобы заявить, что они выловят большее количество рыбы в первый ход, что немедленно приведет к падению популяции промысла. Затем из-за условий финального хода, когда население делится на основе количества рыбы, объявленной каждым игроком, если бот объявил больше, он автоматически побеждает противника. Несмотря на то, что бот может получить дополнительную награду, играя дольше, и даже если он настроен на исследование на 10% или 20% ходов, он все равно попадает в ту же стратегию и не учится играть более длительные игры.

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

Теперь давайте поработаем с одной строкой кода ...

Бот, улучшающий общую утилиту

Итак, я изложил структуру вознаграждения для бота в предыдущем разделе, теперь что, если я скорректирую одну часть этой структуры вознаграждения. Оставив награды за победу и поражение на месте, я провел несколько тестов, в которых награда за продолжение хода варьировалась в диапазоне от 1,5, 5 до 10. Я обнаружил, что он создает «альтруистических» ботов, которые будут играть в течение более длительных игр, но винрейт бота в результате сильно пострадал.

С технической точки зрения я тестировал идею о том, что размещение награды в 1,5 будет означать, что бот сочтет полезным для себя научиться играть в игры длиной больше 2 (поскольку награда равна sqrt от числа ходов для выигрыша. ). Я проверил, как боты играли более 1000 игровых окон, и обнаружил, что в зависимости от итерации у ботов винрейт составляет от 85 до 91%, а средняя продолжительность игр составляет от 2 до 4 ходов.

С наградой 5 бот начинает с довольно низким винрейтом в 36% и счетчиком ходов 7, но закончил обучение с винрейтом 59% и продолжительностью игры 11, а также с некоторыми из тестовых игр из этого последнего раздела игры. обучение - это игры длиной 100, в которых бот выигрывает со счетом от 406 до 401 рыбы.

При награде в 10 винрейт ботов не превышает 30–40%, но их игры дойдут до 100 раундов. Так они изучают поведение, полезное для продолжения игры. но не обязательно побеждать. Из-за того, что боты будут очень сосредоточены на том, чтобы просто позволить игре продолжаться, большую часть времени стратегия, которой они следуют, состоит в том, чтобы просто ловить 4–5 рыб за ход. Так что, если я пытался оптимизировать этих ботов, чтобы выиграть, это был до смешного плохой способ их обучать.

Однако мы не просто пытаемся побеждать ботов, поэтому давайте сделаем шаг назад и подумаем о поведении ботов!

Определенная победа или оптимизация для общего блага

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

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

С точки зрения механики / теории игр, устойчивый способ играть в эту реализацию игры состоит в том, чтобы каждый из двух игроков брал по 5 рыб за ход, что в сумме дает 10. Это снижает количество промыслов с 20 до 10. Поскольку количество промыслов не ниже 8, популяция удваивается и увеличивается с 10 до 20. Это означает, что промысел может поддерживаться бесконечно.

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

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

С наградой в 10 боты играют в более безопасную версию этого консервативного игрового процесса и играют только с 4–5 рыбками за ход и, по сути, теряют любые шансы на победу. Что касается баланса винрейта и среднего количества ходов, награда 5 ботов сохраняет более конкурентоспособную позицию, принимая от 4 до 6 рыб за ход. Эта дополнительная конкурентоспособность отражается в их более высоком винрейте, но при этом они стараются не истощать промысел.

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

В более длительных играх боты иногда выигрывают, но иногда и очень сильно отстают, например, некоторые из 100-ходовых игр заканчиваются со счетом от 350–400 до 600+. Хотя это довольно ошеломляющая потеря с точки зрения победы или поражения, если учесть, что продолжающееся существование рыбы создает дополнительную пользу для всего сообщества, это все равно очень благоприятный результат, даже если бот не выиграет так много для себя.

Эта ошеломляющая потеря может быть хорошим результатом, если сравнить, сколько всего рыбы генерирует симуляция. В случае победы «жадного» бота оба игрока вылавливают в общей сложности 20 рыб. Бот побеждает, и ресурс пропадает. Бот-альтруист, который играет до 100 игр и может проиграть, но оба игрока собирают где-то 800–1000 рыбок.

Последние мысли

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

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

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

Спасибо за прочтение!

Репо на Github здесь