Съдържание

1. Въведение

2. Различни техники за оптимизация на хиперпараметъра

3. Настройка с Keras-Tuner

Въведение

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

Днес ще се съсредоточим върху HPO и ще обясним някои от популярните методи заедно с имплементацията с помощта на keras_tuner за търсене на хиперпараметри. Много хора използват термина параметър взаимозаменяемо с хиперпараметър, но те не са едно и също.

  • Параметър: стойности, които са научени от модела и не могат да бъдат настроени от Data Scientists. Включва средна стойност, вариация на данните, тегла, отклонение и т.н.
  • Хиперпараметър: Зададен предварително от Data Scientists, той не може да бъде научен от модел като number of layers , number of neurons, learning_rate и т.н.

Хиперпараметрични техники за оптимизация

Това ще бъде кратко концептуално обяснение без математически подробности.

GridSearch

Пространството за търсене е декартово произведение на всички възможни хиперпараметри.

Например, ако искаме да изпробваме два хиперпараметъра, да речем learning_rate и optimizer, [0.1, 0.001, 0.0001] и ['adam', 'SGD'] респективно търсенето в мрежата обучава модел с (0.1, 'adam'), (0.001, ' adam'), (0,0001, 'adam'), (0,1, 'SGD'), (0,001, 'SGD') и (0,0001, 'SGD), което е всички възможни вариации (декартово произведение от два списъка).

За прост модел с малко пространство за търсене GridSearch всъщност е доста добър избор, тъй като обучението ще отнеме по-кратко време и всички конфигурации могат да бъдат обхванати в разумен период от време и ресурси. Въпреки това, когато пространството за търсене е голямо и моделът е сложен, той не е за предпочитане, особено когато някои хиперпараметри са по-важни от други. Разглеждайки снимката по-долу, можем да видим, че за Gridsearch можем да търсим само 3 различни стойности и за двата хиперпараметъра, където вместо това трябваше да търсим повече различни стойности на важен хиперпараметър.

Произволно търсене

Произволно търсене от възможна комбинация от хиперпараметри. Просто трябва да посочите долна и горна граница и оттам се търси произволно (всяка стойност има равномерно разпределение).

Случайното търсене и търсенето в мрежа са едновременно интуитивни и лесни за изпълнение, но имат няколко недостатъка:

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

Хипербанд

Hyperband преодолява първия недостатък на метода за решетка/произволно търсене чрез Последователно разполовяване, което отпада половината от най-лошо представящото се пространство за търсене след всеки опит (може да бъде епоха, определено време и т.н.), това продължава до изчерпване на целия бюджет използвани.

Последователното преполовяване страда от компромис между бюджет и брой конфигурации:

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

Hyperband преодолява този компромис, като разделя общия бюджет на няколко комбинации от number of config vs. budget (някои комплекти опитват големи конфигурации, някои опитват малки конфигурации), след което използват последователно разполовяване на всеки набор.

Байесова оптимизация

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

  1. Изградете вероятностен модел (сурогатен модел) на целевата функция (хиперпараметър, който минимизира целта, да речем RMSE).
  2. Опитайте различни хиперпараметри на вероятностен модел и изберете най-добрия.
  3. приложете хиперпараметър, избран от 2-ра стъпка, към истинска целева функция.
  4. актуализиране на вероятностния модел, включващ нови резултати
  5. повторете стъпки 1~4.

BOHB

Комбинация от BayesianOptimization и Hyperband преодолява и двата недостатъка на мрежата/произволното търсене. Документът може да бъде намерен в раздела за справки на този блог.

Настройка с Keras-Tuner

Има различни библиотеки, които поддържат различни методи за оптимизация на хиперпараметри, ние прилагаме с помощта на библиотека keras-tuner, която е част от библиотеката Keras. Някои други популярни библиотеки, които да проверите, са RayTune (част от Ray) и Optuna, ще добавя някои ресурси, които обясняват тези библиотеки.

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

Първо ще подготвим нашите данни и ще изградим модел без keras_tuner.

Ето хиперпараметри за настройка:

  • брой слоеве
  • брой неврони на слой
  • процент на отпадане
  • функция за активиране
  • скорост на обучение

Две основни части:

  • build_model: изграждане на модел като по-горе, но изграден с различен набор от хиперпараметри, които са избрани от тунера.
  • Тунер: клас, който управлява процеса на търсене на хиперпараметър, всички различни HPO методи RandomSearch, HyperBand и BayesianOptimization са подклас на класа Тунер.

По-долу е част от нашия код за изграждане на модел. Ще обясним ред по ред какво се случва.

Забележка: hp е параметър, който се предава от класа на тунера при всеки опит.

  • редове 2~7: инициализирайте нашето пространство за търсене на хиперпараметър в нашата функция.
  • 9~11: hp.Choice() избира стойност сред списък със стойности, а hp.Float() избира от min_value и max_value и в зависимост от параметъра за вземане на проби, стойностите му се вземат по различен начин. В нашия случай, тъй като избрахме „log“, се дават равни вероятности за всеки порядък от 0,0001, 0,001 и 0,1.
  • 17~18: hp.Int() просто изберете цяло число между диапазона, имайте предвид, че както горният, така и долният диапазон включват. Тук избираме number of neurons да бъде между 32~512.
  • 19~21: броят на използваните слоеве се избира от hp.Choice, -1 е, защото сме добавили един плътен слой по-горе. Сега за всеки слой избираме number of neurons да бъде между 32~512. Ако искате всички слоеве да имат еднакви number of neurons, просто използвайте dnn_units от ред 18 при всяка итерация (изтрийте ред 20).
  • 22: hp.Boolean() избира от True/False, ако е True, добавя слой за отпадане с коефициент на отпадане 0,25.

Предаваме модела, който сме изградили по-горе, както и целта (кой тунер ще проследява, за да измери ефективността) на нашия клас тунери и започваме търсенето!

От ред 13 можем да видим, че целта на нашия тунер е да увеличи максимално val_accuracy.

След като изградим тунер с нашия модел, стартираме метод .search() за търсене в нашето пространство за търсене на хиперпараметър. Имайте предвид, че при всяко изпитание нашият тунер изпраща различни хиперпараметри за обучение, всеки подклас на тунера (RandomSearch, Hyperband, BO) ще използва свои собствени стратегии за избор на следващи хиперпараметри.

След като приключите с търсенето, цялата история се съхранява в directory/project_name/. Класът Tuner има множество полезни методи като result_summary() за показване на обобщена информация за настройката, get_best_hyperparameters() и така нататък… Можете да разгледате всички други методи в официалната документация на keras_tuner в секцията за класове на тунер.

Сега ще изградим модел с най-добри хиперпараметри и ще тренираме върху пълен набор от данни.

Заключение

Разгледахме няколко техники за оптимизиране на хиперпараметри и ги внедрихме с помощта на keras tuner. Сигурен съм, че повечето от читателите са разбрали силата на AutoML, как ще направи живота ни по-щастлив. Методите, които разгледахме, са основни и все още се провеждат много изследвания за подобряване на методите, обхванати днес. В следващия блог ще използваме клас хипермодел, за да създадем наша собствена компилация, да обучим функции, за да добавим гъвкавост и да направим нашия код по-поддържаем.

Препратки

Керас-Тунер

rayTune