HyperOpt demistificat

Cum să automatizezi reglarea modelului cu HyperOpt

Îți plac modelele de tuning? Dacă răspunsul tău este „da”, această postare este nu pentru tine.

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Un desen animat de la bunicul meu - .

În acest blog vom acoperi algoritmul de reglare automată a hiperparametrului extrem de popular numit Estimatori Parzen bazați pe arbore (TPE). TPE este suportat de pachetul open-source, HyperOpt. Utilizând HyperOpt și TPE, inginerii de învățare automată pot dezvolta rapid modele extrem de optimizate, fără nicio reglare manuală.

Fără alte întrebări, să ne scufundăm!

HyperOpt este un pachet python open-source care utilizează un algoritm numit Tree-based Parzen Esimtors (TPE) pentru a selecta hiperparametrii modelului care optimizează o funcție obiectiv definită de utilizator. Prin simpla definire a formei funcționale și a limitelor fiecărui hiperparametru, TPE caută complet dar eficient prin hiperspațiul complex pentru a atinge optime.

TPE este un algoritm secvenţial care foloseşte actualizarea bayesiană şi urmează secvenţa de mai jos.

  1. Antrenează un model cu mai multe seturi de hiperparametri selectați aleatoriu, returnând valori ale funcției obiective.
  2. Împărțiți valorile funcției obiective observate în grupuri „bune” și „rele”, în funcție de un anumit prag gamma (γ).
  3. Calculați scorul „promițător”, care este just P(x|bine) / P(x|rea).
  4. Determinați hiperparametrii care maximizează promisiunea prin modele de amestec.
  5. Potriviți modelul nostru folosind hiperparametrii de la pasul 4.
  6. Repetați pașii 2-5 până la un criteriu de oprire.

Iată un exemplu de cod rapid.

Ok, au fost multe cuvinte mari. Să încetinim și să înțelegem cu adevărat ce se întâmplă.

1.1 — Scopul nostru

Oamenii de știință de date sunt ocupați. Vrem să producem modele foarte bune, dar facem acest lucru într-o manieră eficientă și, în mod ideal, fără mâini.

Cu toate acestea, anumiți pași din ciclul de viață al modelării ML sunt foarte greu de automatizat. Analiza exploratorie a datelor (EDA) și ingineria caracteristicilor, de exemplu, sunt de obicei specifice subiectului și necesită intuiție umană. Ajustarea modelului, pe de altă parte, este un proces iterativ în care computerele pot excela.

Scopul nostru în această postare este să înțelegem cum să folosim algoritmi pentru a automatiza procesul de reglare a modelului.

Pentru a ne ajuta să ne gândim la acest obiectiv, să folosim o analogie: suntem pirați care caută comori îngropate. De asemenea, este important să rețineți că suntem pirați foarte eficienți, care caută să minimizăm timpul nostru în căutarea comorii îngropate. Deci, cum ar trebui să minimizăm timpul petrecut căutând? Raspunsul este folosește o hartă!

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 1: exemplu spațiu de căutare hiperparametru 3D. Locația cufărului de comori este un optim global. Imaginea autorului.

În figura 1, avem o hartă fictivă care arată unde se află comoara noastră. După multe cățărări și săpături, nu ar fi prea greu să ajungi la acea comoară pentru că știm exact unde se află.

Dar ce se întâmplă când nu avem o hartă?

Când este însărcinat cu reglarea unui model, din păcate nu ni se oferă o hartă. Terenul nostru, care corespunde spațiului de căutare hiperparmetru, este necunoscut. În plus, locația comorii noastre, care corespunde setului optim de hiperparametri, este, de asemenea, necunoscută.

Cu această configurație, să vorbim despre câteva modalități potențiale de a explora eficient acest spațiu și de a găsi o comoară!

1.2 — Soluții potențiale

Metoda originală pentru reglarea modelului este „manuală” – inginerul va testa manual multe configurații diferite și va vedea ce combinație de hiperparametri produce cel mai bun model. Deși este informativ, acest proces este ineficient. Trebuie să existe o cale mai bună...

1.2.1 — Căutare în grilă (cel mai rău)

Primul nostru algoritm de optimizare este căutarea în grilă. Căutarea în grilă testează în mod iterativ toate combinațiile posibile de hiperparametri dintr-o grilă specificată de utilizator.

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 2: exemplu de aspect al căutării în grilă. Imaginea autorului

