ABK-GOFAI: Добрый старый искусственный интеллект для игры в Abak Evolution Backgammon.
Без помощи нейронной сети разработка искусственного интеллекта (ИИ) для Abak оказалась сложной задачей и со временем достигла видимого предела. Тем не менее, это был увлекательный процесс, и этот ИИ до сих пор используется на уровнях «лёгкий», «нормальный» и «продвинутый». Это статья о том, как он работает и как был создан.
Фаза 1, GOFAI PHP
Первая версия ИИ Abak была написана на PHP и была обречена вызывать сбои системы с ошибками «нехватка памяти», но она проложила путь для версии на C++. Это была площадка для прототипирования, где я пытался понять, как вообще создать ИИ. Когда я впервые запустил его, подключив к веб-серверу (то есть я фактически играл против него), ему потребовалось 15 очень долгих секунд, чтобы выбрать ход, и когда я увидел, как сервер делает ходы сам по себе, я пришёл в полный восторг и, возможно, даже станцевал. Не уверен.
Фаза 2, GOFAI C
Итак, версия ИИ на C/C++, первая вышедшая в продуктивную среду, мой любимый движок GOFAI, родилась на пепле PHP. Она выполняет 29 алгоритмов анализа над тысячами позиций за наносекунды и работает так:
- Дана позиция на доске и набор кубиков.
- Вычислить состояние
- Получить все возможные ходы.
- Проанализировать каждый ход и присвоить ему оценку.
- Выбрать «лучшую» оценку.
Вот диаграмма процесса.
Он состоит из четырёх основных функций:
- Получить действия (Вычислить допустимые ходы):
Данная позиция доски и бросок кубиков — вычисляет каждый допустимый ход.
Допустимых ходов может быть от 0 до десятков тысяч.
На каждом языке, на котором я это писал, я использовал излишне рекурсивный подход, который делает код очень трудным для отладки, но при этом очень красивым. Он содержит пару сотен строк кода, но мне потребовались недели, чтобы его написать, а потом ещё недели, чтобы перевести на C.
- Получить состояние (Вычислить состояние доски):
Данная позиция доски — вычисляет семантическое состояние; названия говорят сами за себя:
- Начало
- Середина игры
- Бег без надежды
- Бег с надеждой
- Эндшпиль
- Вход домой
-
Анализ хода (Вычислить оценки позиции на доске):
Это, безусловно, самый обширный из всех алгоритмов. Он анализирует характеристики доски, каждая из которых возвращает оценку, а затем, на основе ранее вычисленного состояния, применяет к ним коэффициенты, чтобы придать значимость различным аспектам анализа в зависимости от состояния игры.
ИИ начинал с 8 алгоритмов и закончил с 29, вот некоторые из них:
- Высота столбцов
- Риск быть взятым
- Риск быть пойманным
- Сила дома
- Точки выхода
- Шашки на баре
- Безопасные шашки
Многие из этих алгоритмов поначалу были очень примитивными или просто не существовали.
Со временем я работал над ними, добавляя функции и настраивая коэффициенты.
-
Выбрать действие (Выбрать «лучший» ход):
Этот алгоритм относительно тривиален, если вам нужна просто наивысшая оценка (как на продвинутом уровне).
Для нормального и лёгкого уровня он выбирает ход случайным образом из списка лучших действий; размер этого списка (или его толерантность к слабым ходам) определяется уровнем.
Благодаря C этот движок молниеносно быстр, поэтому я всегда буду использовать его как основную функцию получения действий.
Фаза 3, Настройка GOFAI C
Для отладки, устранения неполадок и тонкой настройки этого движка мне пришлось создать множество инструментов для мониторинга процесса принятия решений. В отличие от нейронной сети, каждое решение здесь можно проверить, и это было хотя бы что-то.
Процесс был увлекательным, но мучительно медленным. Я много играл против компьютера, и всякий раз, когда видел слабый ход, обращался к этим инструментам, чтобы разобраться, что пошло не так. Иногда это вело меня к исправлению алгоритма, настройке коэффициента или созданию новой модели анализа. А иногда, и это было прекрасно, это заставляло меня пересмотреть свои стратегии в Abak Evolution.
Со временем у меня был довольно крепкий ИИ, но дальнейшее совершенствование становилось всё труднее. Было так много строк кода, так много сценариев, такие масштабные операции, что отладка на уровне кода была тяжёлой задачей, а ручная настройка коэффициентов не давала результатов.
Фаза 4, Отчаяние
Но мне хотелось большего, потому что я сам играю в Abak, и мне нужен был сильный противник для удовольствия, а людей, играющих в него в то время, было немного (и даже когда я пишу это).
И у этого подхода есть множество недостатков:
- Он вычисляет состояние доски на основе текущей позиции, и это состояние используется для изменения коэффициентов алгоритмов анализа для каждого допустимого действия. Однако это действие могло изменить состояние, но движок не учитывает этого.
- Ручная настройка коэффициентов требовала огромного количества времени. Весёлое время, но тонны его тем не менее.
- Состояние крайне сложно вычислить, учитывая количество возможных сценариев. Этот алгоритм всегда был несовершенным.
- Эквити партии невозможно вычислить точно, потому что этот движок использует произвольную систему оценок для каждого алгоритма анализа, и итоговая оценка не отражает вероятность победы — она лишь работает как сопоставимая оценка между различными позициями на доске. Можно сказать, что она имеет относительное значение, а не абсолютное.
Фаза 5, Пробуждение
И вот, однажды, в 2018 году, Google победил чемпиона по Го с помощью нейронной сети AlphaGo, и было столько шума, и появились новые потрясающие библиотеки машинного обучения с открытым исходным кодом, использующие домашние GPU для ускорения процесса обучения.
Конечно, я уже немного знал о нейронных сетях, но никогда не строил их и, честно говоря, считал это задачей выше моих возможностей.
Поэтому я просто не мог устоять, и экспертный уровень больше не работает на движке GOFAI, за исключением части получения действий.
Но эта история заканчивается здесь.
Если вы дочитали до этого места, я поражён.
Этот текст был написан для целей SEO честной командой Abak Evolution,
Он же Сами Гариб.