Нейроэволюция дополняющих топологий, NEAT. Кеннет О. Стэнли и Ристо Мииккулайнен (2002). « Развитие нейронных сетей за счет улучшения топологий »

См. Мой код на GitHub.

Это больше, чем набитый рот, и проверка орфографии не распознает его как английский. Это невозможно даже сделать с помощью фреймворка машинного обучения, такого как TensorFlow или PyTorch, из-за развивающейся сетевой архитектуры. Я прочитал каждое слово из этой исследовательской работы 17-летней давности. Иногда терпеливо посвящает отладке по 12 часов в день в Google Colab. Иногда уходит в разочарование почти на неделю, вместо этого думая о жизни в фаст-фуде. Зачем вообще заморачиваться с математической и в целом глупой перспективой? Что я должен показать своими усилиями, кроме красных глаз и 600 строк все еще тупого кода Python, который уравновешивает два смоделированных полюса на тележке?

Зачем вообще пытаться реализовать исследовательскую работу?

Я занимаюсь глубоким обучением на Python всего год. Я случайно услышал о Tensorflow. В тот день началось обучение, и с тех пор каждый божий день. У меня в календаре есть красная строка, отмеченная крестиком, в подтверждение этого. Я прошел курс обучения домашнему пиву, прошел бесплатные муки и следил за сотнями руководств. Я сделал десятки проектов с нуля в Pytorch и Tensorflow. Я начал заниматься фрилансом и стал соучредителем стартапа. Без докторской степени было сложно сравнивать себя с другими в этой области. У меня нет десятилетней и небольшой ссуды в миллион долларов, чтобы поддержать мою семью, пока я получаю лист бумаги. Если я могу делать работу, я ее сделаю. Я разработчик глубокого обучения, потому что это то, чем я занимаюсь. Нет, потому что кто-то дал мне разрешение. Я решил сразиться с драконом и реализовать свою первую исследовательскую работу. Я полагал, что на переднем крае области, будь то для моего собственного стартапа или для любого, кто возьмет меня на работу, я буду внедрять современные методы из исследовательских работ и подчинять их своей воле с моими собственными наборами данных.

Я разработчик глубокого обучения, потому что это то, чем я занимаюсь. Нет, потому что кто-то дал мне разрешение.

Почему NEAT?

Если вы не обращали внимания на arXiv, то раскапывать старую статью может показаться странным. Снова и снова самые эффективные новые нейронные сети просто собирают фрагменты исследований десятилетней давности с большим количеством вычислений и данных. AlexNet изменил правила игры в 2012 году, когда началось последнее лето искусственного интеллекта, но был просто очень хорошим вариантом для CNN 1980-х годов. Старое - это новое новое.

В моей ленте на YouTube уже несколько лет постоянно идет поток «ИИ учится играть в братьев Марио» и тому подобное. Если копнуть глубже, кажется, что многие из них используют базовый алгоритм NEAT. Очевидно, настала моя очередь (играть в игры с ИИ) создать новую современную нейронную сеть, используя NEAT, и время пришло. Он будет (злой NEATo, мистер Волшебник) очень быстро развивать и обучать сети на данных, что сложно для современных нейронных сетей.

Что такое NEAT?

На самом деле это черная магия. Ритуалы со свечами и жертвоприношения под полной луной. Обязательно используйте настоящее серебро, иначе ваша модель никогда не дойдет до оптимального решения, я понял это на собственном горьком опыте.

Она превращается из простейшей нейронной сети в минимальную, созданную специально для оптимизации поведения в динамической среде. NEAT может быстро освоить игру, симулятор или даже управлять беспилотным транспортным средством. Путь от голых костей к минимально жизнеспособной сети - это создание совокупности самых маленьких неизмененных частей, просто узлов, подключенных непосредственно к выходу с начальным весом 1. Затем измените веса и добавьте узлы и соединения путем мутации и размножения. это население. В каждом поколении разделите популяцию на виды на основе их структуры нейронной сети и веса. Оставьте самые высокие показатели каждого вида без изменений и исключите самых низких показателей. Каждый вид защищает новые мутации до тех пор, пока они не смогут адаптироваться и, возможно, превзойти другие виды, вместо того, чтобы уничтожать их в соревновании с каждым членом поколения. Краеугольным камнем NEAT является то, что каждый созданный узел или соединение имеет уникальный исторический маркер. Это делает сравнение членов и математическое отслеживание эволюции очень простым, поэтому все это работает. Пытаться сравнить сложную геометрию двух нейронных сетей очень сложно, но с историческими маркерами вы можете просто выстроить узлы и соединения и сравнить. Черная магия - это здорово.

Честная оценка

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

Полученные результаты

Моя реализация NEAT занимает всего несколько минут, чтобы запустить три поколения, необходимые для поиска решения. Выигрышный результат - нейронная сеть только с 4 входными узлами, подключенными напрямую к 1 выходному узлу. Почти все веса отклоняются от своего начального значения 1. Конечная сеть должна уравновесить полюса 200 шагов 500 раз, не уронив ни одного полюса или не соскользнув с концов дорожки. Я уверен, что есть лучшие результаты как с NEAT, так и с другими моделями. Однако это не было моей целью. Я сделал Cart-pole с сетями Deep-Q, случайным выбором и политикой Монте-Карло. NEAT пока что моя единственная реализация, которая превосходит случайный выбор.

Более широкая картина

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

Стоило того?

Через несколько сотен часов в течение трех месяцев. Код можно легко найти на GitHub. Несколько часов чтения базы кода могут адаптировать ее ко многим задачам. Более глубокое понимание алгебры и алгоритмов было бы неплохо в старшей школе, но я пытаюсь начать новую карьеру прямо сейчас. Сегодня для меня лучше работать быстро и работать, чем медленно и познавательно. В следующий раз я просто скопирую и вставлю код и бегло просмотрю исследовательскую работу. Если я снова собираюсь потратить три месяца на решение проблемы, мне заплатят за результаты, а не просто напишу о них статью.