Днес исках да споделя една наистина интересна тема, на която наскоро попаднах: AI изграждане на AI. Тази публикация в блога ще бъде сравнително кратка, само ще прегледа основите, но планирам да продължа този материал с по-интересни експерименти.

Какво е невроеволюция?

Да започнем оттук. Neuroevolution използва генетични алгоритми за разработване на изкуствени невронни мрежи. Това е малко натоварено изявление, така че можем да се потопим във всяко парче.

Основната невронна мрежа обикновено се състои от три части: входен слой, изходен слой и един или повече „скрити“ слоеве. Входните и изходните слоеве са доста ясни. Данните се кодират и предават на входния слой, извършват се операции върху тези данни (в скритите слоеве) и накрая изходният слой дава точно това - изхода. Всеки от тези слоеве съдържа множество „неврони“, възли, които се използват в математическите операции на мрежата. Тези неврони са свързани помежду си по сложни начини, като всяка връзка обикновено има „тегло“. Ако връзката има по-голямо тегло, това е по-важно при изчислението, тъй като данните преминават от вход към изход. Вижте изображението по-долу:

Когато някой каже, че „обучава“ невронна мрежа, той обикновено има предвид, че използва етикетиран набор от данни като входни данни в произволно претеглен модел. Първоначално моделът започва да прави много лоши прогнози, но с течение на времето се коригира, като актуализира своите вътрешни тегла. След подаване на достатъчно данни за обучение моделът се счита за обучен. Този метод обикновено се нарича обратно разпространение на грешки или градиентно спускане.

Въпрос, който може да зададете е: как да определя колко голяма трябва да бъде скритата част от моята мрежа? Има много изследвания за определяне на отговора. Обикновено скритият слой може да бъде конфигуриран чрез параметри (брой слоеве, брой неврони и т.н.) и тези параметри могат да бъдат оптимизирани с различни алгоритми за търсене. Невроеволюцията обаче предлага потенциално решение.

Neuroevolution (NE) ни позволява не само да редактираме претеглените връзки в нашите невронни мрежи, но също така ни позволява да редактираме мрежовата топология. Като част от процеса на обучение, NE ни позволява да добавяме и премахваме възли или връзки, докато данните се обучават, създавайки стабилен, но и гъвкав метод за генериране на мрежа.

Споменах накратко генетичните алгоритми в началото на публикацията. Има много различни стратегии, когато става въпрос за разработване на еволюционен алгоритъм, но всички те разчитат на един и същ принцип: оцеляване на най-силните. От популация от модели най-успешните екземпляри се „възпроизвеждат“, създавайки дъщерни модели с аспекти на двамата родители (понякога с допълнителни мутации). Това води до модел, който е настроен чрез естествен подбор и еволюция. Наистина интересни неща.

NEAT: Невроеволюция на увеличаващите се топологии

Има страхотна хартия и свързана с нея реализация на Python на алгоритъм, наречен NEAT (невроеволюция на разширяващите топологии). По същество той прилага това, което обсъдих по-горе: генетичен алгоритъм, който генерира изкуствени невронни мрежи. Освен това е в състояние да развива топологията на мрежата с течение на времето. Документът е наистина интересен (и също кратък!), така че ако искате допълнителни подробности за теорията зад метода, силно препоръчвам да го разгледате. За останалата част от блога ще ви покажа един от основните примери от хранилището и как работи алгоритъмът.

Ще се опитаме да създадем невронна мрежа, която може да моделира функцията XOR. Ако не сте запознати, това са входовете и изходите на функцията XOR.

Започваме със 150 различни изкуствени невронни мрежи (ANN). Нито една от тези мрежи не е обучена, така че в началото няма да очакваме високо ниво на точност. Ще преценим качеството на моделите, като използваме нещо, наречено фитнес функция. Тази функция може да бъде всичко, което пожелаем, така че просто ще изберем броя на точните прогнози. Тази функция обаче е ключът към алгоритъма NEAT. Той управлява начина на възпроизвеждане и избор на модел.

В първото поколение ето какво виждаме:

Средната пригодност е 2,28 със стандартно отклонение от 0,36. Има смисъл, мрежите просто гадаят на случаен принцип, така че обикновено очакваме да получим правилни 2 от въведените данни. Това също е добър момент да обсъдите как се формира даден вид.

Видът се определя от сходството на модела. Ако един модел има подобна топология (брой и структура на неврони и връзки) и подобни тегла на друг модел, двата ще се считат за един вид. С течение на времето видовете ще се развиват и ще изчезват, тъй като най-добрите черти са естествено избрани.

След 72 поколения нашият експеримент е завършен и получаваме ANN с тази топология:

A и B са входовете, докато A XOR B е изходният възел.

Можем да видим, че пригодността на населението се доближава до пригодност от 4 (оптималната стойност) близо до поколение 70, но с течение на времето тя постепенно подобрява пригодността. Разгледайте видовете във времето:

Всеки цвят представлява вид. Забележете, че в началото всеки модел е в синия вид. Този обаче изчезва около поколение 35 и портокаловият вид започва да поема. Наблюдаването на създаването и премахването на видове може също да даде указания за това как топологията и структурата на модела влияят върху точността.

Благодаря за четенето и очаквайте бъдещи публикации от AiQ!