В 2018 году Google победил чемпиона по Го с помощью нейронной сети AlphaGo, и было столько шума. Появились новые отличные библиотеки машинного обучения с открытым исходным кодом, использующие домашние GPU для ускорения процесса обучения.
Я принял решение попробовать сделать это с Abak, но когда я только начинал, я едва знал, что такое нейронная сеть. У меня было небольшое искушение в колледже (1996), но без данных, GPU и цели подступиться к этому было сложно. Более того: с математической стороны нейронные сети — это тяжёлая тема, и нужно много вдохновения.
После долгих интенсивных и одержимых исследований мне удалось построить модель и заставить её учиться.
Стоя на плечах гигантов, моим первым намерением было учиться у доктора Джеральда Тесауро, который разработал TD-Gammon в 90-х годах. Если я правильно помню, это была первая практическая реализация алгоритма обучения с подкреплением.
Но поскольку Abak — двумерная игра, я не мог использовать предложенную модель и должен был разработать свою собственную. Я решил использовать выходные данные некоторых алгоритмов как часть модели в качестве экспертной информации, чтобы нейронной сети было легче учиться. Мне казалось, что я жульничаю, делая это.
Вот сравнение обеих моделей — для нард и для Abak.
Широко используемая TD-модель нард описывает столбцы. Для каждого столбца доски используются 4 входа для его описания.
- Нет шашек: [0,0,0,0]
- Одна шашка: [1,0,0,0]
- Две шашки: [1,1,0,0],
- Три шашки: [1,1,1,0]
- Более трёх шашек: [1,1,1,1].
Она содержит 28 таких наборов (по одному на каждый столбец доски) для каждой команды, итого 28*2*4 входов, плюс несколько для подсчёта шашек на баре. К сожалению, я пишу это по памяти, которая может быть неточной.
Модель Abak сильно отличается. Она описывает шашки, и каждая из них имеет набор характеристик. В более новых версиях я добавил упрощённое описание доски в качестве дополнения, с результатами, которые не были невероятными, но эти характеристики всё ещё присутствуют.
Модель описания игры состоит из четырёх частей [477 входов]:
- Описание шашек (14x30): Описание включает статистику шашки, расстояние, высоту и т.д. Оно не включает класс, который наследуется от позиции в модели.
- Статус команды (4x2): Подсчёт некоторых характеристик шашек или статуса.
- Карта силы (24x2).
- Статус игры: кто бросает следующим! (1).
Полное описание модели вы можете посмотреть ниже.
Версии:
1.- Python Cumpy (TD-V1).
Первая версия этого ИИ была обучена на чистом Python с использованием Cumpy, библиотеки, подобной Numpy, которая работает на GPU. Я хотел учиться с нуля, поэтому, хотя какое-то время я играл с Tensorflow, я решил пойти без прикрытия (ну, вооружённый фантастической комбинацией Python и Cumpy).
Особенности:
- Одна сеть, которая оценивает шансы команды 0 на победу в партии.
- Не учитывает очки.
- Не имела флага «кто бросает следующим».
- Не имела карты силы.
- Один скрытый слой с сигмоидными активаторами.
- Потребовалось 45 000 партий, чтобы победить мой предыдущий ИИ, написанный с экспертной информацией (GOFAI).
- Обучалась на 4 500 000 партий. И побеждала GOFAI в 75% случаев.
- Она была в продакшене 2 года.
2.- Tensorflow (TD-V2).
Моей проблемой с версией 1 было то, что она плохо рассчитывала шансы на победу, потому что была обучена без флага «кто бросает следующим». Каким-то образом результаты нейронной сети были довольно хороши для выбора хорошего хода, но с математической точки зрения они были непоследовательны. Версия 2 решила эту проблему и добавила новую сеть для расчёта шансов на завершение партии в 1, 2 или 3 очка.
На этот раз я выбрал Tensorflow для обучения новой модели, потому что хотел изучить фреймворк, и нашёл отличный пример для начала.
Особенности:
- Одна сеть для расчёта шансов команды 0 на победу в партии.
- Одна сеть для расчёта вероятности завершения партии в 1, 2 или 3 очка.
- Включает новую карту силы.
- Два скрытых слоя с различными активаторами: Leaky RELU для скрытых слоёв и сигмоид в выходном слое.
- Потребовалось 12 000 партий, чтобы побеждать TD-V1 в 50% случаев.
- Обучалась на 350 000 партий и достигла 80% процента побед над TD-V1.
3.- Версия 3: В ожидании.
На финальном этапе принятия решения о выборе лучшего хода используется простой алгоритм, который ищет лучшее эквити [%W*%p1+%W*%p2+%W*%p3].
В зависимости от цели матча, количества очков, необходимых каждому игроку для победы, и значения куба, он по-разному взвешивает выходные данные сетей.
Я хотел бы сделать нейронную сеть, которая будет это обрабатывать. Это будет V3. В данный момент не в разработке.
Модель нейронной сети Abak:
Описание шашки (14 входов x 30 шашек):
- Расстояние до дома x/25
- Количество шашек сверху x/4
- Количество шашек снизу x/4
- На баре [0,1]
- Дома [0,1]
- В безопасности (расстояние = 0). [0,1]
- Образует блок с другой шашкой [0,1]
- Может быть поймана друидом [0,1]
- Поймана друидом [0,1]
- Ловит (этот вход только для каждого друида) [0,1]
- Риск быть взятой в ближней зоне (6 позиций вперёд) [0..1]
- Риск быть взятой в дальней зоне (12 позиций вперёд) [0..1]
- Риск быть пойманной друидом [0..1]
- Возможности хода [0..1]
Игровые данные для каждой команды (4x2):
- Количество шашек на баре. x/15
- Количество безопасных шашек. x/15
- Все шашки дома. [0,1]
- Количество безопасных шашек 0. [0,1]
Карта силы: (24*2):
И наконец, карта силы, похожая на ту, что предложил доктор Тесауро для нард, но упрощённая. Для каждой позиции и для каждой команды она содержит число от 0 до 1, отражающее силу этого блока:
- 0.0если пусто.
- 0.1если одна шашка.
- 0.5если эта шашка — страж.
- 1.0если две или более шашек.