Я делаю шахматный движок, используя машинное обучение, и у меня возникают проблемы с его отладкой. Мне нужна помощь, чтобы выяснить, что не так с моей программой, и я был бы признателен за любую помощь.
Я провел исследование и позаимствовал идеи из нескольких успешных проектов. Идея состоит в том, чтобы использовать обучение с подкреплением, чтобы научить Н.Н. различать сильные и слабые позиции.
Я собрал 3 миллиона игр с Elo за 2000 и использовал свой собственный метод для их маркировки. Изучив сотни игр, я обнаружил, что можно с уверенностью предположить, что в последние 10 ходов любой игры баланс не меняется, и у выигравшей стороны есть сильное преимущество. Поэтому я выбрал позиции за последние 10 ходов и сделал две метки: одну для победы белых и ноль для черных. Я не включал никаких позиций ничьей. Чтобы избежать предвзятости, я выбрал четное количество позиций, помеченных выигрышами для обеих сторон, и четное количество позиций для обеих сторон в следующем ходу.
Каждая позиция I представлена вектором длиной 773 элемента. Каждую фигуру на каждом квадрате шахматной доски вместе с правами на рокировку и следующий ход я кодировал единицами и нулями. Моя последовательная модель имеет входной слой с 773 нейронами и выходной слой с одним нейроном. Я использовал MLP с тремя скрытыми слоями с 1546, 500 и 50 скрытыми единицами для слоев 1, 2 и 3 соответственно со значением регуляризации отсева 20% для каждого. Скрытые слои связаны с функцией нелинейной активации ReLU, в то время как конечный выходной слой имеет сигмовидный выход. Я использовал двоичную функцию потери кроссентропии и алгоритм Адама со всеми параметрами по умолчанию, за исключением скорости обучения, которую я установил на 0,0001.
Я использовал 3 процента позиций для проверки. В течение первых 10 эпох точность проверки постепенно повышалась с 90 до 92%, что лишь на один процент от точности обучения. Дальнейшее обучение привело к переоснащению с повышением точности обучения и снижением точности проверки.
Я тестировал обученную модель на нескольких позициях вручную и получил довольно плохие результаты. В целом, модель может предсказать, какая сторона выиграет, если у этой стороны больше фигур или пешек рядом с квадратом конверсии. Также это дает стороне со следующим ходом небольшое преимущество (0.1). Но в целом это не имеет особого смысла. В большинстве случаев это сильно благоприятствует черным (на ~ 0,3) и не учитывает должным образом настройки. Например, он помечает начальную позицию как ~ 0,0001, как будто черная сторона имеет почти 100% шанс на победу. Иногда неуместная трансформация позиции приводит к непредсказуемому изменению оценки. Один король и одна королева с каждой стороны обычно рассматриваются как потерянные позиции для белых (0,32), если только черный король не находится на определенной клетке, даже если это не меняет баланса на шахматной доске.
Что ясделал для отладки программы:
Чтобы убедиться, что я не допустил ошибок, я проанализировал, как записывается каждая позиция, шаг за шагом. Затем я выбрал дюжину позиций из окончательного массива, прямо перед тренировкой, и преобразовал их обратно, чтобы проанализировать их на обычной шахматной доске.
Я использовал различное количество позиций изв той же игре (1 и 6), чтобы убедиться, что использование слишком большого количества одинаковых позиций не является причиной быстрого переоснащения. Кстати, даже одна позиция для каждой игры в моей базе данных привела к 3 миллионам наборов данных, что должно быть достаточно согласно некоторым исследованиям.
Чтобы убедиться, что позиции, которые я используюне слишком просты, я их проанализировал. 1,3 миллиона из них набрали 36 очков (рыцари, слоны, грачи и королевы; пешки не учитывались), 1,4 миллиона - 19 очков и лишь 0,3 миллиона - меньше.