Мой пет-проект: самообучающаяся нейросеть, играющая в змейку на C#

Всем привет! Попробую разбавить волны авторским контентом.

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

Ну так вот. В какой-то момент времени я стал интересоваться нейросетями и решил их поизучать. Почитал кое-какие книги, статьи и запилил свою первую нейросеть на python. Язык очень простой в освоении, но мне в первом приближении совсем не понравился, и я решил переписать всё на C#, чтобы лучше закрепить новые знания. Так появилась первая итерация моей библиотеки, которая умеет самые базовые вещи: стоить нейросети с заданной топологией, выполнять запросы и обучаться методом обратного распространения ошибки.

Второй итерацией я в топорно-экспериментальном режиме подключил возможность вычисления на GPU, а именно на CUDA. Эксперименты показали забавный результат: небольшие матрицы на CPU перемножаются намного быстрее, чем на GPU, а большие - наоборот, несравнимо быстрее перемножаются на GPU.

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

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

Кому интересно посмотреть или пощупать мой говнокод - милости прошу на гитхаб: https://github.com/tyzegt/NeuralNetworkLib/tree/snake-geneti...

Ниже несколько гифок, иллюстрирующих прогресс обучения:

Мой пет-проект: самообучающаяся нейросеть, играющая в змейку на C# Разработка, Программирование, Нейронные сети, Код, Open Source, Игра змейка, Гифка, Длиннопост
Мой пет-проект: самообучающаяся нейросеть, играющая в змейку на C# Разработка, Программирование, Нейронные сети, Код, Open Source, Игра змейка, Гифка, Длиннопост
Мой пет-проект: самообучающаяся нейросеть, играющая в змейку на C# Разработка, Программирование, Нейронные сети, Код, Open Source, Игра змейка, Гифка, Длиннопост
Мой пет-проект: самообучающаяся нейросеть, играющая в змейку на C# Разработка, Программирование, Нейронные сети, Код, Open Source, Игра змейка, Гифка, Длиннопост
Мой пет-проект: самообучающаяся нейросеть, играющая в змейку на C# Разработка, Программирование, Нейронные сети, Код, Open Source, Игра змейка, Гифка, Длиннопост

Лига программистов

1.5K пост11.4K подписчика

Добавить пост

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества