HyperOpt démystifié

Comment automatiser le réglage du modèle avec HyperOpt

Aimez-vous tuning de modèles? Si votre réponse est « oui », ce message est ne sauraient pour vous.

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Un dessin animé de mon grand-père — site de NDN Collective.

Dans ce blog, nous aborderons l'algorithme de réglage automatisé des hyperparamètres extrêmement populaire appelé Estimateurs Parzen basés sur des arbres (TPE). TPE est pris en charge par le package open source HyperOpt. En tirant parti d'HyperOpt et de TPE, les ingénieurs en machine learning peuvent développer rapidement des modèles hautement optimisés sans aucun réglage manuel.

Sans plus tarder, plongeons-nous!

HyperOpt est un package Python open source qui utilise un algorithme appelé Tree-based Parzen Esimtors (TPE) pour sélectionner des hyperparamètres de modèle qui optimisent une fonction objectif définie par l'utilisateur. En définissant simplement la forme fonctionnelle et les limites de chaque hyperparamètre, TPE recherche de manière approfondie mais efficace dans l'hyperespace complexe pour atteindre les optimaux.

TPE est un algorithme séquentiel qui exploite la mise à jour bayésienne et suit la séquence ci-dessous.

  1. Entraînez un modèle avec plusieurs ensembles d'hyperparamètres sélectionnés au hasard, renvoyant des valeurs de fonction objective.
  2. Divisez nos valeurs de fonction objectif observées en groupes « bons » et « mauvais », en fonction d'un certain seuil gamma (γ).
  3. Calculez le score de « prometteur », qui est simplement P(x|bon) / P(x|mauvais).
  4. Déterminez les hyperparamètres qui maximisent le potentiel via des modèles de mélange.
  5. Ajustez notre modèle en utilisant les hyperparamètres de l'étape 4.
  6. Répétez les étapes 2 à 5 jusqu'à ce que vous obteniez un critère d'arrêt.

Voici un exemple de code rapide.

Ok, c'était beaucoup de grands mots. Ralentissons et comprenons vraiment ce qui se passe.

1.1 — Notre objectif

Les data scientists sont occupés. Nous voulons produire de très bons modèles, mais de manière efficace et idéalement sans intervention.

Cependant, certaines étapes du cycle de vie de la modélisation ML sont très difficiles à automatiser. L'analyse exploratoire des données (EDA) et l'ingénierie des fonctionnalités, par exemple, sont généralement spécifiques à un sujet et nécessitent l'intuition humaine. Le réglage du modèle, en revanche, est un processus itératif dans lequel les ordinateurs peuvent exceller.

Notre objectif tout au long de cet article est de comprendre comment exploiter les algorithmes pour automatiser le processus de réglage des modèles.

Pour nous aider à réfléchir à cet objectif, utilisons une analogie : nous sommes des pirates à la recherche d'un trésor enfoui. Il est également important de noter que nous sommes des pirates très efficaces qui cherchent à minimiser notre temps à rechercher le trésor enfoui. Alors, comment minimiser le temps passé à chercher ? La réponse est utilisez une carte!

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 1: exemple d'espace de recherche d'hyperparamètres 3D. L'emplacement du coffre au trésor est un optimal global. Image de l'auteur.

Dans la figure 1, nous avons une carte fictive qui montre où se trouve notre trésor. Après beaucoup d'escalade et de fouilles, il ne serait pas trop difficile d'atteindre ce trésor car nous savons exactement où il se trouve.

Mais que se passe-t-il lorsque nous n’avons pas de carte ?

Lorsque nous sommes chargés de régler un modèle, nous ne recevons malheureusement pas de carte. Notre terrain, qui correspond à l'espace de recherche de l'hyperparmètre, est inconnu. De plus, l’emplacement de notre trésor, qui correspond à l’ensemble optimal d’hyperparamètres, est également inconnu.

Avec cette configuration, parlons de quelques moyens potentiels d'explorer efficacement cet espace et de trouver un trésor !

1.2 — Solutions potentielles

La méthode originale de réglage du modèle est « manuelle » : l'ingénieur testera manuellement de nombreuses configurations différentes et verra quelle combinaison d'hyperparamètres produit le meilleur modèle. Bien qu'informatif, ce processus est inefficace. Il doit y avoir une meilleure façon…

1.2.1 — Recherche de grille (pire)

Notre premier algorithme d'optimisation est la recherche par grille. La recherche de grille teste de manière itérative toutes les combinaisons possibles d’hyperparamètres dans une grille spécifiée par l’utilisateur.

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 2 : exemple de disposition de recherche en grille. Image de l'auteur

