Случайность в игре движка

11

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

Я предполагаю, что есть случайность, потому что в матче Alphazero против Stockfish мы не видели, чтобы одна и та же игра происходила много раз подряд. Однако я не понимаю, почему. Предположительно, единственный способ сделать это состоит в том, чтобы заставить двигатель играть частичное движение иногда, что звучит как сеппуку.

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

Ответы:

8

Что касается AlphaZero против Stockfish матча, этот вопрос уже освещался здесь по SmallChess .

AlphaZero в сторону (которая использует специализированную Монте - Карло 1 рутина в исследовании линий игры), который сделан быть недетерминирована по построению для обычных эвристики на основе движков, такие как Stockfish и другие (хотя есть и другие двигатели, имеющие процедуры MC-основанные, AFAIK Рыбка используется , чтобы иметь такую возможность), источник случайности, как правило, является лишь следствием технических аспектов в реализации, а не преднамеренной случайностью, вводимой алгоритмически в процесс принятия решений движком Говоря абстрактно, одной из причин этого является тот факт, что двигатели работают не совсем последовательно (выполнение одной задачи за другой). Вместо этого, чтобы сделать движки более эффективными, они выполняют параллельные поиски в различных ветвях дерева возможных ходов. Они делают это с помощью так называемой многопоточности (или -обработки, но это немного отличается). Таким образом, несколько потоков процессоров одновременновыполнение операций для поиска в дереве (и кеширования оценок посещенных позиций), поэтому представьте, что каждому потоку назначено поддерево. Проблема с этим типом реализации заключается в том, что общее выполнение потоков становится в значительной степени зависимым от всевозможных условий (время ожидания, перестановки ОЗУ, ...), поэтому, в конце концов, основной вариант может быть выбран без разрешения всех других темы, чтобы закончить их поиск.

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


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

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

Ellie
источник
6

Спасибо @Phonon за подробное описание моих предыдущих ответов. Я хотел бы добавить еще один момент: контроль времени .

Единственный детерминированный контроль времени - по количеству узлов , но это редко. Гораздо более распространенный контроль времени - фиксированное количество секунд или игровое время, как правило, не являются детерминированными.

Давайте попробуем пример. Запустите stockfish на своем терминале. Тип:

Go Movetime 20000

Эта команда указывает двигателю сделать ход через 20 секунд. Мои результаты:

info depth 23 seldepth 32 multipv 1 score cp 6 upperbound nodes 24325860 nps 1216171 hashfull 999 tbhits 0 time 20002 pv g1f3 d7d5
bestmove g1f3 ponder d7d5

Ход был 1.Nf3. Далее я убил свою Stockfish, начал новую. Опять 20 секунд. Я получил:

info depth 23 seldepth 32 multipv 1 score cp 20 nodes 26185280 nps 1309067 hashfull 999 tbhits 0 time 20003 pv d2d4
bestmove d2d4 ponder g8f6

Это 1.d4! Та же позиция, поиск 20 секунд!

Ты видишь? Оба 20 секунд на переезд, но из-за колебаний в операционной системе Linux мой второй прогон имел более глубокий поиск (26185280> 24325860).

Обратите внимание, что этот небольшой эксперимент даже не был многопоточным (количество потоков = 1). Многопоточность сделает вещи еще более недетерминированными.

Стокфишу давали одну минуту за ход в матче Google AlphaZero. Количество потоков было 64. Решения Stockfish в матче не могли быть детерминированными.

SmallChess
источник
Действительно, очень поучительный пример и замечание.
user929304
отлично! классная идея, чтобы продемонстрировать даже случай 1 потока.
Элли
Спасибо за ответ. Глупый дополнительный вопрос: что такое узел (в контексте игровых движков)?
Очарование
@ user3727079 Узлы - это вершины (уникальные позиции) в дереве игры . Например, если корневой узел является начальной позицией, то у него есть 20 дочерних узлов, которые являются 20 уникальными законными позициями, которые находятся на расстоянии одного слоя от корня.
Элли