Нека обсъдим идеите зад това как да търсите по интелигентен начин хиперпараметрите за вашите модели за машинно обучение.

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

Един от изборите са хиперпараметрите; това са параметрите, които контролират процеса на обучение, но не могат да бъдат получени от самото обучение. Някои примери са:

  • Скоростта на обучение, епохи, брой слоеве/неврони в невронна мрежа.
  • Броят на дърветата, максималната дълбочина, критериите за качество в произволна гора.
  • Стойностите на ядрото, гама и C от поддържащи векторни машини.

Някои от въпросите, които идват, са: Какви хиперпараметри трябва да задам на този модел? Тези по подразбиране достатъчно добри ли са? Мога ли да постигна по-добра производителност само като изпробвам още няколко архитектури? И как мога да реша кои опции да опитам? Всички тези въпроси са свързани с настройката на хиперпараметър [1].

В тази публикация ще обсъдя:

  • Стандартните стратегии за настройка на хиперпараметри в контролирани модели.
  • Проблемът с неинформираните стратегии.
  • Компромисите на информираните стратегии.
  • Как да внедрим идеите на генетичните алгоритми (GA) за настройка на хиперпараметри.
  • Какви допълнителни функции бихме могли да внесем в GA.
  • Препратки към пакети на Python с няколко реализации.

Ако искате да отидете веднага за някакъв код с примери, можете да проверите моята публикация за „друг носител“ с това съдържание.

1. Основни стратегии:

Има няколко опции, които да следвате, за да намерите тези хиперпараметри, които ще увеличат вашия модел, за да споменем няколко:

  • Търсене в решетка
  • Рандомизирано търсене в мрежата
  • Байесова оптимизация
  • Генетични алгоритми

Както търсенето в решетка, така и рандомизираното търсене в решетка са това, което бихме могли да наречем подход на груба сила, което означава, че изборът на хиперпараметри не е по информативен начин, а просто като се опитват някои опции и се надяват, че работи.

Те имат предимството, че са лесни за изпълнение и могат да бъдат достатъчно бързи, за да получат прилични резултати, опитайте някои комбинации и изберете най-доброто въз основа на някакъв показател, така че за два хиперпараметъра; процесът може да изглежда така:

Картината по-горе представя как мрежата и рандомизираното търсене в мрежата могат да се представят, опитвайки се да оптимизират модел, чиято функция за оценяване (напр. AUC) е сумата от зелените и жълтите области, приносът към резултата е височината на областите, така че основно само зеленото има значение за резултата.

2. Визуализация на проблема

Можете да видите, че рандомизираното оформление е по някакъв начин по-добро от Grid, тъй като може да изследва повече различни стойности на функцията за оптимизация и тъй като един от параметрите не беше значим, търсенето в мрежата загуби шест допълнителни модела без важни промени в точкуването , но и в двата случая случайно бихме могли да получим стойност, която е близо или далеч от оптималната.

Ще опростя твърде много това представяне в едномерна функция, само за да придобия известна интуиция:

В горния график червената линия представлява точността на кръстосано валидиране (или всяка друга метрика), която оценителят може да постигне, а точките са фиксиран избор на хиперпараметри, зависещи от техния резултат за точност, така че например, ако това беше невронна мрежа, точките могат да представляват следното:

dot 1: {"learning_rate": 0.001, "layers": 5, "optimizer": "Adam"}
dot 2: {"learning_rate": 0.01, "layers": 3, "optimizer": "Adagrad"}
dot 3: {"learning_rate": 1, "layers": 6, "optimizer": "SGD"}
dot 4: {"learning_rate": 0.001, "layers": 8, "optimizer": "RMSprop"}
dot 5: {"learning_rate": 0.1, "layers": 20, "optimizer": "SGD"}

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

Добре.. разбираме проблема, така че как можем да го подобрим?

3. Информационният начин

Другите два метода, които споменах, са Bayesian Optimization [3] и Genetic Algorithms [4], тези, бихме могли да кажем, следват информативен критерий, за да направят избор, общото между тях е, че те следват последователен процес, където се опитват да намерят по-добър набор от хиперпараметри от миналите решения, които са взели, така че ако го мислим като итеративен процес, може да изглежда така:

