Створення шахового двигуна, машинне навчання проти традиційного двигуна?


17

Я одночасно завзятий шахіст і комп'ютерний програміст. Я б сказав, що грати в шахи та програмування - це дві речі, на які я витрачаю найбільше часу. Природно, я хочу створити власний двигун і, зрештою, бот Lichess.

У зв'язку з нищівною ефективністю AlphaZero проти Stockfish минулого року, я розглядаю, чи варто створити цей двигун за допомогою машинного навчання (якийсь тип нейронної мережі, можливо, використовуючи Tensorflow) або традиційної, жорсткої кодованої евристики.

Я менш знайомий з нейронними мережами, ніж інші види жорсткого кодування. Все-таки це міг би бути гарним способом навчитися працювати з нейронними мережами.

Ще одна річ, яку я розглядаю - чи важливо, якою мовою я користуюся для кодування двигуна. Я знаю, що багато шахових двигунів використовують C ++, якого я ніколи раніше не використовував. Я використовував інші мови на основі С, які роблять багато одних і тих же речей, з синтаксисом, в основному різним. Я найбільше знайомий зі Swift та Javascript, але я також знайомий з Python і вважаю, що це може зробити для мене трюк.

Тож, з точки зору створення найсильнішого шахового двигуна, я повинен перейти на нейронну мережу чи жорсткий код?


4
Вони важливі для нових двигунів AI - це не стільки NN, скільки навчання. RL - це складна тема, але є хороші вступні ресурси в Інтернеті, такі як лекції Девіда Сілвер в UCL (слайди на його веб-сайті та лекції на YouTube. Він працював з Deepmind і традиційно висвітлював альфаго в останній лекції. Ви, мабуть, могли б розробити цікавий А.І. двигун без NN з використанням жорсткої кодованої евристики та RL. Так починається альфаго!
asac

Це не шахи, але нещодавня книга «Глибоке навчання та гра» показує, як використовувати NN для ігрового двигуна. Alpha-Go і Alpha-Zero схожі під капотом.
Джон Коулман

З огляду на ваш досвід Python, можливо, варто поглянути на Nim
Darren H

Якщо ви хочете зайти в NN, це цікаво: arxiv.org/abs/1509.01549 Є також код на github :)
Ant

@ Зауважте, що Giraffe ніколи не був дуже сильним порівняно з провідними двигунами. (~ 2800 ело)
Оскар Сміт

Відповіді:


8

Перший крок: Визначте свої цілі / причини

Я думаю, що це головний фактор. Хто з них вам найбільше підходить? (Виберіть лише один )

  1. Ви хочете насолодитися цікавим завданням кодування
  2. Ви хочете створити надзвичайно хороший шаховий двигун
  3. Ви хочете дізнатися про те, як працюють шахові двигуни
  4. Ви хочете навчитися / практикувати навички кодування
  5. Ви хочете вивчити / впровадити поняття / теорію інформатики (наприклад, машинне навчання)
  6. (Інший)

ІМО добре «кинути монету» за будь-що, крім 2. Для всіх інших ви досягнете своєї мети, вибираєте ви ML або жорстке кодування. Однак ви, мабуть, хочете порівняння між варіантами, які допоможуть вам прийняти рішення.

Справа для жорсткого кодування

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

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

Також я вважаю, що вам буде легше "розібратися самостійно", якщо ви будете їхати по жорсткому кодуванню, а не через машинне навчання. Менше копіювання матеріалів, які ви не повністю розумієте.

Справа для машинного навчання

Це може бути захоплюючим народити творіння і спостерігати за тим, як він бере своє життя. Хоча жорстке кодування стосується точності та деталізації, машинне навчання є гнучким. Забирайте кілька нейронів, і результат, ймовірно, буде подібним.

Жорстке кодування - це вивчення шахів. Машинне навчання - це вивчення створеної вами істоти.

А машинне навчання - це, звичайно, дуже гаряча тема.

Вибір мови для жорсткого кодування