Par exemple, dans la figure 2, partout où vous voyez un point rouge, c'est l'endroit où nous allons recycler et évaluer notre modèle. Ce cadre est inefficace car il réutilise les mauvais hyperparamètres. Par exemple, si l'hyperparamètre 2 a peu d'impact sur notre fonction objectif, nous testerons quand même toutes les combinaisons de ses valeurs, augmentant ainsi le nombre d'itérations requis de 10x (dans cet exemple).

Mais avant de continuer, il est important de noter que la recherche par grille est encore assez populaire car elle garantit de trouver un optimal pour une grille correctement spécifiée. Si vous décidez d'utiliser la méthode, assurez-vous de transformer votre grille pour refléter la forme fonctionnelle de vos hyperparamètres. Par exemple, max_degree pour un classificateur de forêt aléatoire est un entier — ne le laissez pas chercher dans un espace continu. Il est également peu probable qu'il ait une distribution uniforme : si vous connaissez la forme fonctionnelle de votre hyperparamètre, transformez la grille pour la refléter.

En résumé, les La recherche par grille est soumise à la malédiction de la dimensionnalité et recalcule les informations entre les évaluations, mais elle est encore largement utilisée.

1.2.2 — Recherche aléatoire (bon)

Notre deuxième algorithme est la recherche aléatoire. La recherche aléatoire essaie des valeurs aléatoires dans une grille spécifiée par l'utilisateur. Contrairement à la recherche par grille, nous ne sommes pas obligés de tester toutes les combinaisons possibles d'hyperparamètres, ce qui augmente l'efficacité.

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 3 : exemple de recherche aléatoire. Image de l'auteur.

Voici un fait intéressant : une recherche aléatoire trouvera (en moyenne) une configuration d'hyperparamètres supérieure à 5 % dans 60 XNUMX itérations. Cela dit, comme pour la recherche par grille, vous devez transformer votre espace de recherche pour refléter la forme fonctionnelle de chaque hyperparamètre.

La recherche aléatoire est une bonne base de référence pour l'optimisation des hyperparamètres.

1.2.3 — Optimisation bayésienne (meilleure)

Notre troisième candidat est notre premier algorithme d'optimisation basée sur un modèle séquentiel (SMBO). La principale différence conceptuelle par rapport aux techniques précédentes est que nous utiliser de manière itérative les analyses antérieures pour déterminer les futurs points d’exploration.

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 4 : exemple d'optimisation bayésienne – src. Image de l'auteur.

L'optimisation bayésienne des hyperparamètres cherche à développer une distribution probabiliste de notre espace de recherche d'hyperparamètres. À partir de là, il utilise une fonction d’acquisition, telle que l’amélioration attendue, pour transformer notre hyperespace afin qu’il soit plus « consultable ». Enfin, il utilise un algorithme d'optimisation, tel que la descente de gradient stochastique, pour trouver les hyperparamètres qui maximisent notre fonction d'acquisition. Ces hyperparamètres sont utilisés pour ajuster notre modèle et le processus est répété jusqu'à convergence.

L'optimisation bayésienne surpasse généralement la recherche aléatoire, mais elle présente certaines limites fondamentales, telles que la nécessité d'hyperparamètres numériques.

1.2.4 — Estimateurs Parzen basés sur des arbres (meilleurs)

Enfin, parlons de la star du spectacle : les estimateurs Parzen basés sur des arbres (TPE). TPE est un autre algorithme SMBO qui surpasse généralement l'optimisation bayésienne de base, mais son principal argument de vente est qu'il gère des relations hyperparamétriques complexes via une structure arborescente.

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 5 : exemple de structure hiérarchique pour TPE — src. Image de l'auteur.

Utilisons la figure 5 pour comprendre cela arborescence. Ici, nous formons un classificateur SVM (Support Vector Machine). Nous allons tester deux noyaux : linear ainsi que RBF. A linear le noyau ne prend pas de paramètre de largeur mais RBF le fait, donc en utilisant un dictionnaire imbriqué, nous sommes capables de coder cette structure et ainsi de limiter l'espace de recherche.

TPE prend également en charge les variables catégorielles, ce que l'optimisation bayésienne traditionnelle ne prend pas en charge.

Avertissement rapide avant de continuer, il y a de nombreux autres packages de réglage d'hyperparamètres. Chacun prend en charge une variété d’algorithmes, dont certains incluent des forêts aléatoires, des processus gaussiens et des algorithmes génétiques. Le TPE est un algorithme très populaire et polyvalent, mais il n’est pas nécessairement le meilleur.

