С измеримым прогрессом приходит измеримое разочарование

Работая над нейросетевым плеером, который я разработал в предыдущем посте, я понял много вещей:

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

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

Было несколько функций, которые мне пришлось исправить, пока я реализовывал эту настройку. Во-первых, это возможность того, что жетон может быть заключен союзниками на краю карты. У него нет допустимых ходов, а это значит, что если оставить его в покое, он будет вечно тренироваться на карте 0, пока модель не удалит себя (не беспокойтесь о модели, мой ноутбук перегревается и выключается до того, как все станет совсем плохо). Первое изменение заключалось в том, что генератор карты ожиданий возвращал None вместо карты 0. Второе изменение заключалось в том, чтобы заметить None и перейти к следующему токену в моем списке токенов, которые должны повернуться. Я даже могу вернуться к застрявшему жетону, так как его соседи должны были переехать и дать ему куда-то уйти. Наконец, проверяется условие, при котором последний доступный жетон не имеет допустимых ходов, и игрок изящно завершает свой ход.

Я не согласен с новым элементом дизайна:

Первоначально мой обучающий модуль игрока запирал модель в цикле, где она обучалась на ожиданиях и снова и снова предсказывала ходы, пока модель, наконец, не выбирала допустимый ход. Я никогда не тренировал недопустимые ходы полностью вне модели, но Модель №2 часто выбирала допустимые ходы с первой попытки и почти всегда в пределах первых пяти… когда выходное пространство включает все точки на игровом поле, это впечатляет. Приведенный выше массив активаций показывает, насколько хорошо сфокусированной стала модель 2. Тем не менее, этот интенсивный подход «тренируйся, пока не будет правильно» работает в играх очень медленно, и мой ноутбук сильно нагревается. Что мне нравится в этой схеме, так это то, что, хорошо это или плохо, каждое движение достоверно выбирается самой моделью.

Совсем недавно я начал умножать выходные значения предсказания — выбор хода сетью — на карту ожиданий значений, представляющих желательность хода. Преднамеренный эффект заключается в том, что все значения недопустимых ходов становятся равными нулю благодаря карте ожиданий, и игрок никогда не интерпретирует невозможный ход на основании своего нового ввода. Непреднамеренный эффект заключается в том, что оставшиеся значения активации также умножаются на смещения карты ожиданий для стрельбы по жетонам противника и движения к флагу противника. Результаты здесь быстрее и лучше, но совершаемые ходы — это лучший выбор модели, который попадает в допустимое пространство. Он не отражает самый сильный результат модели. Кроме того, этот режим требует меньше тренировок, хотя, наблюдая за тем, как он играет в игры против самого себя, я все еще вижу, как движения жетонов снижаются от игры к игре… 60, 54, 52, 51… с результатами трудно поспорить.

В качестве примечания к успешному обучению я также подключил кнопку «AI Turn» на своем игровом дисплее. Щелкнув по нему, вы загрузите конфигурацию и веса для модели, а также инициализируете экземпляр и будете использовать этот экземпляр модели для воспроизведения ходов для всех фигур на стороне. Последующие вызовы используют ту же модель. Он не пытается тренироваться во время поворотов или сохранять модель обратно в базу данных при очистке. Я слишком ленив, чтобы прямо сейчас создавать функции выбора/загрузки/сохранения модели.