De exemplu, în figura 2, oriunde vedeți un punct roșu este locul unde ne vom reeduca și vom evalua modelul. Acest cadru este ineficient pentru că refolosește hiperparametrii răi. De exemplu, dacă hiperparametrul 2 are un impact redus asupra funcției noastre obiective, vom testa în continuare toate combinațiile valorilor sale, crescând astfel numărul necesar de iterații de 10x (în acest exemplu).

Dar, înainte de a trece mai departe, este important să rețineți că căutarea în grilă este încă destul de populară, deoarece este garantat să găsiți un optim având în vedere o grilă specificată corect. Dacă decideți să utilizați metoda, asigurați-vă că vă transformați grila pentru a reflecta forma funcțională a hiperparametrilor dvs. De exemplu, max_depth pentru a clasificator de pădure aleatoriu este un număr întreg — nu-l lăsa să caute într-un spațiu continuu. De asemenea, este puțin probabil să aibă o distribuție uniformă - dacă cunoașteți forma funcțională a hiperparametrului dvs., transformați grila pentru a o reflecta.

În concluzie, căutarea în grilă este supusă blestemului dimensionalității și recalculează informațiile dintre evaluări, dar este încă folosită pe scară largă.

1.2.2 — Căutare aleatorie (bine)

Al doilea algoritm al nostru este căutarea aleatorie. Căutarea aleatoare încearcă valori aleatorii într-o grilă specificată de utilizator. Spre deosebire de căutarea în grilă, nu suntem relegați să testăm fiecare combinație posibilă de hiperparametri, ceea ce crește eficiența.

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 3: exemplu de căutare aleatorie. Imagine de autor.

Iată un fapt interesant: căutarea aleatorie va găsi (în medie) o configurație de top 5% hiperparametru în interior 60 de iterații. Acestea fiind spuse, ca și în cazul căutării în grilă, trebuie să vă transformați spațiul de căutare pentru a reflecta forma funcțională a fiecărui hyperparam.

Căutarea aleatorie este o bază bună pentru optimizarea hiperparametrului.

1.2.3 — Optimizare bayesiană (mai bună)

Al treilea candidat este primul nostru algoritm de optimizare bazată pe modele secvențiale (SMBO). Diferența conceptuală cheie față de tehnicile anterioare este noi utilizați în mod iterativ execuțiile anterioare pentru a determina punctele viitoare de explorare.

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 4: exemplu de optimizare bayesiană — src. Imaginea autorului.

Optimizarea hiperparametrului bayesian urmărește să dezvolte o distribuție probabilistică a spațiului nostru de căutare a hiperparametrilor. De acolo, folosește o funcție de achiziție, cum ar fi îmbunătățirea așteptată, pentru a transforma hiperspațiul nostru pentru a fi mai „căutabil”. În cele din urmă, folosește un algoritm de optimizare, cum ar fi coborârea gradientului stocastic, pentru a găsi hiperparametrii care maximizează funcția noastră de achiziție. Acei hiperparametri sunt utilizați pentru a se potrivi modelului nostru și procesul se repetă până la convergență.

Optimizarea bayesiană depășește de obicei căutarea aleatoare, totuși are unele limitări de bază, cum ar fi necesitatea de hiperparametri numerici.

1.2.4 — Estimatori Parzen bazați pe arbore (cel mai bun)

În sfârșit, să vorbim despre vedeta emisiunii: Tree-Based Parzen Estimators (TPE). TPE este un alt algoritm SMBO care depășește de obicei optimizarea bayesiană de bază, dar principalul punct de vânzare este că gestionează relații complexe de hiperparametri printr-o structură arborescentă.

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 5: exemplu de structură ierarhică pentru TPE — src. Imaginea autorului.

Să folosim figura 5 pentru a înțelege acest lucru structura arborelui. Aici pregătim un clasificator SVM (Support Vector Machine). Vom testa două nuclee: linear și RBF. O linear nucleul nu ia un parametru de lățime dar RBF face, așa că, folosind un dicționar imbricat, putem codifica această structură și, prin urmare, limităm spațiul de căutare.

TPE suportă, de asemenea, variabile categorice pe care optimizarea tradițională Bayesiană nu le face.

Disclaimer rapid înainte de a trece mai departe, există multe alte pachete de reglare a hiperparametrilor. Fiecare suportă o varietate de algoritmi, dintre care unii includ pădure aleatoare, procese gaussiene și algoritmi genetici. TPE este un algoritm foarte popular și de uz general, dar nu este neapărat cel mai bun.

