Сегодня я хотел поделиться действительно интересной темой, с которой недавно столкнулся: ИИ, создающий ИИ. Этот пост в блоге будет довольно коротким, в нем будут рассмотрены только основы, но я планирую продолжить этот материал с более интересными экспериментами.

Что такое нейроэволюция?

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

Базовая нейронная сеть обычно состоит из трех частей: входного слоя, выходного слоя и одного или нескольких «скрытых» слоев. Слои ввода и вывода говорят сами за себя. Данные кодируются и передаются на входной слой, над этими данными (в скрытых слоях) выполняются операции, и, наконец, выходной слой дает именно это — выходные данные. Каждый из этих слоев содержит несколько «нейронов», узлов, которые используются в математических операциях сети. Эти нейроны связаны между собой сложным образом, причем каждое соединение обычно имеет «вес». Если соединение имеет более высокий вес, оно более важно при расчете, так как данные передаются от входа к выходу. Смотрите изображение ниже:

Когда кто-то говорит, что он «обучает» нейронную сеть, он обычно имеет в виду, что использует помеченный набор данных в качестве входных данных для модели со случайным взвешиванием. Сначала модель начинает делать очень плохие прогнозы, но со временем она исправляется, обновляя свои внутренние веса. После предоставления достаточного количества обучающих данных модель считается обученной. Этот метод обычно называют обратным распространением ошибок или градиентным спуском.

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

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

Я кратко упомянул генетические алгоритмы в начале поста. Существует множество различных стратегий разработки эволюционного алгоритма, но все они основаны на одном и том же принципе: выживает сильнейший. Из популяции моделей наиболее успешные экземпляры «воспроизводятся», создавая дочерние модели с аспектами обоих родителей (иногда с дополнительными мутациями). Это приводит к модели, которая была настроена посредством естественного отбора и эволюции. Действительно интересные вещи.

NEAT: нейроэволюция увеличивающих топологий

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

Мы попытаемся создать нейронную сеть, способную моделировать функцию XOR. Если вы не знакомы, это входы и выходы функции XOR.

Мы начинаем со 150 различных искусственных нейронных сетей (ИНС). Ни одна из этих сетей не была обучена, поэтому поначалу мы не ожидаем высокого уровня точности. Мы будем оценивать качество моделей, используя так называемую фитнес-функцию. Эта функция может быть чем угодно, поэтому мы просто выберем количество точных прогнозов. Однако эта функция является ключом к алгоритму NEAT. Он определяет, как происходит воспроизведение и выбор модели.

В первом поколении вот что мы видим:

Средняя пригодность составляет 2,28 при стандартном отклонении 0,36. Имеет смысл, сети просто угадывают случайным образом, поэтому мы обычно ожидаем, что 2 из входных данных будут правильными. Это также хорошее время, чтобы обсудить, как вид формируется.

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

После 72 поколений наш эксперимент завершен, и мы получаем ИНС с такой топологией:

A и B — входы, а XOR B — выходной узел.

Мы видим, что приспособленность популяции приближается к приспособленности 4 (оптимальное значение) около 70-го поколения, но со временем приспособленность постепенно улучшается. Проверьте виды с течением времени:

Каждый цвет представляет вид. Обратите внимание, что в начале каждая модель представлена ​​в синем цвете. Однако этот вид вымирает примерно в 35-м поколении, и его место начинают занимать оранжевые виды. Наблюдение за созданием и удалением видов также может дать представление о том, как топология и структура модели влияют на точность.

Спасибо за прочтение и следите за будущими сообщениями от AiQ!