De manière générale, TPE est une solution d'optimisation d'hyperparamètres vraiment robuste et efficace.

Maintenant que nous avons une compréhension générale de certains algorithmes d’optimisation d’hyperparamètres populaires, examinons en profondeur le fonctionnement du TPE.

Pour en revenir à notre analogie, nous sommes des pirates à la recherche d'un trésor enfoui. mais je n'ai pas de carte. Notre capitaine a besoin du trésor dès que possible, nous devons donc creuser dans des endroits stratégiques qui ont une forte probabilité de trouver un trésor, en utilisant les fouilles précédentes pour déterminer l'emplacement des fouilles futures.

2.1 — Initialisation

Pour commencer, nous définir les contraintes sur notre espace. Comme indiqué ci-dessus, nos hyperparamètres ont souvent une forme fonctionnelle, des valeurs max/min et une relation hiérarchique avec d'autres hyperparamètres. Grâce à nos connaissances sur nos algorithmes ML et nos données, nous pouvons définir notre espace de recherche.

Ensuite, nous devons définir notre fonction objectif, qui est utilisé pour évaluer la « bonne » de notre combinaison d'hyperparamètres. Quelques exemples incluent des fonctions de perte ML classiques, telles que RMSE ou AUC.

Super! Maintenant que nous disposons d’un espace de recherche limité et d’un moyen de mesurer le succès, nous sommes prêts à commencer la recherche…

2.2 — Optimisation bayésienne itérative

L'optimisation bayésienne est un algorithme séquentiel qui trouve des points dans l'hyperespace avec une forte probabilité de « réussir » selon une fonction objective. TPE exploite l'optimisation bayésienne mais utilise quelques astuces intelligentes pour améliorer les performances et gérer la complexité de l'espace de recherche…

2.2.0 — La configuration conceptuelle

La première astuce est la modélisation P(x|y) au lieu de P(y|x)…

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 6 : probabilité conditionnelle que TPE cherche à résoudre. Image de l'auteur.

L'optimisation bayésienne cherche généralement à modéliser P(y|x), qui est la probabilité d'une valeur de fonction objectif (y), étant donné les hyperparamètres (x). Le TPE fait le contraire : il ressemble à un modèle P(x|y), qui est la probabilité des hyperparamètres (x), étant donné la valeur de la fonction objectif (y).

En bref, TPE tente de trouver les meilleures valeurs de fonction objectif, puis de déterminer les hyperparamètres associés.

Avec cette configuration très importante, entrons dans l’algorithme proprement dit.

2.2.1 — Divisez nos données en groupes « bons » et « mauvais »

N'oubliez pas que notre objectif est de trouver les meilleures valeurs d'hyperparamètres en fonction d'une fonction objectif. Alors, comment pouvons-nous tirer parti P(x|y) pour faire ça?

Premièrement, TPE divise nos points de données observés en deux groupes : Bien, dénoté g(x), ainsi que mauvais, dénoté l(x). La limite entre le bien et le mal est déterminée par un paramètre gamma (γ) défini par l'utilisateur, qui correspond au percentile de la fonction objectif qui divise nos observations (y*).

Ainsi, avec γ = 0.5, notre valeur de fonction objectif qui divise nos observations (y*) sera la médiane de nos points observés.

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 7 : décomposition de p(x|y) en deux ensembles. Image de l'auteur.

Comme le montre la figure 7, on peut formaliser p(x|y) en utilisant le cadre ci-dessus. Et pour reprendre l’analogie avec les pirates…

Perspective pirate : en regardant les endroits que nous avons déjà explorés, l(x) répertorie les endroits avec très peu de trésors et g(x) répertorie les endroits avec beaucoup de trésors.

2.2.32— Calculer le score « Promesse »

Deuxièmement, TPE définit comment nous devons évaluer une combinaison d'hyperparamètres non observée via le score « prometteur ».

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 8 : définition du score de promesse. Image de l'auteur.

La figure 8 définit notre score de promesse (P), qui n’est qu’un rapport avec les composants suivants…

  • Numérateur: la probabilité d'observer un ensemble d'hyperparamètres (x), étant donné que la valeur de la fonction objectif correspondante est «Bien. »
  • Dénominateur: la probabilité d'observer un ensemble d'hyperparamètres (x), étant donné que la valeur de la fonction objectif correspondante est «mauvais. »

Plus la valeur de « caractère prometteur » est grande, plus il est probable que nos hyperparamètres x produira une « bonne » fonction objectif.