În general, TPE este o soluție cu adevărat robustă și eficientă de optimizare a hiperparametrilor.

Acum că avem o înțelegere generală a unor algoritmi populari de optimizare a hiperparametrilor, haideți să facem o scufundare profundă în modul în care funcționează TPE.

Revenind la analogia noastră, suntem pirați care caută comori îngropate dar nu ai hartă. Căpitanul nostru are nevoie de comoara cât mai curând posibil, așa că trebuie să săpăm în locații strategice care au o probabilitate mare de a avea comori, folosind săpături anterioare pentru a determina locația viitoarelor săpături.

2.1 — Inițializare

Pentru a începe, noi definiți constrângerile asupra spațiului nostru. După cum sa menționat mai sus, hiperparametrii noștri au adesea o formă funcțională, valori max/min și o relație ierarhică cu alți hiperparametri. Folosind cunoștințele noastre despre algoritmii noștri ML și datele noastre, ne putem defini spațiul de căutare.

În continuare, trebuie definiți funcția noastră obiectivă, care este folosit pentru a evalua cât de „bună” este combinația noastră de hiperparametri. Unele exemple includ funcții clasice de pierdere ML, cum ar fi RMSE sau AUC.

Grozav! Acum că avem un spațiu de căutare limitat și o modalitate de a măsura succesul, suntem gata să începem să căutăm...

2.2 — Optimizare Bayesiană iterativă

Optimizarea bayesiană este un algoritm secvenţial care găseşte puncte în hiperspaţiu cu o mare probabilitate de a fi „de succes” conform unei funcţii obiective. TPE folosește optimizarea bayesiană, dar folosește câteva trucuri inteligente pentru a îmbunătăți performanța și a gestiona complexitatea spațiului de căutare...

2.2.0 — Configurația conceptuală

Primul truc este modelarea P(x|y) în loc de P(y|x)…

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 6: probabilitatea condiționată pe care TPE caută să o rezolve. Imaginea autorului.

Optimizarea bayesiană caută de obicei modelarea P(y|x), care este probabilitatea unei valori a funcției obiective (y), hiperparametrii dat (x). TPE face opusul - arată să modeleze P(x|y), care este probabilitatea hiperparametrilor (x), dată fiind valoarea funcției obiective (y).

Pe scurt, TPE încearcă să găsească cele mai bune valori ale funcției obiective, apoi să determine hiperparametrii asociați.

Cu această configurație foarte importantă, să intrăm în algoritmul real.

2.2.1 — Împărțiți datele noastre în grupuri „Bine” și „Rău”.

Amintiți-vă, scopul nostru este să găsim cele mai bune valori ale hiperparametrului în funcție de o funcție obiectivă. Deci, cum putem face pârghie P(x|y) pentru a face asta?

În primul rând, TPE împarte punctele noastre de date observate în două grupuri: bine, notat g(x), și Rău, notat l(x). Limita dintre bine și rău este determinată de un parametru definit de utilizator gamma (γ), care corespunde percentilei funcției obiective care împarte observațiile noastre (y*).

Deci, cu γ = 0.5, valoarea funcției noastre obiective care împarte observațiile noastre (y*) va fi mediana punctelor noastre observate.

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 7: defalcarea p(x|y) în două seturi. Imaginea autorului.

După cum se arată în figura 7, putem oficializa p(x|y) folosind cadrul de mai sus. Și, pentru a face rost de analogia piraților...

Perspectiva pirat: privind locurile pe care le-am explorat deja, l(x) enumeră locuri cu foarte puțină comoară și g(x) enumeră locuri cu multe comori.

2.2.32— Calculați scorul „promițător”.

În al doilea rând, TPE definește modul în care ar trebui să evaluăm o combinație de hiperparametri neobservați prin intermediul scorul de „promițătură”..

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 8: definiția scorului de promisiune. Imaginea autorului.

Figura 8 definește scorul nostru de promisiune (P), care este doar un raport cu următoarele componente...

  • Numărător: probabilitatea de a observa un set de hiperparametri (x), având în vedere valoarea funcției obiectiv corespunzătoare este „bine. "
  • Numitor: probabilitatea de a observa un set de hiperparametri (x), având în vedere valoarea funcției obiectiv corespunzătoare este „Rău. "

Cu cât valoarea „promițătorului” este mai mare, cu atât este mai probabil ca hiperparametrii noștri x va produce o funcție obiectivă „bună”.

Perspectiva piraților: promițăbilitatea arată cât de probabilă va fi o anumită locație din terenul nostru să aibă o mulțime de comori.

