Если я получу два двигателя, которые будут играть друг против друга с одинаковыми цветами, будет ли одна и та же игра получаться каждый раз? Если нет, то откуда берется случайность в игре двигателя? (Пренебрегая вводной книгой, где, если я не ошибаюсь, книга может сказать двигателю выбирать между двумя шагами наугад, поскольку они одинаково хороши.)
Я предполагаю, что есть случайность, потому что в матче Alphazero против Stockfish мы не видели, чтобы одна и та же игра происходила много раз подряд. Однако я не понимаю, почему. Предположительно, единственный способ сделать это состоит в том, чтобы заставить двигатель играть частичное движение иногда, что звучит как сеппуку.
Ответы:
Что касается AlphaZero против Stockfish матча, этот вопрос уже освещался здесь по SmallChess .
AlphaZero в сторону (которая использует специализированную Монте - Карло 1 рутина в исследовании линий игры), который сделан быть недетерминирована по построению для обычных эвристики на основе движков, такие как Stockfish и другие (хотя есть и другие двигатели, имеющие процедуры MC-основанные, AFAIK Рыбка используется , чтобы иметь такую возможность), источник случайности, как правило, является лишь следствием технических аспектов в реализации, а не преднамеренной случайностью, вводимой алгоритмически в процесс принятия решений движком Говоря абстрактно, одной из причин этого является тот факт, что двигатели работают не совсем последовательно (выполнение одной задачи за другой). Вместо этого, чтобы сделать движки более эффективными, они выполняют параллельные поиски в различных ветвях дерева возможных ходов. Они делают это с помощью так называемой многопоточности (или -обработки, но это немного отличается). Таким образом, несколько потоков процессоров одновременновыполнение операций для поиска в дереве (и кеширования оценок посещенных позиций), поэтому представьте, что каждому потоку назначено поддерево. Проблема с этим типом реализации заключается в том, что общее выполнение потоков становится в значительной степени зависимым от всевозможных условий (время ожидания, перестановки ОЗУ, ...), поэтому, в конце концов, основной вариант может быть выбран без разрешения всех других темы, чтобы закончить их поиск.
Это действительно часто случается, потому что механизм настроен на принятие решения в течение определенного времени, поэтому управление временем меняет поведение. Вы также можете отменить это утверждение, сказав: знание алгоритма и реализация подпрограмм детерминированного потока не достаточны для надежного прогнозирования состояния программы после любого времени t. Конечно, если каждый всегда позволяет всем потокам завершить поиск, и во время этого выполнения не было проблем с параллелизмом (например, поток, пытающийся получить доступ к определенному кешу, который недоступен), тогда поведение действительно будет полностью воспроизводимым. учитывая все остальное тоже самое 2 .
1 : Вместе с тем, что благодаря дополнительному обучению (например, самостоятельному воспроизведению) ее нейронная сеть продолжает развиваться (повторно настраиваемые параметры), или, если хотите, функция оценки не имеет постоянного, фиксированного определения (в отличие от движков, основанных на эвристике). ).
2 : Даже тогда, как вы сказали, на начальном уровне, с начальной книгой, иногда механизмом намеренно принимаются случайные решения о том, какой вариант выбрать. Точно так же за пределами начальной фазы могут быть моменты, когда множественные варианты имеют близкие к равным оценки (в пределах разрешения, выбранного для Eval), а затем, в зависимости от дизайна, он может в конечном итоге выбрать один случайным образом. Наконец, на уровне настроек двигателя вы также должны быть осторожны, например, глубина поиска и время обдумывания, выбранное для каждого двигателя (и могут ли они дополнительно рассчитывать время обдумывания друг друга).
источник
Спасибо @Phonon за подробное описание моих предыдущих ответов. Я хотел бы добавить еще один момент: контроль времени .
Единственный детерминированный контроль времени - по количеству узлов , но это редко. Гораздо более распространенный контроль времени - фиксированное количество секунд или игровое время, как правило, не являются детерминированными.
Давайте попробуем пример. Запустите stockfish на своем терминале. Тип:
Эта команда указывает двигателю сделать ход через 20 секунд. Мои результаты:
Ход был 1.Nf3. Далее я убил свою Stockfish, начал новую. Опять 20 секунд. Я получил:
Это 1.d4! Та же позиция, поиск 20 секунд!
Ты видишь? Оба 20 секунд на переезд, но из-за колебаний в операционной системе Linux мой второй прогон имел более глубокий поиск (26185280> 24325860).
Обратите внимание, что этот небольшой эксперимент даже не был многопоточным (количество потоков = 1). Многопоточность сделает вещи еще более недетерминированными.
Стокфишу давали одну минуту за ход в матче Google AlphaZero. Количество потоков было 64. Решения Stockfish в матче не могли быть детерминированными.
источник