Я не впевнений, що ви маєте на увазі під "іншими мовами на основі С". C ++ є єдиною основною мовою, що має щось подібне до C. Перевага C / C ++ полягає в тому, що вони швидкі . Незважаючи на те, що інші мови наздогнали впродовж багатьох років, C ++ все ще дає їм заробити свої гроші.

C ++ непростий. Ви отримаєте велику ефективність із більш сучасних мов компіляції, таких як Rust, Golang або Swift. Але це не має бути набагато гірше, якщо ви перейдете на мову JIT. Тобто не використовуйте інтерпретатора CPython ; використовуйте IronPython або Jython, або Node, або C # або Java.

Програмування графічного процесора вимагає іншого підходу, і я б радив цього проти цього.

Вибір мови для машинного навчання

Проблема TensorFlow полягає в тому, що він дуже низький. Йдеться скоріше про написання алгоритмів розбивання чисел (які можна вирішити на паралельному апаратному забезпеченні), ніж про інтерфейс, присвячений машинному навчанню.

Звичайно, це може бути чудовим досвідом навчання! І, безумовно, дуже варто сьогодні вчитися. Однак ви можете почати з Keras або PyTorch.


1
Це феноменальна відповідь, дійсно вражає всі моменти, про які я згадав. Складно сказати, чому саме я хочу зробити двигун. Реально я, швидше за все, не змагатимуся з подібними Stockfish, Komodo та Leela (я врешті-решт лише студентка коледжу). Тим не менш, було б весело бачити, як моя робота піднімається до ніг проти інших двигунів, і не щоразу стискається. Навіть якщо моє основне міркування - зробити сильний двигун, я, швидше за все, вивчу нову мову програмування та вдосконалюю свої шахові знання як побічний продукт виготовлення двигуна.
Девід Шопен

1
Я думаю, що більше всього я хочу щось, що я можу зробити, виховувати та тонко налаштовувати на тривалий термін. Я також хочу проект, який об'єктивно розповість, наскільки хороший мій код (Виграє / Нічиє / Втрати, ELO тощо).
Девід Шопен

1
Це дуже цікава відповідь, але ви серйозно не рекомендуєте «Вузол над Cpython» для проблем щодо продуктивності ?
Євпок

> "C ++ - єдина основна мова, яка є що-небудь на зразок C." C #? Іржа? Java? Є багато мов, які є принаймні "що-небудь на зразок C"
Maaark

Я взяв "як C" як складений, високо оптимізований, реалізований на машині мову з синтаксисом стилю C. C #, Java та PHP використовують усі віртуальні машини, їхній код складений на коди, а не на базі CPU-байт-коду (а компіляція PHP повністю прозора, як Python та Bash). І Іржа не є мейнстрімом. У цьому відношенні лише C ++ є «як C», незважаючи на спільний доступ до стилів синтаксису з кількома іншими мовами.
Гедіпунк

24

Якщо ви намагаєтеся зробити найсильніший двигун можливим, абсолютно використовуйте двигуни NN.

Традиційні двигуни чудові - Stockfish, мабуть, все ще є найсильнішим двигуном на планеті за рівним обладнанням консенсусу - але їх важко написати. Ці двигуни не потрапили там, де вони переночували; їм потрібні роки та роки роботи. Наприклад, рибний запас стабільно набирає успіх протягом шести років . Якщо ви почнете з нуля, ви швидко не досягнете сили біля запасів; насправді ви, швидше за все, затримаєтеся на кілька сотень від того місця, де зараз знаходиться Stockfish. Для порівняння, деякі з найсильніших одноавторних двигунів зараз - Ethereal , Laser та Xiphos (я нехтую Houdini & Fire, оскільки вони не є відкритим кодом). Ці двигуни істотно слабкіші, ніж у Stockfish.