Înainte de a trece mai departe, dacă sunteți familiarizat cu optimizarea bayesiană, această ecuație acționează ca o funcție de achiziție și este proporțională cu Îmbunătățirea așteptată (EI).

2.2.3— Crearea unei estimări de densitate de probabilitate

În al treilea rând, TPE caută să evalueze scorul „promițător” prin modele de amestec. Ideea modelelor de amestec este de a lua mai multe distribuții de probabilitate și de a le pune împreună folosind o combinație liniară - src. Aceste distribuții de probabilitate combinate sunt apoi utilizate pentru a dezvolta estimări ale densității probabilității.

În general, procesul de modelare a amestecului este...

  1. Definiți tipul de distribuție al punctelor noastre. În cazul nostru, dacă variabila noastră este categorială, folosim o distribuție categorială reponderată, iar dacă este numerică folosim o distribuție gaussiană (adică normală) sau uniformă.
  2. Iterați peste fiecare punct și introduceți o distribuție în acel punct.
  3. Însumați masa tuturor distribuțiilor pentru a obține o estimare a densității probabilității.

Rețineți că acest proces este rulat individual pentru ambele seturi l(x) și g(x).

Să parcurgem un exemplu din figura 9...

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 9: exemplu de distribuții gaussiene trunchiate se potrivesc la observații cu 3 hiperparametri. Imaginea autorului.

Pentru fiecare observație (puncte albastre pe axa x), creăm o distribuție normală ~N(μ, σ), unde...

  • μ (mu) este media distribuției noastre normale. Valoarea sa este locația punctului nostru de-a lungul axei x.
  • σ (sigma) este abaterea standard a distribuției noastre normale. Valoarea sa este distanța până la cel mai apropiat punct vecin.

Dacă punctele sunt apropiate, abaterea standard va fi mică și, prin urmare, distribuția va fi foarte înaltă și invers, dacă punctele sunt împrăștiate, distribuția va fi plată (figura 10)...

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 10: exemplu de impact al deviației standard asupra formei unei distribuții normale. Imaginea autorului.

Perspectiva piraților: NA — pirații nu sunt grozavi cu modelele mixte.

O altă scurtă deoparte înainte de a trece mai departe: dacă citiți literatura, veți observa că TPE folosește gaussieni „trunchiați”, ceea ce înseamnă pur și simplu că gaussienii sunt delimitați de intervalul pe care îl specificăm în configurația noastră de hiperparametri în loc să se extindă la +/- infinit. .

2.2.4 — Determinarea următorului punct de explorat!

Să aducem aceste piese împreună. Până acum, am 1) obținut observații ale funcției obiective, 2) am definit formula noastră „promițătoare” și 3) am creat o estimare a densității probabilității prin modele de amestec bazate pe valorile anterioare. Avem toate piesele pentru a evalua un punct dat!

Primul nostru pas este să creăm o funcție de densitate a probabilității medii (PDF) pentru ambele g(x) și l(x).

Hyperparameter Hyper parameter tuning model tuning machine learning data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
Figura 11: suprapunerea densității medii de probabilitate având în vedere 3 puncte observate. Imaginea autorului.

Un exemplu de proces este prezentat în figura 11 - linia roșie este PDF-ul nostru mediu și este pur și simplu suma tuturor PDF-urilor împărțită la numărul de PDF-uri.

Folosind PDF-ul mediu, putem obține probabilitatea oricărei valori a hiperparametrului (x) fiind în g(x) or l(x).

De exemplu, să presupunem că valorile observate din figura 11 aparțin setului „bun”, g(x). Pe baza PDF-ului nostru mediu, este puțin probabil ca o valoare a hiperparametrului de 3.9 sau 0.05 să aparțină setului „bun”. În schimb, o valoare a hiperparametrului de ~1.2 pare să aparțină foarte probabil setului „bun”.

Acum aceasta este doar o jumătate din imagine. Aplicăm aceeași metodologie pentru setul „rău”, l(x). Din moment ce căutăm să maximizăm g(x) / l(x), punctele promițătoare ar trebui să fie localizate unde g(x) este ridicată și l(x) este scăzut.

Destul de cool, nu?

Cu aceste distribuții de probabilitate, putem eșantiona din hiperparametrii noștri structurați în arbore și putem găsi setul de hiperparametri care maximizează „promițăbilitatea” și, prin urmare, merită explorate.

