Я совершенствовал свои навыки Python в некоторых реальных проектах с использованием нейронных сетей. Я научился создавать нейронную сеть на Python несколько лет назад по замечательной книге Тарика Рашида Создай свою собственную нейронную сеть. Его код для обучения сети распознавать рукописные цифры действительно работал, но я не знал, что с ним делать после этого. Обычные проекты связаны с классификацией ирисов и прогнозированием цен на жилье, и это меня не интересовало. Мне нравятся графические вещи, и я учу своих студентов-программистов создавать крутые арты. В основном это маленькие дети, которые любят делать игры или, скорее, играть в игры. Иногда вы можете заставить их написать код игры, в которую они хотят играть, например Flappy Birds. Это очень простая игра: цель состоит в том, чтобы заставить птицу пролететь через щель в трубах. Гравитация тянет птицу вниз, и игрок заставляет птицу хлопать, нажимая кнопку:

Дэн Шиффман разместил кучу видео на своем забавном, вдохновляющем YouTube-канале Coding Train о создании искусственного интеллекта Flappy Birds с использованием нейроэволюции. Это означает, что вы создаете нейронную сеть, которая будет мозгом птицы, и обучаете ее играть в игру, используя генетический алгоритм. Вы запускаете в игру сотню или более птиц, и птицы, которые работают лучше, переходят к следующему поколению, у некоторых мозг немного мутирует или скрещивается с мозгом других птиц для имитации размножения. Смысл видео Шиффмана заключался в том, чтобы скопировать функциональность игры, а не точный внешний вид, поэтому я сделал рабочий клон, в котором я мог делать круговые движения вверх и вниз с помощью пробела и прямоугольников, которые двигались влево и сталкивались с круг.

Еще более ужасным, чем мои игровые навыки, был тот факт, что я не мог использовать свою любимую нейронную сеть в игре, потому что Processing написан на Java, а не на Python. Режим «Python» просто переводит код на Java, затем запускает его, поэтому вы не можете импортировать часто используемые библиотеки, такие как numpy и так далее.

Я потратил несколько дней, кодируя свой собственный файл для выполнения матричных операций и адаптируя код нейронной сети для его использования, но это оказалось разочарованием. Удивительно, но птицы летали, но держались на высоте и никогда не уклонялись от труб.

Я последовал примеру Шиффмана, взяв 5 входных данных: высоту птицы над землей, скорость птицы, вертикальную высоту верхней и нижней частей ближайшей приближающейся трубы и крайне важное расстояние до этой трубы. Эти значения помещались в список или массив, которые становились входными данными для нейронной сети. Пять входов можно увидеть слева на диаграмме ниже:

Линии от входных узлов слева до 6 скрытых узлов в середине сети являются весами. Число, содержащееся во входном узле, будет умножено на число веса, и результат попадет в скрытый узел. Окончательное значение для скрытого узла будет суммой всех входящих в него чисел. Но в каждый скрытый узел входит 5 весов, а скрытых узлов — 6. Это много умножать и добавлять! Хорошо, что есть матрицы. Они делают это легким делом для компьютера.

Вот как «сигнал» распространяется по сети. Сначала 5 входных значений умножаются на веса и суммируются в скрытых узлах:

Все веса являются случайными десятичными знаками. Мы увидим, насколько хорош птичий мозг (предупреждение, спойлер: не очень хорошо), и «мутируем» их в следующем поколении, чтобы посмотреть, сможем ли мы улучшить производительность птицы. Из 6 скрытых узлов есть 6 весов, ведущих к выходному узлу. Еще умножение матриц, и у нас есть окончательное число. Если больше 0,5, птица будет махать крыльями. Если нет, то не лопнет.

Выход намного больше 0,5, поэтому птица будет махать крыльями. Этот процесс повторяется для каждой птицы, для каждого кадра(!) до тех пор, пока не останутся только лучшие исполнители. Вот как проходят первые несколько поколений:

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

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

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

Птицы были обучены более легкому курсу, а трубы появляются на случайной высоте, поэтому эти звезды не просто запоминают курс, они обучены взмахивать крыльями в соответствии с информацией, которую они получают из окружающей среды!

Представьте, что вы используете этот же процесс для обучения реальных вещей, таких как дроны или роботы! Я полностью планирую тренировать больше сетей в таких играх, как Asteroids (моя любимая видеоигра в те времена, когда они стоили четвертак), Snake и более новых играх, таких как 2048. Оставайтесь с нами!

Мой код доступен на Github: https://github.com/hackingmath/Neural-Net