Випадковість у грі двигуна


11

Якщо я отримаю два двигуни, щоб грати один проти одного однаковими кольорами, чи буде кожен раз однаковий результат? Якщо ні, звідки береться випадковість у грі двигуна? (Нехтуючи початковою книгою, де, якщо я не помиляюся, книга може сказати двигуну вибрати між двома рухами навмання, оскільки вони однаково хороші.)

Я припускаю, що є випадковість, тому що в матчі Alphazero проти Stockfish ми не отримували одну і ту ж гру багато разів поспіль. Однак я не розумію, чому. Імовірно, єдиний спосіб зробити це - змусити двигун грати в підрозділ деякий час, що звучить як seppuku.


AlphaZero вчиться граючи, тому після кожної гри її модель оновлюється.
ferit

Додавання малої випадкової величини до оцінки є одним із можливих способів. Я думаю, що рибальство це робить.
hoacin

Відповіді:


8

Що стосується AlphaZero проти Stockfish матчу, це питання вже висвітлювався тут по SmallChess .

Убік AlphaZero (який використовує спеціалізовану процедуру Монте-Карло- 1 у дослідженні ігрових ліній), яка не є детермінованою за конструкцією, для звичайних шахових двигунів, заснованих на евристиці, таких як Stockfish та інших (хоча є й інші Двигуни, які мають підпрограми на основі МС , таку функцію використовував AFAIK Rybka), джерело випадковості, як правило, є лише наслідком технічних аспектів впровадження, а не навмисної випадковості, яка алгоритмічно вводиться в процес прийняття рішень двигуном. Безумовно, однією з причин цього є той факт, що двигуни не працюють в чисто послідовному порядку (виконуючи одне завдання за іншим). Натомість, щоб зробити двигуни ефективнішими, вони виконують паралельний пошук у різних галузях дерева можливих рухів. Вони роблять це через те, що називається багатопотоковою (або -обробною, але це трохи інакше). Таким чином, декілька потоків процесорів одночасновиконуючи операції з пошуку дерева (і кешування оцінок відвіданих позицій), тому уявіть, що кожному потоку присвоюється піддерево. Проблема такого способу реалізації полягає в тому, що загальне виконання потоків стає сильно залежним від різного роду умов (тривалість очікування, заміна оперативної пам’яті, ...), тому врешті-решт може бути обрана основна варіація, не допускаючи всіх інших нитки для завершення пошуку.

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


1 : Разом з тим, що завдяки додатковому навчанню (наприклад, самоіграванню) його нейронна мережа продовжує розвиватися (переналагоджені параметри), або, якщо ви будете, її функція оцінювання не має постійного, фіксованого визначення (на відміну від двигунів, заснованих на евристиці) ).

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


6

Завдяки @Phonon детально висвітлює мої попередні відповіді. Я хотів би додати ще один момент: контроль часу .

Єдиний детермінований контроль часу - за кількістю вузлів , але це нечасто. Набагато більш поширений контроль часу - фіксована кількість секунд або час гри, як правило, не детерміновані.

Спробуємо приклад. Запустити рибалку на своєму терміналі. Тип:

йти час пересування 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. Далі я вбив мого запаса, почав новий. Знову 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 Stockfish отримав одну хвилину за хід. Кількість ниток становила 64. Рішення запасів у матчі не могли бути детермінованими.


Дійсно, дуже повчальний приклад та зауваження.
user929304

приємно! прикольна ідея продемонструвати навіть корпус з 1 ниткою.
Еллі

Дякую за відповідь. Дурне наступне запитання: що таке вузол (в контексті шахових двигунів)?
Allure

@ user3727079 Вузли - вершини (унікальні позиції) в ігровому дереві . Наприклад, якщо кореневий вузол є початковою позицією, то він має 20 дочірніх вузлів, це 20 унікальних юридичних позицій, що знаходяться в одному шарі від кореня.
Еллі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.