Perspectivă pirat: următoarea locație pe care o săpăm este locația care maximizează (probabilitatea de a avea o mulțime de comori) / (probabilitatea de a avea o comoară mică).

Acum că știți cum funcționează, iată câteva sfaturi practice pentru implementarea TPE prin pachetul open-source, HyperOpt.

3.1 — Structura unei aplicații HyperOpt

În general, există trei pași principali atunci când utilizați HyperOpt...

  1. Definiți spațiul de căutare, care sunt doar intervalele și formele funcționale ale hiperparametrilor pe care doriți să-i optimizați.
  2. Definiți funcția de potrivire, care vă cheamă model.fit() funcția pe o anumită împărțire tren/test.
  3. Definiți funcția obiectiv, care este oricare dintre valorile clasice de precizie, cum ar fi RMSE sau AUC.

Din păcate, aceste metode de reglare automată necesită încă contribuția de proiectare din partea cercetătorului de date - nu este un prânz complet gratuit. Cu toate acestea, din punct de vedere anecdotic, TPE este destul de robust la specificarea greșită a hiperparametrului (în limita rațiunii).

3.2— Sfaturi și trucuri

  • HyperOpt este paralelizabil prin ambele Apache Spark și MongoDB. Dacă lucrați cu mai multe nuclee, fie că este în cloud sau pe mașina dvs. locală, acest lucru poate reduce dramatic timpul de rulare.
  • Dacă paralelizați procesul de reglare prin Apache Spark, utilizați a SparkTrialsobiect pentru modele ML cu un singur nod (sklearn) și a Trails obiect pentru modele ML paralelizate (MLlib). Codul este mai jos.
  • MLflow este o metodă open source pentru urmărirea rulajelor modelului dvs. Se integrează cu ușurință cu HyperOpt.
  • Nu restrângeți spațiul de căutare prea devreme. Unele combinații de hiperparametri pot fi surprinzător de eficiente.
  • Definirea spațiului de căutare poate fi dificilă, mai ales dacă nu cunoști forma funcțională a hiperparametrilor dvs. Cu toate acestea, din experiența personală, TPE este destul de robust la specificarea greșită a acestor forme funcționale.
  • Alegerea unei bune funcții de obiectiv merge mult. În cele mai multe cazuri, eroarea nu este creată egală. Dacă un anumit tip de eroare este mai problematic, asigurați-vă că ați integrat această logică în funcția dvs.

3.3— Un exemplu de cod

Iată un cod pentru rularea HyperOpt într-o manieră distribuită. A fost adaptat după codul din carte, Machine Learning Engineering în acțiune — aici este git repo.

Unele caracteristici frumoase ale acestui fragment includ paralelizarea prin Apache Spark și înregistrarea modelului prin MLflow. De asemenea, rețineți că acest fragment optimizează un sklearn RandomForestRegressor - va trebui să schimbați modelul și funcția de potrivire pentru a se potrivi nevoilor dvs.

Și iată-l - HyperOpt în toată gloria!

Pentru a ciocani speranța punctele cheie, să recapitulăm rapid.

Reglarea hiperparametrului este o parte necesară a ciclului de viață al modelului ML, dar necesită mult timp. Algoritmii de optimizare bazată pe modele secvențiale (SMBO) excelează la căutarea de optime în hiperspații complexe și pot fi aplicați la reglarea hiperparametrului. Estimatorii Parzen bazați pe arbore (TPE) sunt un SMBO foarte eficient și depășește atât optimizarea bayesiană, cât și căutarea aleatorie.

TPE repetă pașii de mai jos până la un criteriu de oprire:

  1. Împărțiți punctele observate în seturi „bune” și „rele”, în funcție de un hiperparametru, gamma.
  2. Potriviți un model de amestec atât la setul „bine” cât și la setul „rău” pentru a dezvolta o estimare a densității de probabilitate medie.
  3. Selectați punctul care optimizează scorul „promițător”, care folosește pasul 2 pentru a estima probabilitatea de a fi în seturile „bun” și „rău”.

În cele din urmă, avem un fragment de cod foarte grozav care arată cum să paralelizezi HyperOpt prin SparkTrials. De asemenea, înregistrează toate iterațiile noastre în MLflow.

HyperOpt Demystified republicat din sursa https://towardsdatascience.com/hyperopt-demystified-3e14006eb6fa?source=rss—-7f60cf5620c9—4 prin https://towardsdatascience.com/feed

<!–

->

Timestamp-ul:

Mai mult de la Consultanți Blockchain