С появлением Интернета мир нашел место с неограниченным потенциалом знаний, но мы можем заметить, что в последнее время это место захватывает растущая волна дезинформации и невежества. Становится обычным обсуждение таких тем, как интеллектуальный замысел, противовакцины, плоская земля и другие псевдонаучные темы.
Для борьбы с этой дезинформацией крайне важно такое место, как среда, и я хотел бы внести свой вклад в эту статью. Моя цель - показать, что эволюционный алгоритм работает, и, возможно, прояснить, как он работает.
Генетический алгоритм - это метод, вдохновленный естественным отбором (дарвиновская эволюция), который направлен на поиск наиболее подходящих агентов для окружающей среды. У каждого агента есть генетический код, который описывает его атрибуты, агенты, которые лучше подходят для окружающей среды, могут воспроизводиться, и существует небольшая вероятность мутации генома прола.
Для начала создадим нашего агента. Это будет действительно простой агент, состоящий из нейронной сети (созданной с помощью Keras). Он будет принимать в качестве входных данных одно изображение рукописного числа (мы будем использовать набор данных MNIST) и выводить массив размером 10 (классификация от 0 до 9).
Обратите внимание, что входной размер составляет 784, изображения MNIST имеют пропорцию 28 x 28, поэтому необходимо преобразовать каждое изображение набора данных в массивы формы 1 x 748. Также необходимо нормализовать значения, таким образом нейронная сеть будет работать только со значениями от 0 до 1, и его будет легче «выучить».
Теперь нам нужно управлять тем, как произойдет мутация. В основном будет одна переменная, называемая «скорость» между 0 и 1, мы будем перебирать каждый элемент каждого слоя нейронной сети и генерировать случайное число, если сгенерированное число меньше или равно текущей скорости, мы меняем этот элемент на новенький.
Нам также нужен способ измерить приспособленность нашего агента к «окружающей среде», для этого я создал две функции, которые измеряют, сколько прогнозов верны. Один просто подсчитывает количество правильных прогнозов (максимальное значение в массиве соответствует прогнозируемому значению), другой также измеряет расстояние до оптимального результата (часто приводя к более низкому баллу, чем первый метод).
Чтобы развивать нашу сеть, нам нужно прокручивать эпохи и население, создавая новые веса для агента и снижая скорость мутаций в каждую эпоху. Я поставил вариант, чтобы скорость не снижалась, поэтому она становится функцией грубой силы, и мы можем сравнивать две стратегии для развития сети.
Полученные результаты
После проработки обеих стратегий в течение примерно 3 часов и 300 итераций каждая результаты довольно ясны: оценка генетического алгоритма оказалась примерно в 2 раза лучше, чем при использовании грубой силы. Смысл этого эксперимента в том, чтобы показать, что эволюция - это не только удача, и на самом деле она работает намного лучше, чем чистая удача.
Возможно, удастся получить еще лучший результат, настроив функцию мутации и скорость распада.