Можете да видите, че първата итерация може да разгледа какво би направила една рандомизирана мрежа и е ОК, трябва да започнем в някакъв момент; идеята е да изследвате интелигентно пространството на хиперпараметрите, като напредвате във всяка итерация, променяте броя на наборите, които да опитате, създавате нови и т.н.

Разбира се, както се очаква в науката за данните, това не е безпроблемно решение; може да изникнат няколко неща, за да спомена някои:

  • Дилемата проучване-експлоатация: Трябва ли да отида в по-малко проучени региони, в случай че пропускам нещо? Или трябва да продължа да опитвам точки близо до регионите, които вече познавам, които показват обещаващи резултати?
  • Локален максимум:Това идва като възможен резултат от първия; какво ще стане, ако функцията ми за оптимизация е неизпъкнала, нелинейна и шумна?, какво ще стане, ако заседна на локален максимум, мислейки, че това е най-доброто (глобален максимум) решение?
  • Потребление на ресурси:Както можете да видите, направихме това итеративен процес, който може да изразходва повече ресурси, отколкото обикновеното търсене в мрежата.
  • Нови параметри: Колко итерации трябва да изпълня?, как мога да контролирам изследването срещу експлоатацията? , трябва ли да създавам повече набори във всяка итерация?, това не са ли просто повече хиперпараметри, които трябва да реша?

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

Можете да проверите, например, sklearn-genetic-opt за подхода на генетичните алгоритми или scikit-optimize за байесовия. Ще обясня подхода на генетичните алгоритми.

4. Подход на генетичните алгоритми (GA).

Генетичният алгоритъм е метаевристика, вдъхновена от естествения подбор; те се използват в проблемите на оптимизацията и търсенето като цяло и обикновено се основават на набор от функции като мутация, кръстосване и селекция [2]. Нека ги наречем генетични оператори.

Ще използвам следните термини взаимозаменяемо в този раздел, за да направя връзката между GA и машинното обучение:

Един избор от хиперпараметри→Индивид

Популация→ Няколко индивида

Генериране→Една фиксирана итерация, която съдържа фиксирана популация

Стойност на годност→Резултат за кръстосано валидиране

Има няколко варианта, но като цяло стъпките, които трябва да следвате, изглеждат така:

  1. Генериране на произволно избрана популация (различни набори от хиперпараметри); това е поколение 0.
  2. Оценете стойността на фитнес на всеки индивид в популацията по отношение на машинното обучение, получете резултатите за кръстосано валидиране.
  3. Генерирайте ново поколение, като използвате няколко генетични оператора.
  4. Повторете стъпки 2 и 3, докато не изпълните критерий за спиране.

Да вървим стъпка по стъпка.

4.1-4.2 Създайте поколение 0 и го оценете:

Както споменахме, можете да генерирате произволен набор от няколко хиперпараметъра или можете да включите няколко ръчно избрани, които вече сте изпробвали и виждате като подходящи кандидати.

Всеки комплект обикновено се кодира под формата на хромозома, двоично представяне на групата; например, ако зададем размера на първото поколение да бъде три индивида, това ще изглежда така:

Така че в това поколение получаваме три индивида, картографирани в хромозомно (двоично) представяне, използвайки функцията за кодиране, представена като червена стрелка. Всяка кутия в хромозомата е ген. Фиксиран участък от хромозомата е един от хиперпараметрите.

След това получаваме резултата за кръстосано валидиране (пригодност) на всеки кандидат, използвайки функция за точкуване, показана като лилавата стрелка.

4.3 Създайте ново поколение:

Сега можем да създадем нов набор от кандидати; както споменахме, има няколко генетични оператора; Ще покажа най-често срещаните:

Кросоувър:

Този оператор се състои от вземане на две родителски хромозоми и чифтосването им за създаване на нови деца; начинът, по който избираме родителите, може да бъде чрез функция на вероятностно разпределение, която дава по-голяма вероятност на индивидите с по-висока годност от поколението, да кажем, че индивидът номер 1 и 3 е избран, тогава можем да вземем две случайни точки на всеки родител и направи кросоувъра, така:

Сега децата представляват нов набор от хиперпараметри; ако декодираме всяко дете, можем да получим например:

Child 1: {"learning_rate": 0.015, "layers": 4, "optimizer": "Adam"}
Child 2: {"learning_rate": 0.4, "layers": 6, "optimizer": "SGD"}

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

Мутация:

С достатъчно ниска вероятност (‹ ~0,1), този оператор произволно променя един от гените или цял хиперпараметър, за да създаде по-разнообразни набори.

Да вземем, например, детето от предишното изображение; нека вземем произволно поколение и променим стойността му:

Или може дори да промени цял параметър, например оптимизатора:

Елитизъм:

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

Така че след извършване на тези операции, ново поколение може да изглежда така:

Отсега нататък просто повторете процеса за няколко поколения, докато не изпълните критерий за спиране, те могат да бъдат например:

  • Достигнат е максимален брой поколения.
  • Процесът е продължил по-дълго от бюджетното време.
  • Няма подобрения в производителността (под праг) от последните n поколения.

Следното изображение е пример за това, което можем да получим, след като работим с нашия оптимизатор на GA за няколко поколения; това е регресионен модел, използващ произволна гора с показателя r-квадрат:

Можем да начертаем хиперпараметрите, които са били изпробвани от алгоритъма, като точковата диаграма, но в този случай, следвайки най-реалистичното представяне, можем да начертаем хистограмата на примерните стойности от всеки параметър и диаграмата на разсейване, подобна на първата диаграма.

Колкото по-тъмен е цветът на тази картина, толкова повече различни оценки са поставени в този регион; резултатът е същият r-квадрат.

Така че на този етап въпросът е как можем да приложим това? Трябва ли да го направя от нулата? Както споменахме по-рано, вече има няколко пакета, които могат да помогнат с това; ще видим характеристиките на един от тях.

Забележка:Аз съм авторът на следния пакет; ако искате да научите повече, да допринесете или да направите някои предложения, можете да проверите документацията и хранилището на GitHub в края на тази статия.

Представяме ви Sklearn-genetic-opt

Sklearn-genetic-opt е базиран на Python пакет, който използва еволюционни алгоритми от пакета DEAP, за да избере набор от хиперпараметри, който оптимизира (макс. или мин.) резултатите за кръстосано валидиране; пакетът може да се използва както за проблеми с регресия, така и за класификация. На този етап Sklearn-genetic-opt е съвместим с всеки scikit-learn регресор или класификатор (или съвместим със sklearn).

Този пакет има следните характеристики:

  • GASearchCV:Основният клас на пакета, съдържа еволюционната рутина за оптимизиране на кръстосано валидиране и има подобен API като scikit-learn GridSeachCV.
  • Алгоритми: Набор от различни еволюционни алгоритми, които да се използват като процедура за оптимизация.
  • Обратни повиквания:Персонализирани стратегии за оценка за генериране на правила за ранно спиране, регистриране или ваша персонализирана логика.
  • Графики: Генерирайте предварително дефинирани диаграми, за да разберете процеса на оптимизиране. Например, последните два парцела идват от пакета.
  • MLflow:Вградена интеграция с mlflow за регистриране и управление на жизнения цикъл на всички хиперпараметри, cv-резултати и монтираните модели.

Така че начинът, по който работи, е чрез следване на подобни процедури като тази, описана в последния раздел, но добавя някои допълнителни функции като обратни извиквания, регистриране на MLflow и подход с различни алгоритми; изглежда така:

А ето как може да изглежда регистрирането на MLflow:

Така че това е! Благодарим ви, че прочетохте това съдържание; Надявам се, че е било полезно да обмислите вашите стратегии за настройка; ето свързаните връзки за последния пакет, в случай че искате да го проверите:

Документация: https://sklearn-genetic-opt.readthedocs.io/en/stable/

Хранилище:https://github.com/rodrigo-arenas/Sklearn-genetic-opt

Препратки

[1] https://en.wikipedia.org/wiki/Hyperparameter_optimization

[2] https://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf

[3]https://www.cs.toronto.edu/~rgrosse/courses/csc411_f18/tutorials/tut8_adams_slides.pdf

[4] https://en.wikipedia.org/wiki/Генетичен_алгоритъм