Машинное обучение — это круто, верно? Это так!

Если вы похожи на меня, то вы с головой прыгнули в бурлящую реку нейронных сетей и можете иметь представление о том, что делаете, а можете не иметь.

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

Одним из них является генетический алгоритм🙌.

Посмотрите на моем Github!

Это выглядит весело, правда? Самое замечательное, что у вас, вероятно, уже есть интуитивное понимание того, что происходит.

Строим сами

В основе генетического алгоритма лежит ген. В природе это будет ДНК. ДНК содержит строительные блоки для каждого живого существа на этой планете. То же самое делает ген в нашем алгоритме. Это может быть так же просто, как набор целых чисел:

Или такой сложный, как набор 3D-координат, например НАСА использовало при проектировании антенны. Это не шутка, НАСА фактически использовало форму генетических алгоритмов для разработки своих Антенн для миссии Космические технологии 5 в 2006 году. Таким образом, эти объекты являются первыми объектами цифровой эволюции в космосе!

Давайте начнем с простого и воспользуемся набором из 10 целых чисел от 0 до 10. Представьте, что вы хотите найти конкретное число, например 0123456789. Конечно, в некотором смысле это тривиальная задача, но если вы попытаетесь выполнить ее методом грубой силы, это займет у вас около 10.000.000.000 попыток найти. Представьте себе набор из 30 целых чисел... сейчас это практически невозможно подобрать методом грубой силы. Сначала мы начнем с создания совокупности целых чисел.

1. Создание населения 👪

Для целей визуализации мы просто используем популяцию из девяти человек, но на самом деле вы бы выбрали 50, 100 или больше.

Генерировать случайные целые числа довольно просто, но, как всегда, дьявол кроется в деталях. Важно, как распределяется случайность. Мы могли бы выбрать либо распределение по Гауссу, либо четное.

В нашем случае равномерное распределение, вероятно, выгодно. Вы можете спроектировать свою функцию так, чтобы всегда получать равномерное распределение, но с увеличением численности населения это становится менее важным.

2. Рассчитайте фитнес 💪

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

Есть несколько способов сделать это. На данный момент мы просто подсчитываем количество правильных целых чисел на ген и определяем это как нашу оценку пригодности.

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

оценка пригодности = оценка пригодности * оценка пригодности

Это делает ген с показателем приспособленности 2 не только в два раза лучше, чем ген с показателем приспособленности 1, но и в четыре раза лучше. Чтобы узнать, почему это оказывает влияние, мы должны поговорить об отборе.

3. Выбор 🎰

Мы успешно определили показатель пригодности для каждого гена. Теперь нам нужно выбрать, какой из этих генов должен воспроизводиться. Есть несколько способов сделать это. Каждый с разными результатами. Я хочу рассказать о двух методах отбора:

  • Победитель получает все (он же элита)
  • Лотерейный билет (он же колесо рулетки)

Элитный.Элитный — самый простой метод. Мы выбираем два гена с наивысшим показателем пригодности. Вот и все.

Лотерейный билет.Представьте метод отбора как лотерею, у каждого есть шанс выиграть в лотерею. Но те, у кого более высокий уровень физической подготовки, имеют возможность купить больше лотерейных билетов и, следовательно, имеют больше шансов на победу. Давайте так, как именно мы будем это делать:

Мы определили наши показатели физической подготовки:

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

1+0+1+1+0+2+0+0+0 = 5

А затем разделить каждый балл на сумму.

Образно говоря, это означает, что в каждом раунде разыгрывается 5 лотерейных билетов, и только один из них является выигрышным. Гены с вероятностью 0,2 могут купить 1 лотерейный билет, а ген с вероятностью 0,4 может купить 2 лотерейных билета. В коде это может выглядеть так:

Мы успешно внедрили метод отбора. Но что делать с избранными?

4. Кроссовер ❌

Вспомните, когда вы были молоды, очень молоды, очень-очень молоды, а затем за 9 месяцев до этого. Наверное, было два человека, которые объединили свои гены и создали вас, ура 🎉! Звучит забавно. Давайте сделаем то же самое для наших чисел.

Чтобы объединить два набора чисел, мы сначала выбираем точку, называемую точкой пересечения, и разделяем наборы в этой точке. Выбрасываем половину каждого набора и формируем из того, что осталось. Это называется Дитя, все!

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

Мы должны сделать это один раз для каждого гена, чтобы заполнить всю популяцию.

Это все?

Неа! Остался один шаг.

5. Мутация 🌀

Все вариации, которые мы наблюдаем в природе, не могут быть достигнуты просто скрещиванием, нам нужна мутация. Поэтому, вероятно, было бы неплохо смоделировать это в нашем алгоритме.

Мутация означает, что существует случайный шанс того, что значение будет рандомизировано. При частоте мутаций 10 % одно значение в каждом гене, вероятно, будет случайным. В действительности, вероятно, будет достаточно уровня мутаций в 1–3%. Слишком мало мутаций может легко привести к стагнации, а слишком много мутаций — просто чистая случайность.

ГОТОВО! 👏

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

Если вы хотите увидеть генетический алгоритм в действии, вы можете посетить мой GitHub здесь!

Если вам понравилась эта статья, загляните в мой Инстаграм 👋!