Чому вони настільки слабкіші? Дві причини:

  1. На цьому рівні розробка двигуна вимагає багато обчислювальної потужності. Те, що ви робите, - перегляньте свій код і визначте ідею, яка могла б набути свого часу. Приклад ідеї полягає в тому, що "якщо ми знаємо, що цей крок, мабуть, хороший, не шукайте гілок, які зворотно рухаються" (якщо це для вас не має сенсу, це означає, що також буде крива високого навчання). Потім ви пишете виправлення, яке реалізує ідею, і випробовуєте модифікований двигун на попередній версії. На цьому рівні потрібно десятки тисяч ігор, щоб отримати достатньо великий розмір зразка, щоб сказати, чи ефективний виправлення. Для гри в ці ігри потрібні величезні обчислювальні потужності. Stockfish має доступ до супер обладнання: на час написання, тестовий майданчик для Stockfish Fishtestingпрацює з 1038 ядрами. Для порівняння, типовий настільний комп'ютер може мати 4-8 ядер.

  2. Інша причина полягає в тому, що Stockfish підтримується багатьма мізками. Станом на час написання, тестуються 8 патчів, написаних 5 людьми. Якщо ви переглянете історії патчів, ви знайдете ще багато розробників, які написали патчі. Я не знаю, скільки активних розробників Stockfish є, але це, безумовно,> 20.

З іншого боку, двигуни NN (відносно) легко досягають сили, що значно перевищує Ethereal / Laser / Xiphos. Побачте самі в останньому турнірі Top Chess Engine Championship . Ethereal / Laser / Xiphos є в Лізі 1, що є достатньо надійним, але двигунами у верхньому дивізіоні (Відділ P) є:

  • Риба-тварин (традиційний двигун, що підтримується громадою, працює з Fishtesting)
  • Комодо (комерційний традиційний двигун, має штатних розробників)
  • Komodo MCTS (комерційний напівтрадиційний двигун, має штатних розробників)
  • Худіні (комерційний традиційний двигун - це всеохоплюючі зусилля, не оновлювався два роки)
  • Leela Chess Zero (NN-двигун, що підтримується спільнотою, працює з аналогом Fishtesting, так же багато тонн обладнання)
  • AllieStein (двигун 2-го типу NN)
  • Stoofvlees (двигун NN)
  • ScorpioNN (двигун NN)

