Движки


  • T

    Обсуждение шахматных движков



  • Я так понял( совершенно не вникая и совершенно не разбираясь в вопросе), что 1. Обучается нейросеть на партиях ( механизмы разные, в том числе на самообучении , но в последнее время и наигрывая даже с любыми пожелавшими поучаствовать). 2, Обученная сеть ( и их уже достаточно много и они как-то различаются по характеристикам) выкладывается в доступ. 3. Любой желающий скачивает уже готовуюсеть на свои ресурсы и использует при игре, в зависимости от железа будет разная глубина и скорость анализа, но в целом тут все примерно в одном положении.4. Плюс "обычные "движки для проверки и для поддержки ( и какой-то шахматный опыт и здравый смысл ☺ самого игрока).
    Отсюда вопросы новичка ( чтобы расставить по местам и др. причинам, это может быть полезным):

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

    2. Сколько по ресурсам обучить шахматную среднюю сеть на среднем железе ( или облаке со средними данными). Хотя бы примерные данные. Время, количество данных/партий и другое.

    3. Есть ли смысл ( скорее всего есть, но непонятно в каких направлениях) обучать свою сеть/подсеть. Добавлять свою сеть ( подсеть), обучая ее по своим характеристикам( например, Комсюк решил играть в турнире французские структуры- обучаем сеть на таких данных). Обучать можно и на странных в первом взгляде характеристиках- повышение общей результативности ( агрессивность) и т.п.
      Обучить совсем маленькую сеть совсем несложно, тут совсем не нужно даже быть специалистом. Тут чаще вопрос- на чем обучать, с какими целями, на каких тонкостях и данных такие небольшие подсети ( то есть может ли это дать выгоду и какую по отношению к тем, кто этого не делает).

    4. То есть вопрос- не использовать лишь готовое, но и придумать что-то дополнительное-. Как в этом направлении работают- какие есть данные? Кроме нейросетей ведь много по анализу данных и ИИ.

    Пока все, может быть, потом какие-то вопросы еще будут .


  • T

    Участник @xajik написал в Движки:

    Я так понял( совершенно не вникая и совершенно не разбираясь в вопросе), что

    Я тоже пока не большой специалист.

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

    Да, почти всё на самообучении. Игра с другими, наверное, всё-таки больше для контроля, потому что там партий не так много, чтобы обучать.

    • Обученная сеть ( и их уже достаточно много и они как-то различаются по характеристикам) выкладывается в доступ.

    Да. Сетей выложена тьма, и надо ещё знать, какую лучше скачать.

    • Любой желающий скачивает уже готовуюсеть на свои ресурсы и использует при игре, в зависимости от железа будет разная глубина и скорость анализа, но в целом тут все примерно в одном положении.

    Да.

    Отсюда вопросы новичка ( чтобы расставить по местам и др. причинам, это может быть полезным):

    • Сколько сетей люди обучают сами , по другим характеристикам ( например, играют только французскую или только определенные структуры) ?. Читал недавно по сетям по эндшпилям, но это была маленькая сеть и в что-то серьезное не развилось - в той ссылке-больше не знаю. Возможно, что сетки развиваются хорошо по разным "шахматным темам")

    Есть энтузиасты, которые что-то там децентрализованно обучают. Да, типа какие-то отдельные нюансы шахмат. Не знаю, насколько их много и не уверен, что это сильно полезно.

    • Сколько по ресурсам обучить шахматную среднюю сеть на среднем железе ( или облаке со средними данными). Хотя бы примерные данные. Время, количество данных/партий и другое.

    Тут временные рамки сложно провести. Ну, вот Лилу уже год или уже больше обучают достаточно много людей. А так, чтобы играла на 3-й разряд - наверное, и один человек со своей видеокартой справится за какое-то разумное время.

    • Есть ли смысл ( скорее всего есть, но непонятно в каких направлениях) обучать свою сеть/подсеть. Добавлять свою сеть ( подсеть), обучая ее по своим характеристикам( например, Комсюк решил играть в турнире французские структуры- обучаем сеть на таких данных). Обучать можно и на странных в первом взгляде характеристиках- повышение общей результативности ( агрессивность) и т.п.

    Т.е., типа взять лучшую на данный момент сеть, переписать обучающий скрипт, чтобы ставил только французскую защиту и начать обучать? Думаю, прибавку в силе особо не заметишь. И пока будешь обучать, основная сеть, над которой трудится много энтузиастов, уйдёт далеко вперёд по силе, и не будет смысла использовать свою. 🙂

    Обучить совсем маленькую сеть совсем несложно, тут совсем не нужно даже быть специалистом.

    А, по-моему, что большая, что маленькая - нужно быть одинаково хорошим специалистом. Просто большая требует больше вложений времени на обучение.

    Тут чаще вопрос- на чем обучать, с какими целями, на каких тонкостях и данных такие небольшие подсети ( то есть может ли это дать выгоду и какую по отношению к тем, кто этого не делает).

    Думаю, выгоду трудно будет извлечь.

    • То есть вопрос- не использовать лишь готовое, но и придумать что-то дополнительное-. Как в этом направлении работают- какие есть данные? Кроме нейросетей ведь много по анализу данных и ИИ.

    Можно работать в направлении улучшения алгоритма поиска MCST (и его параметров), который используется в LC0. Или какой-нибудь другой алгоритм придумать.



  • Я понял (скорее вспомнил, но все равно не разбирался, поэтому не понимаю), что движок даже на нейросети поставлен- утрировано "сеть"дает позиционный выбор, движок проверяет на ошибки, копая немного в глубину. Как происходит конкретно поиск в глубину вариантов- не разбирался даже поверхностно, но вопрос занятный.

    Т.е., типа взять лучшую на данный момент сеть, переписать обучающий скрипт, чтобы ставил только французскую защиту и начать обучать?

    Нет, смысл вопроса был в постройке новой своей сетки, может быть даже небольшой и действующей только в дебюте или в определенных пешечно-структурных моментах. Ведь сетки можно соединять в блоки ( хотя не знаю как, конечно), например вначале ставим свою слабую "французскую сетку"-которая действует при каких-то условиях (условно в дебюте и в типично французских структурах)- дальше идет основная сеть ( общая для всех), которая и делает основной выбор хода. То есть начальная "условно французская сетка" ( может быть любого назначения-например, сетка чтобы повысить результативность или иное) отсеивает сразу множество вариантов, подавая ограниченный выбор на вход основной сети.
    Я не знаю, наскольк хорошо такой метод работает, но где-то "слышал", что набором мелких ( и относительно слабых) сеток, в одном блоке могут заменить большую сетку. То есть в теории, возможно, слабая ( но точно подобранная) сеть в связке с общей сетью может реально повысить уровень ( решения). В этом случае нам не нужна сильная и большая сеть в связке с другой большой- они будут перекрывать друг друга, нам нужна точечная сеть под "одну задачу" ( играть условную французскую защиту), которая улучшит основную сеть.
    В математическом смысле, ведь нейросеть-это матрица, в случае с Лилой-она очень большая , во множество слоев.Любую большую можно разбить на множество мелких-на "точечные", если угодно. В идеале мы хотим взять необходимые точечные сети для нашего конкретного случая,отбросив ненужные( коорые могут ухудшать)?
    Не знаю, как это выглядит конкретно в математической теории даже на уровне интуиции ( еще недавно не было четкого понимания как это работает, может быть и сегодня нет). Также практика может не совпадать с этими "умозаключениями"☺

    А, по-моему, что большая, что маленькая - нужно быть одинаково хорошим специалистом. Просто большая требует больше вложений времени на обучение.

    Нет, на сегодняшний день не нужно. Это уже инженерная специальность и даже не среденго звена если брать базовый уровень, утрировано-слабую сеть можно сделать на "уровне ПТУ". Среды ( воркфлоу), где они просто собираются, как конструктор и потом подаются данные на вход- и с разными настройками она сама обучается. Конечно, хорошо бы в этом разбираться, но для базовых вещей- уже совершенно не обязательно.



  • Если нейросеть построить по партиям определенного соперника. Число партий одного шахматиста невелико , 5000 можно за день обучить. Потом подстроить сеть под рейтинг ( снизить уровень игры), например, каким-то таким спосбом https://blog.lczero.org/2018/10/understanding-training-against-q-as.html. И потом комбинацией двух сетей- "соперник" плюс "уровень игры" создать -"образ игрока". Так легче подготовиться к определенному сопернику, можно автоматически настроить на поиск усилений в дебютах и поиск уязвимостей в стиле игры.
    Еще вариант- "стравливаем" свою сеть с сетью соперника в нескольких матчах, смотрим на итоги, делаем выводы, улучшаем. Или тестируем "образ игрока" на разных вариациях сетей .В некотором будущем это реализуется, очевидно.Если еще не..


  • T

    Так будет мало информации для обучения. Нужно обучать по партиям всех шахматистов. Многие шахматисты имеют много общего, так что эта информация будет крайне полезна.
    Естественно, давать на вход ID каждого шахматиста, чтобы отличала одного от другого.


  • T

    Нет, на сегодняшний день не нужно. Это уже инженерная специальность и даже не среденго звена если брать базовый уровень, утрировано-слабую сеть можно сделать на "уровне ПТУ". Среды ( воркфлоу), где они просто собираются, как конструктор и потом подаются данные на вход- и с разными настройками она сама обучается. Конечно, хорошо бы в этом разбираться, но для базовых вещей- уже совершенно не обязательно.

    Из такого специалиста ничего хорошего не получится. Он сможет делать только однотипную работу, но в этой отрасли однотипного мало. Шаг в сторону - нужно сделать какое-то изменение - и он ничего уже не поймёт. Я считаю, это по-прежнему научная деятельность - т.е., ПТУшник не справится, и даже простой кодер с верхним образованием не справится.



  • @bulldozer
    А мне кажется, вполне хватит для начала. Тут цель- обнаружить паттерны, слабости и предпочтения игрока. Это можно сделать и нейросетями. Думаю для этогго можно просто , "образ игрока" протестировать на хорошем наборе тестов, которые "проявляют конкретные слабости" и конкретные образы стиля, чтобы автоматически эти паттерны определить ( плюс дебюты, плюс возможности ловли в вариантах- все автоматически). То есть подготовку к противнику почти полностью автоматизировать.
    Обучать на партиях многих-это заглушать и переобучать( в другом смысле, чем обычно понимают) нейросеть. Пока нельзя по АйДИ игрока вычленить конкретную его подсеть из большой сетки- это сложнее.


  • T

    @bulldozer написал:

    Разработчики движков недорабатывают. Если оценка небольшая и не увеличивается, то должна показываться ничья.

    @комс написал :

    как бы реализовать векторное развитие движков?
    Шоб эти гады считали в основном линии, в которых оценка растёт, пусть она изначально и меньше в искомой позе...

    Динамический движок

    Нужно полностью пересмотреть подход к результатам работы движка, потому что это тесно связанные вещи.

    Стокфиш - самый примитивный движок. Насколько понимаю, его вывод - это просто выход его оценочной функции в сантипешках. У Лилы чуть поинтеллектуальнее, но всё равно не то.
    Мой подход следующий.

    Во-первых, выходом оценочной функции позиции должны быть ТРИ числа: вероятности победы pw, ничьей pd и поражения pl. А не одно число - сантипешки, мегапешки или ещё что-то примитивное. Нужно три числа - по количеству результатов партии, согласно правилам игры в шахматы!

    Во-вторых, перед началом работы движка мы должны обозначить ЦЕЛЬ. По умолчанию цель - максимизировать количество набранных очков (1 - победа, 0.5 - ничья, 0 - поражение). Но цель может быть другой. Например, та же максимизация, но правила набирания очков отличны, например, 3 - победа, 1 - ничья, 0 - поражение. Или 9 - победа белыми, 10 - победа чёрными и т.д.
    Цель может быть различной для разных турнирных или матчевых ситуаций или при игре по отличающимся правилам. Бывает так, например, что нас устраивает только победа. И других ситуаций много можно придумать.
    Сейчас же цель движку ставится одна и та же всегда, а именно такая: найти ход, которые даёт оптимальный (в смысле минимакса) для обоих игроков рез-т оценочной ф-и. И это, увы, совсем не то, что нужно в реальной жизни.
    Цель движку будет задаваться простой формулой: тремя коэффициентами, на которые он будет умножать вероятность победы pw, ничьи pd и поражения pl, суммировать их и максимизировать. Например,
    { 2x, x, 0 } - дефолтный набор к-тов. Соответствует максимизации ожидаемого рез-та при стандартном начислении очков (1 - 0.5 - 0)
    { x, 0, 0 } - если нас устраивает только победа
    { x, x, 0 } - если нас в равной степени устраивает победа или ничья

    Например, если нам нужно выигрывать, но ничья не совсем плохой результат, то мы можем выбрать такую цель движку: { 0.8, 0.2, 0.0 }.
    И, допустим, возникло две позиции, которые движку нужно сравнить, чтобы понять, какая лучше:
    а) { pw = 0.2, pd = 0.6; pl = 0.2 }
    б) { pw = 0.3, pd = 0.4; pl = 0.3 }
    У них равные мат.ожидания результата по стандартным правилам. Т.е., в обычной ситуации движок мог бы пойти на любую из них, потому что ему пофиг на результативность - главное, чтобы мат.ожидание было лучше. А тут МО одинаковы. Но нам нужна победа, и мы задавали соответствующую цель. И движок должен выбрать вариант б, потому что 0.3*0.8 + 0.4*0.2 + 0.3*0.0 = 0.32 больше, чем 0.2*0.8 + 0.6*0.2 + 0.2*0.0 = 0.28.

    Вот после того, как это будет реализовано, возможно появление "в-третьих", а именно то, что написал @Комс, и об этом см. ниже.

    В-третьих, на самом деле в вычислениях чуть выше должен использоваться не вектор { pw, pd, pl }, а вектор, который назовём { Pw, Pd, Pl }. Большими буквами я символизирую, что вероятности эти - не просто из оценочной фунции, а из дополнительной оценочной ф-ии, которая является надстройкой над существующей "примитивной". Т.е., окончательный вывод движка берётся из оценочной ф-ии, которая принимает во внимание динамическое изменение оценки позиции во времени - через каждые несколько секунд анализа изменения оценки фиксируются и положительная динамика даёт положительную коррекцию оценке.


    Почему я увязал создание динамического движка с переходом на три числа вместо одного в оценке - потому что указанная надстройка над "примитивной" оценочной функцией наверняка потребует на вход полный набор вероятностей, а не абстрактные сантипешки, которые мало что говорят об ожидаемой частоте соотношения побед/ничьих и никак не учитывают нашу цель в партии. Во всяком случае, мне так кажется.



  • Участник @bulldozer написал в Движки:

    Во-первых, выходом оценочной функции позиции должны быть ТРИ числа: вероятности победы pw, ничьей pd и поражения pl. А не одно число - сантипешки, мегапешки или ещё что-то примитивное. Нужно три числа - по количеству результатов партии

    во-первых, а сразу же и в последних, это только Лила может сделать, считая по методу Монте-Карло
    Стокфишу на это насрать, он не знает статистики закончившихся партий


  • T

    Участник @комс написал в Движки:

    Участник @bulldozer написал в Движки:

    Во-первых, выходом оценочной функции позиции должны быть ТРИ числа: вероятности победы pw, ничьей pd и поражения pl. А не одно число - сантипешки, мегапешки или ещё что-то примитивное. Нужно три числа - по количеству результатов партии

    во-первых, а сразу же и в последних, это только Лила может сделать, считая по методу Монте-Карло
    Стокфишу на это насрать, он не знает статистики закончившихся партий

    Это необязательно должно приходить из статистики сыгранных партий. Может использоваться и экспертный метод. Т.е., Стокфишу никто не мешает доработать оценочную функцию так, чтобы она оценивала вероятности победы, ничьей и поражения. Почему метод называется экспертным - потому что знания экспертов кладутся в основу формул оценочной ф-ии.
    Понятно, конечно, что это будет менее точно, чем у Лилы.



  • Участник @bulldozer написал в Движки:

    Т.е., Стокфишу никто не мешает доработать оценочную функцию так, чтобы она оценивала вероятности победы, ничьей и поражения.

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

    Обратная сторона медали - пересчёт вероятностей Лилы в сантипешки
    Пурга это всё, ИМХО

    З.Ы. но как Лилька считает основную ветку, мне нравится!
    Даже если она и зевнёт в матче движков, то на адвансе её всегда можно проверить


  • T

    Участник @комс написал в Движки:

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

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

    Пурга это всё, ИМХО

    Не скажи. Реальный пример - Лила сейчас не попала в суперфинал, потому что слишком осторожно играла с лохами в круговом турнире. Если бы ей установить правильную цель типа "отчаянно бить лохов, а с фаворитами не рисковать", то такое могло бы не произойти. И тогда без вероятностей трёх исходов партии тут не обойтись - сантипешки не подойдут.



  • Участник @bulldozer написал в Движки:

    Если бы ей установить правильную цель типа "отчаянно бить лохов, а с фаворитами не рисковать", то такое могло бы не произойти.

    это называется contempt



  • Участник @bulldozer написал в Движки:

    И тогда без вероятностей трёх исходов партии тут не обойтись - сантипешки не подойдут.

    она и считает в вероятностях исходов, сантипешки ей придумали для визуализации для лохов-зрителей



  • досадно, что никто не оценил мою демку про сантипешки
    http://kasparovchess.crestbook.com/threads/6461/page-43#post-921465



  • а там про хобот?



  • @комс 🙂 это пусть каждый сам решает про что, в меру испорченности



  • я лайкнул про хобот, ничего не знаю...



  • У животных еще хвост есть)


  • T

    Есть ли какой набор тестов для движков, на котором можно сравнить разные движки, не устраивая никаких битв? Особенно это актуально для Лилы - так можно быстро сравнивать разные НН. Запустил на одной сети - задача решена за две минуты, на другой - за минуту. И уже понимаем, что вторая сеть лучше.
    Только, получается, примеры нужны не простые, а хитрые - которые вот прям сразу не показывают правильный ход, а нужно подумать какое-то время. Навроде этюда ван Брекелена.



  • тесты в основном на тактику, Влад
    А Лила как раз и не сильна в этом


  • T

    Позиционные задачи никто же не мешает создать. Понятно, что они сложнее, но тем не менее.



  • поищи в инете тест "ночной кошмар II", не помню, как по-английски
    Там есть даже поза из Полугаевский - Торре, 1982

    Или завтра скину
    Но оболочка Фритц будет нужна, как ни крути


  • T

    Пост, в общем-то, посвящается @Комс.

    Меня не устраивает ширина поиска в Лиле и я играюсь с настройками с целью сделать так, чтобы слабые ходы получали больше времени.

    В Лиле используется алгоритм UCT, и есть такая формула (1):

    Cpuct' = Cpuct + CpuctFactor * ln((Nodes + CpuctBase)/CpuctBase)
    

    Это была основная формула. Можно, если нужно, выразить Nodes. Формула (2):

    Nodes = CpuctBase * (e^((Cpuct' - Cpuct)/CpuctFactor) - 1)
    

    Или выразить CpuctBase. Формула (3):

    CpuctBase = Nodes / (e^((Cpuct' - Cpuct)/CpuctFactor) - 1)
    

    Объясню формулу (1). Это всё конфигурационные параметры движка, кроме Cpuct' (это вычисляемый) и Nodes (сколько просмотрено узлов на данный момент при анализе ДАННОГО узла).
    Из описания алгоритма известно, что баланс exploitation - exploration сдвигается вправо тем больше, чем больше Cpuct'. Т.е., чтобы поиск сделать шире, нужно увеличивать Cpuct', чего можно достичь увеличением Cpuct, или CpuctFactor, или уменьшением CpuctBase. И, само собой, при увеличении Nodes поиск расширяется автоматически.
    Для каждого хода-кандидата вычисляется его приоритетность, а именно Cpuct' плюс некоторое слагаемое, с которым я особо не разбирался пока (оно зависит от оценки хода), и выбирается тот ход-кандидат, у которого сумма больше. Т.е., приоритетность хода-кандидата зависит от нодесов, просмотренных во время анализа этого хода ранее, от оценки хода и от конфигурационных параметров.

    По дефолту такие значения:

    ? = 3 + 2 * ln((Nodes + 19652)/19652)
    

    При дефолтных значениях динамика получается следующая.
    Когда Nodes = 0 (т.е., свежий ход), то Cpuct' = 3.
    Когда Nodes = 33K, то Cpuct' = 5.
    и т.д., вот таблица:

    Nodes Time* Cpuct'
    0 0 3
    33K 3 sec 5
    125K 12 sec 7
    375K 37 sec 9
    1M 100 sec 11
    3M 5 min 13
    8M 13 min 15
    22M 37 min 17
    59M 98 min 19

    *Время указано на моей текущей конфигурации железа и софта. Может отличаться для разных видеокарт и нейросетей. Для справки: на RTX 2060 с нейросетью T40B.4-260 скорость расчёта примерно 10K nodes/sec = 600 Knodes/min = 36M nodes/hr.
    Указано потраченное время только на обдумывание этого хода, но не других ходов-кандидатов.

    Если я держу движок уже 13 минут на ходе (причём, это означает общее время анализа уже намного больше, если этот ход не на первой линии!), то мне кажется, это значит, что я хочу уже широкого анализа, а не додрачивания оценки лучшего хода. Меня как-то не очень устраивает, что Cpuct' для 5 минут и 13 минут отличается так мало. Временно снимается - пока не понимаю полностью, как это всё работает.

    Можно крутить CpuctBase. Я ещё буду дописывать этот пост.