![]() |
![]() |
![]() |
![]() |
Учим нейросеть принимать решения на основе уже известного опыта (на примере Шахмат и загруженного датасета) |
|
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2023-03-14 13:20 Учим нейросеть играть в Шахматы, загрузив в нее датасеты уже сыгранных партий с известным результатом. Если убрать «антураж», то в общем виде получаем стандартные для машинного обучения задачи классификации и ранжирования. Соответственно, и решать начнем «стандартными» способами. Общий ход реализации
Конечно, в идеале было бы не давать модели даже правила игры. Пусть нейросеть самостоятельно так выискивает закономерности, что даже сама ходит по правилам. Но это уже на следующем уровне, на первом же этапе принудительно ограничим выбор модели имеющимися правилами. Как кодировать данные Стандартный и важнейший вопрос при обработке данных - в каком виде предоставить данные для обучения. Распространенным вариантом кодирования положения на шахматной доске является FEN, пример выглядит так: rnbqkbnr/pp4pp/2p1p3/8/3P4/5N2/PP2PPPP/RNBQKB1R b KQkq - 1 5 Также есть различные варианты записи истории ходов, пример выглядит так: d4 Nc6 e4 e5 f4 f6 dxe5 fxe5 fxe5 Nxe5 Qd4 Nc6 Qe5+ Nxe5 c4 Bb4+ В таком случае можно назначить цифру каждой клетке поля и каждой фигуре. Тогда положение на доске принимает уже более привычный вид для обработки данных: Обязательно следует поэкспериментировать с тем, каким образом назначать цифры. Все числа подряд, или ряд Фибоначчи, или пешки к пешкам, или One?Hot?Coding и так далее. Все это следует перебрать и протестировать. Займемся этим на этапе тюнинга и улучшений, а стартовать нужно хоть с чего?то, чтобы представлять общую картину, поэтому для старта пусть все числа идут подряд. Готовим данные Программируем на python в Colab Устанавливаем библиотеки !pip install chess Нашли условно подходящий открытый датасет на Kaggle. Загружаем датасет
Создаем массивы данных. На данный момент у нас 20058 историй и в них 98787 комбинаций. При этом для сокращения времени на старте берем в истории только первые 10 записей, то есть только первые 5 ходов. Теперь нужно вытащить уникальные комбинации и снабдить их показателями. Получаем 27 536 уникальных комбинаций с показателями успешности. Возможно, стоило бы выделить 3 класса: победа, проигрыш, ничья. Также возможно, стоило бы выделить еще больше классов, например, по длительности партии. То есть комбинация еще более успешная, если игра закончилась быстро, но это на этапе последующих улучшений. Для старта оставляем всего два класса: победа / не победа. Возможные аномалии Понимаем, что наш датасет абсолютно сырой и возможны различные аномалии. 1. Мы не знаем реальное качество партий. Партии могут быть такими, что качество комбинаций в них может не коррелировать с конечным результатом партии. 2. Игрок может сделать откровенно слабый ход, а потом собраться и выиграть партию. В итоге комбинация будет считаться «успешной». И наоборот, возможен сильный ход и очень сильное положение на доске, но по итогу игрок проиграл, комбинация будет считаться «неуспешной». 3. Некоторые ходы встречаются очень много раз. И некоторые комбинации встречаются очень много раз. Если комбинация встречается несколько тысяч раз и у нее показатель успешности 0.55, то на это уже можно ориентироваться. А если игрок сделал редкий ход, и при этом выиграл, то в итоге комбинация встречается 1 раз, и у нее показатель побед 100%. Понимаем, что применение комбинации всего 1 раз ничего не говорит о ее успешности, но с точки зрения применяемого подхода, это очень успешная комбинация и модель будет ее рекомендовать. То же самое и комбинациями, которые встречаются, например, 3 раза. Показатель успешности может быть 0.67, и это очень успешная позиция, хотя на самом деле может таковой и не являться. То есть нужно определять, какие ходы «шумят» и убирать их из обучения. Таким образом, со временем применяемые датасеты нужно будет «чистить». В идеале, чтобы именно комбинация получала оценку специалистов. Ну а стартовать будем с реальным «грязно?шумным» датасетом. Заодно и посмотрим, с чем столкнемся при получении сырых датасетов с реальных шахматных соревнований. Показатели успешности первого хода Ради интереса посмотрим на показатели самого первого хода.
Видим, что на все 20 доступных ходов первого хода белых есть данные: игрались столько-то раз и с таким-то успехом. В общем-то показатели соответствует общепринятой шахматной логике. Видно, что чаще всего первым ходом с огромным перевесом играют e2e4, потом по количеству повторов идет d2d4, потом рядышком g1f3 и c2c4 и где-то далеко потом все остальное. При этом e2e4, g1f3 и c2c4 превышают 0.5, у а d2d4 очень близко, на грани погрешности (0.499), то есть да, ходы сильные, приводят к победе и потому так часто применяются. Также видим и откровенно редкие, и откровенно слабые, то есть в данном случае "неуспешные" ходы. Интересно, что не у самых распространенных и при этом не самых редких ходов показатели успешности могут быть выше, чем у самых распространенных. Ход c2c3, например, довольно средний по повторяемости, но при этом 0.55 по успешности, то есть выше, чем e2e4 и c2c4. Как это возможно трактовать? Возможно, что самыми распространенными ходами играть условно легче и стабильнее, но и черные научились против них хорошо защищаться, а вот более редкие варианты у черных уже менее проработаны, а белые специально тренировались, поэтому в конкретных случаях выигрывают чаще. Но, как говорится в известной шутке, это не точно. Или, академическим языком, это гипотеза. Так или иначе, было бы хорошо, если бы на все ходы была бы такая же таблица и было бы возможно просто выбирать самый успешный ход. Однако на практике наблюдается такое количество вариантов, что в датасете их просто нет. Поэтому будем обучать модель выявлять закономерности успешных ходов и делать соответствующие ходы с учетом выявленных закономерностей. Готовим данные для анализа второго хода Для начального тестирования рассматриваем сторону белых. Понимаем, что обучать модель на 20 позициях нет никакого смысла, поэтому для примера и тестирования будем обучать со второго хода. Создаем массив уникальных комбинаций второго хода белых с показателями успешности. Получаем 962 уникальные комбинации второго хода белых с показателями успешности. Нехитрым перебором получаем, что общее количество доступных комбинаций на втором ходе белых составляет 8902, а в нашем датасете есть только 962. Видим, какая примерно часть реально «проработана игроками», а какая будет для нейросети новой. Создаем массив соответствий уникальных комбинаций fen и собственной кодировки доски. В принципе, мы могли бы сразу добавить собственную кодировку в общий массив fen_massive_counter, но это представляется неудобным, так как с кодировками возможна отдельная работа, поэтому лучше отдельно вести работу с кодировками, а отдельно иметь общее место, где они находятся в соответствии. Так возможно впоследствии проводить сопоставление при любых последующих преобразованиях кодировок. В общем, это возможно при необходимости улучшить, а пока для идентификации оставляем так. Готовим привычные x_train, y_train. x_train будет представлять набор сыгранных комбинаций второго хода белых. train традиционно будет содержать метку класса, причем 1, если побед больше 0.5, и 0 в обратном случае. Данные готовы, можно переходить к модели. Обучаем модель второму ходу По сути решаем стандартные задачи классификации и ранжирования. Чтобы примериться, начнем «условно стандартно» для задач подобного рода — нейронная сеть прямого распространения, 128 признаков, Adam, sigmoid, binary_crossentropy Пример первых запусков: ![]() ![]() Видим, что модель ведет себя «как по учебнику», то есть ошибка тренировочной выборки постепенно уменьшается, а ошибка валидационной выборки уменьшается 20–30 эпох и зависает. Соответственно точность тренировочной выборки постепенно повышается, а точность валидационной выборки повышается 20–30 эпох и зависает. Предварительная трактовка первых запусков
Ключевой и переломный момент ![]() Нехитрым перебором получаем оценки модели для всех возможных комбинаций второго хода белых, и уже видим интересные результаты. Если принудительно походить за модель первым ходом e2e4, то в большинстве случаев после ответного хода черных модель будет выводить слона f1c4, что в общем?то соответствует шахматной логике многих партий. И это без минимакса, без книги дебютов, без подсчета общей стоимости фигур, без подсчета атакуемых и защищаемых полей и прочее и прочее. Модель просто посмотрела (!) на вторые ходы сыгранных партий с известным результатом, и «сама решила», что после e2e4 нужно выводить слона f1c4. В общем, это возможно признать ключевым и переломным моментом, потому как видно, что концепт рабочий, и дальше только «рутина» по улучшению. Другие наблюдения:
Еще раз обратим внимание: это не перечень часто встречающихся ходов, взятых из таблицы по количеству повторов, а это модель сама выбрала эти ходы, подобрав соответствующие коэффициенты в ходе машинного обучения! Конечно, не обошлось и без «ляпов». Например, после «принудительных» d2d3 или d2d4 модель ходит то c1f4, то c1h6. С одной стороны, возвращаемся к абзацу про аномалии датасета. С другой стороны — а является ли ход c1h6 действительно таким слабым. Это мне на моем любительском уровне ход кажется слабым, точнее — непревычным, а модель решила одной жертвой сдвоить оппоненту пешки на крайней линии, заблокировать ладью, лишить коня и слона выхода на h6 — непревычно, но не так уж и однозначно. В общем видим, что в большинстве случаев модель ведет себя достаточно адекватно и делает «вполне осмысленные» ходы, соответствующие распространенным шахматным дебютам, и это всего лишь после того, как пару минут посмотрела на игру других игроков и результаты партий. То есть в полном смысле слова научилась, наблюдая за другими. Базовый принцип анализа ходов Базовый принцип анализа ходов одинаков: готовим из датасета выборку для данного хода (также как и для второго хода) и запускаем модель. Например, для пятого хода это будет так:
В принципе, на данном этапе результаты по ходам схожие. ![]() ![]() Возможно, делать выборку по каждому ходу не совсем оптимально. С другой стороны, объединить все ходы в одну выборку тоже неправильно, поскольку закономерности, например, в начале партии на 2–4 ходах могут сильно отличаться от закономерностей на 10-х ходах и 20-х ходах. В конечном итоге на этапе тюнинга и улучшений следует подобрать параметры «скользящего окна», то есть, например, для анализа 20-го хода обобщать закономерности 19–21 ходов. Как нейросеть делает ход Начало партии задается одинаково: Далее в любой момент ход делается командой из библиотеки, например: А модель ходит так: То есть модель смотрит доступные ходы для данной ситуации (обычно их порядка 20–30), прогоняет доступные ходы через коэффициенты, полученные на этапе обучения, и выбирает самый «успешный» ход, то есть ход, максимально приближенный к 1. Посмотреть все ходы в порядке убывания возможно так: Результат. Общий вывод. Концепт рабочий, в большинстве случаев модель (прототип) ведет себя достаточно адекватно и делает «вполне осмысленные» ходы. Во время игры модель отвечает «мгновенно», и это всего лишь после того, как модель посмотрела на игру других игроков и результаты партий. То есть в полном смысле слова научилась, наблюдая за другими. В общем, начало положено. Дальше только повышать точность. Как повышать точность. Для повышения точности запланировано следующее:
Источник: habr.com Комментарии: |
|