Останні три двигуни - AllieStein, Stoofvlees і ScorpioNN - все це невеликі колаборації людей, які, наскільки я знаю, є ентузіастами, як ви, а не штатними розробниками. Вони отримали сили Div P після менш ніж двох років спроб (усі ці двигуни NN з'явилися лише після AlphaZero). Для порівняння, в недавній історії комп’ютерних шахів лише одна людина, яка коли-небудь написала традиційний двигун, який успішно змагався з Stockfish & Komodo самостійно (Роберт Хоударт, автор Худіні).

Це правда, що ви, мабуть, не будете мати обладнання, щоб конкурувати з Lc0, але Lc0 займає стільки обчислювальної потужності, оскільки це "нульовий" двигун - він повинен грати в шахи без будь-якого людського знання, крім правил. Вам не потрібно використовувати ту саму методологію. Ви можете використовувати, наприклад, методику Штейна, яка використовує контрольоване навчання. Це, мабуть, навіть краще, ніж "нуль" - адже Аллієштайн грає у суперфіналі, а не Lc0.

Підсумок такий: якщо ваша мета - конкурувати з найкращими двигунами світу, ви набагато частіше досягнете успіху з двигунами NN, ніж традиційними.


6
Можливо, згадайте іншу сторону вашого висновку: Якщо ваша мета - поглибити своє розуміння шахів, виконуючи якесь програмування, перейдіть до традиційного.
блюз

1
Я погоджуюся з вашим висновком, але я б також рекомендував використовувати недавню мережу з сильного двигуна (з дозволу, звичайно), як вихідну точку, а не починати з нуля (але продовжуйте іншим способом "тренуватися через самовідтворення та оновлення" ваги ", додаючи або видаляючи шари, додаючи вхідні функції, вимагаючи додаткових виходів тощо). Я не можу пригадати, чи Lc0 - це одна голова або подвійна голова, але я вважаю, що 3 головна ( ijcai.org/proceedings/2018/0523.pdf ) наразі не реалізована жодними шаховими двигунами, і це може призвести до покращення стану -мистецтво.
Стівен Джексон

Я думаю, що пошук Аллі робить його сильнішим щодо слабших двигунів (KMCST, Stoofvlees), а не мережі Stein.
мені '

@blues Я думаю, що програмування шахового двигуна насправді не робить кращого шахіста - за винятком Ларрі Кауфмана (одного з розробників Komodo), жоден із найкращих двигунів не назвав гравців розробниками, або їх розробники стали титульовані гравці.
Алюр

@me ', що можливо, але Leelenstein - мережа Штейна, що використовує двійковий код Lc0, і це добре робиться на чемпіонаті з комп'ютерних шахів з шахів, тому мережі Stein принаймні можна порівняти з мережами Lc0.
Алюр

9

Тож, з точки зору створення найсильнішого шахового двигуна, я повинен перейти на нейронну мережу чи жорсткий код?

Не вибирайте мережу, якщо у вас немає доступу до смішних (кілька сотень Nvidia V100). Навчання НН грати в шахи займає стільки обладнання. Побачте людей, які сприяють Lc0, щоб тренувати понад 200 мільйонів ігор. Оскільки у вас, ймовірно, будуть проблеми з доступом до обладнання (ви можете спробувати отримати його в Google Colabatory , але тільки з цим, навчання буде дуже повільним).

Редагувати: Використовуючи мережу NN Завдяки контрольованому навчанню, Ви МОЖЕТЕ піти лише від Google Colab і, можливо, одного міцного GPU (2080, 2080Ti, Radeon VII).

Ще одна річ, яку я розглядаю - чи важливо, якою мовою я користуюся для кодування двигуна. Я знаю, що багато шахових двигунів використовують C ++, якого я ніколи раніше не використовував. Я використовував інші мови на основі С, які роблять багато одних і тих же речей, з синтаксисом, в основному різним. Я найбільше знайомий зі Swift та Javascript, але я також знайомий з Python і вважаю, що це може зробити для мене трюк.

Python та Javascript, ймовірно, занадто повільні для сильного шахового двигуна. Я не використовував Swift, але це, ймовірно, не сподобається платформам, окрім macOS, тому, ймовірно, краще використовувати C або C ++ Ви також можете використовувати Rust, але це багато функцій безпеки, які дратують і вам насправді не потрібні, що може дратувати. Також буде складніше отримати хороші показники, оскільки деякі оптимізації низького рівня важко зробити. Звичайно, ви завжди можете написати це на зборах, але це, мабуть, буде занадто багато роботи. дивіться https://www.chessprogramming.org/Languages/


1
Дивовижно, дякую тонну за інформацію! Я, мабуть, спробую створити API, який займає FEN-позицію та видає обчислений хід. Я вважаю, що це найкращий спосіб інтегруватися з ботами Lichess.
Девід Шопен


1
Чи є можливість реалізувати інший двигун NN, який просто використовує мережу lc0?
RemcoGerlich

1
@RemcoGerlich, наскільки я розумію, двигуни NN використовують дві речі: бінарну та нейронну мережу. Написати бінарне непросто, але навчити нейронну мережу порівняно легко. У цьому сенсі похідні Lc0 вже існують - Leelenstein & Deus X (ака. Fat Fritz) є такими похідними.
Алюр

@ RemcoGerlich у такому випадку, що насправді не був би іншим двигуном, це був би двигун Ic0 з просто іншим обгортанням / інтерфейсом / будь-яким іншим.
Петеріс

3

Я створив двигун із шахових іграшок, використовуючи: шахи python, це було дуже приємно, не потрібно кодувати правила гри самостійно і просто зосередитися на логіці; однак кількість позицій, які я зміг оцінити за секунду, дуже мала. Це може бути хорошою відправною точкою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.