Помещение

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



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

Но что я мог сделать?

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



Итак, насколько умно я могу сделать точку?

Понимание исходной точки

В первоначальных проектах тысячи точек бесцельно двигались до тех пор, пока в конце концов не останавливались, когда происходило одно из следующих трех событий:

  1. Они достигают «финиша» — черного квадрата;
  2. Они умирают, потому что ударяются о стену;
  3. Они умирают, потому что прошли все 300 шагов, которые у них были.

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

Вот пример:

Понимание искусственных нейронных сетей

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

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

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

Сделать конкуренцию честной

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

  1. В начале не будет набора данных. Наличие одной означало бы, что точки уже обучены идти к «финишу», что не является той же отправной точкой, что и у других точек, и это просто несправедливо. Каждая точка будет добавлять запись в свой набор данных каждые 75 шагов. Это то, что самая приспособленная точка передаст, а иногда и мутирует, следующему поколению. Как старик учит своих сыновей. Я нахожу это очень романтичным, и мне это нравится.
  2. Я также буду ограничивать возможности их мозга и количество тренировок, которые они могут выполнить, прежде чем прыгать в бой. Если вам нужны подробности, у них есть действительно базовая нейронная сеть в виде мозга, которая состоит из трех слоев, каждый из которых содержит только четыре нейрона. Для обучения количество эпох (количество раз, когда алгоритм обучения будет работать со всем набором данных) будет всего 30, что на удивление мало, учитывая, что обычно оно составляет порядка тысяч.
  3. Наконец, вместо тысячи точек я сгенерирую только 80. Их мозг намного больше похож на мозг предыдущей итерации, а также требует гораздо большей вычислительной мощности, поэтому уверяю вас, что 80 — это нормально, если не слишком много.

Сравнение

И с установленными ограничениями мы, наконец, можем увидеть, что происходит:

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

Даже через сотню поколений старые точки не будут работать так же хорошо, как новые точки всего через пару… И вдобавок ко всему, рекорд новых точек всегда около 150 шагов, что обычно достигается уже на 2-м поколении. , но я никогда не видел, чтобы это было достигнуто старыми точками, даже спустя много поколений.

Заключение

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

Если вы хотите повеселиться с проектом, вот репозиторий GitHub.