Perspective pirate : le caractère prometteur montre la probabilité qu'un emplacement donné sur notre terrain contienne de nombreux trésors.

Petit aparté avant de continuer, si vous êtes familier avec l'optimisation bayésienne, cette équation agit comme une fonction d'acquisition et est proportionnelle à la Amélioration attendue (EI).

2.2.3— Créer une estimation de densité de probabilité

Troisièmement, TPE cherche à évaluer le score de « caractère prometteur » via modèles de mélange. L'idée des modèles de mélange est de prendre plusieurs distributions de probabilité et de les assembler à l'aide d'une combinaison linéaire : src. Ces distributions de probabilité combinées sont ensuite utilisées pour élaborer des estimations de densité de probabilité.

Généralement, le processus de modélisation du mélange est…

  1. Définir le type de répartition de nos points. Dans notre cas, si notre variable est catégorielle, nous utilisons une distribution catégorielle repondérée et si elle est numérique, nous utilisons une distribution gaussienne (c'est-à-dire normale) ou uniforme.
  2. Parcourez chaque point et insérez une distribution à ce point.
  3. Additionnez la masse de toutes les distributions pour obtenir une estimation de la densité de probabilité.

Notez que ce processus est exécuté individuellement pour les deux ensembles l(x) ainsi que g(x).

Passons en revue un exemple dans la figure 9…

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 9 : exemple de distributions gaussiennes tronquées adaptées à 3 observations hyperparamétriques. Image de l'auteur.

Pour chaque observation (points bleus sur l'axe des x), nous créons une distribution normale ~N(μ, σ), où…

  • µ (mu) est la moyenne de notre distribution normale. Sa valeur est l'emplacement de notre point le long de l'axe des x.
  • σ (sigma) est l'écart type de notre distribution normale. Sa valeur est la distance au point voisin le plus proche.

Si les points sont rapprochés, l’écart type sera faible et donc la distribution sera très haute et inversement, si les points sont écartés, la distribution sera plate (figure 10)…

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 10 : exemple de l'impact de l'écart type sur la forme d'une distribution normale. Image de l'auteur.

Point de vue des pirates : NA — les pirates ne sont pas doués avec les modèles mixtes.

Un autre petit aparté avant de continuer : si vous lisez la littérature, vous remarquerez que TPE utilise des gaussiennes « tronquées », ce qui signifie simplement que les gaussiennes sont délimitées par la plage que nous spécifions dans notre configuration d'hyperparamètres au lieu de s'étendre à +/- l'infini. .

2.2.4 — Déterminer le prochain point à explorer !

Rassemblons ces pièces. Jusqu'à présent, nous avons 1) acquis des observations de fonctions objectives, 2) défini notre formule de « caractère prometteur » et 3) créé une estimation de densité de probabilité via des modèles de mélange basés sur des valeurs antérieures. Nous avons toutes les pièces pour évaluer un point donné !

Notre première étape consiste à créer une fonction de densité de probabilité moyenne (PDF) pour les deux g (x) ainsi que l(x).

Hyperparamètre réglage du modèle d'hyperparamètre réglage de l'apprentissage automatique science des données modèle sklearn mllib spark hyperopt arbre parzen estimateur tpe basé sur un arbre parzen esimtator mlflow databricks
Figure 11 : superposition de la densité de probabilité moyenne étant donné 3 points observés. Image de l'auteur.

Un exemple de processus est présenté dans la figure 11 : la ligne rouge représente notre PDF moyen et est simplement la somme de tous les PDF divisée par le nombre de PDF.

En utilisant le PDF moyen, nous pouvons obtenir la probabilité de n'importe quelle valeur d'hyperparamètre (x) être en g (x) or l(x).

Par exemple, disons que les valeurs observées dans la figure 11 appartiennent à l'ensemble des « bons », g (x). Sur la base de notre PDF moyen, il est peu probable qu'une valeur d'hyperparamètre de 3.9 ou 0.05 appartienne au « bon » ensemble. À l’inverse, une valeur d’hyperparamètre de ~1.2 semble très probablement appartenir au « bon » ensemble.

Maintenant, ce n’est qu’une moitié du tableau. Nous appliquons la même méthodologie pour le « mauvais » ensemble, je(x). Puisque nous cherchons à maximiser g(x) / l(x), les points prometteurs devraient être situés là où g (x) est élevé et l(x) est faible.

Assez cool, n'est-ce pas?

Avec ces distributions de probabilité, nous pouvons échantillonner à partir de nos hyperparamètres structurés en arbre et trouver l'ensemble d'hyperparamètres qui maximisent le « potentiel » et qui méritent donc d'être explorés.

Perspective pirate : le prochain emplacement que nous creusons est l'emplacement qui maximise la (probabilité d'avoir beaucoup de trésor) / (probabilité d'avoir peu de trésor).

Maintenant que vous savez comment cela fonctionne, voici quelques conseils pratiques pour implémenter le TPE via le package open source HyperOpt.

3.1 — Structure d'une application HyperOpt

Généralement, il y a trois étapes principales pour tirer parti d’HyperOpt…

  1. Définir l'espace de recherche, qui ne représente que les plages et les formes fonctionnelles des hyperparamètres que vous cherchez à optimiser.
  2. Définir la fonction d'ajustement, qui appelle ton model.fit() fonctionner sur une répartition train/test donnée.
  3. Définir la fonction objectif, qui est l’une des mesures de précision classiques, telles que RMSE ou AUC.

Malheureusement, ces méthodes de réglage automatisées nécessitent toujours la contribution du data scientist en matière de conception – ce n'est pas un repas totalement gratuit. Cependant, de manière anecdotique, le TPE est assez robuste aux erreurs de spécification des hyperparamètres (dans des limites raisonnables).

3.2— Trucs et astuces

  • HyperOpt est parallélisable via les deux Apache Spark ainsi que MongoDB. Si vous travaillez avec plusieurs cœurs, que ce soit dans le cloud ou sur votre machine locale, cela peut réduire considérablement le temps d'exécution.
  • Si vous parallélisez le processus de réglage via Apache Spark, utilisez un SparkTrialsobjet pour les modèles ML à nœud unique (sklearn) et un Trails objet pour les modèles ML parallélisés (MLlib). Le code est ci-dessous.
  • MLflow est une méthode open source pour suivre les exécutions de votre modèle. Il s'intègre facilement à HyperOpt.
  • Ne réduisez pas l’espace de recherche trop tôt. Certaines combinaisons d’hyperparamètres peuvent être étonnamment efficaces.
  • Définir l'espace de recherche peut être délicat, surtout si vous ne connaissez pas l'espace de recherche. forme fonctionnelle de vos hyperparamètres. Cependant, d'après mon expérience personnelle, le TPE est assez résistant aux erreurs de spécification de ces formes fonctionnelles.
  • Choisir une bonne fonction objectif est très utile. Dans la plupart des cas, l’erreur n’est pas égale. Si un certain type d'erreur est plus problématique, assurez-vous d'intégrer cette logique à votre fonction.

3.3— Un exemple de code

Voici un code pour exécuter HyperOpt de manière distribuée. Il a été adapté du code du livre, L'ingénierie de l'apprentissage automatique en action - Ici se trouve le dépôt git.

Certaines fonctionnalités intéressantes de cet extrait incluent la parallélisation via Apache Spark et journalisation du modèle via MLflow. Notez également que cet extrait optimise un RandomForestRegressor sklearn — vous devrez modifier le modèle et la fonction d'ajustement pour répondre à vos besoins.

Et voilà : HyperOpt dans toute sa splendeur !

Pour marteler l’espoir sur les points clés, récapitulons rapidement.

Le réglage des hyperparamètres est une partie nécessaire du cycle de vie du modèle ML, mais prend du temps. Les algorithmes d'optimisation basée sur un modèle séquentiel (SMBO) excellent dans la recherche d'optimums dans des hyperespaces complexes et peuvent être appliqués au réglage des hyperparamètres. Les estimateurs Parzen basés sur des arbres (TPE) sont un SMBO très efficace et surpassent à la fois l'optimisation bayésienne et la recherche aléatoire.

TPE répète les étapes ci-dessous jusqu'à ce qu'un critère d'arrêt soit atteint :

  1. Divisez les points observés en ensembles « bons » et « mauvais », selon un hyperparamètre, gamma.
  2. Ajustez un modèle de mélange aux ensembles « bon » et « mauvais » pour développer une estimation de densité de probabilité moyenne.
  3. Sélectionnez le point qui optimise le score de « caractère prometteur », qui exploite l'étape 2 pour estimer la probabilité d'être dans les ensembles « bon » et « mauvais ».

Enfin, nous avons un extrait de code vraiment sympa qui montre comment paralléliser HyperOpt via SparkTrials. Il enregistre également toutes nos itérations dans MLflow.

HyperOpt démystifié republié à partir de la source https://towardsdatascience.com/hyperopt-demystified-3e14006eb6fa?source=rss—-7f60cf5620c9—4 via https://towardsdatascience.com/feed

<!–

->

Horodatage:

Plus de Consultants en blockchain