Polydesk-logotype
Polydesk.ai — Header

Bayesian Optimization

La Bayesian Optimization (optimisation bayésienne) est une méthode d’optimisation séquentielle qui utilise un modèle probabiliste (typiquement un processus gaussien) pour approximer une fonction objectif coûteuse à évaluer, guidant intelligemment la recherche vers l’optimum global en équilibrant exploration et exploitation.

En machine learning, le cas d’usage principal est le tuning d’hyperparamètres. Chaque évaluation d’une combinaison d’hyperparamètres implique un entraînement complet (ou partiel) du modèle, ce qui peut prendre des heures à des jours. La Bayesian Optimization réduit le nombre d’évaluations nécessaires en apprenant un modèle des résultats passés et en choisissant intelligemment le prochain point à évaluer. Là où une grid search teste aveuglément des centaines de combinaisons, la Bayesian Optimization trouve des solutions comparables avec 10 à 50 évaluations.

C’est la méthode de référence pour le tuning d’hyperparamètres quand chaque évaluation est coûteuse, et elle est au coeur d’outils populaires comme Optuna, Ray Tune et Weights & Biases Sweeps.

Bayesian Optimization en bref
Catégorie
Optimisation / AutoML
Objectif
Trouver l’optimum d’une fonction coûteuse à évaluer avec peu d’évaluations
Modèle surrogate
Processus Gaussien (GP), Random Forest, TPE
Fonction d’acquisition
Expected Improvement (EI), Upper Confidence Bound (UCB)
Cas d’usage principal
Tuning d’hyperparamètres ML/DL
Outils
Optuna, Ray Tune, Hyperopt, scikit-optimize, BoTorch
Paper fondateur
Snoek, Larochelle, Adams « Practical Bayesian Optimization of ML Algorithms » (2012)

Le principe de la Bayesian Optimization

L’idée fondamentale est de remplacer l’évaluation directe d’une fonction coûteuse par un modèle approximatif (le « modèle surrogate ») qui est rapide à évaluer. Ce modèle est mis à jour après chaque évaluation réelle, devenant progressivement plus précis. Le processus se déroule en quatre étapes cycliques :

1. Initialisation. On évalue la fonction objectif en quelques points choisis aléatoirement (ou via un plan d’expérience). Par exemple, on entraîne un modèle avec 5 à 10 combinaisons d’hyperparamètres tirées au hasard.

2. Construction du modèle surrogate. On ajuste un processus gaussien (ou un autre modèle probabiliste) sur les résultats observés. Le processus gaussien fournit, pour chaque point non évalué, une prédiction (la moyenne) et une mesure d’incertitude (la variance). Les zones explorées ont une faible incertitude, les zones inexplorées une forte incertitude.

3. Sélection du prochain point. Une fonction d’acquisition combine la prédiction et l’incertitude pour décider quel point évaluer ensuite. Ce choix équilibre exploration (essayer des zones inconnues) et exploitation (approfondir les zones prometteuses).

4. Évaluation et mise à jour. Le point choisi est évalué (le modèle ML est entraîné avec ces hyperparamètres). Le résultat est ajouté au dataset d’observations, le modèle surrogate est mis à jour, et le cycle reprend.

Analogie de la carte Imaginez que vous cherchez le point culminant d’une montagne dans le brouillard. Vous ne pouvez mesurer l’altitude qu’en marchant jusqu’à un point (coûteux). Après quelques mesures, vous construisez une carte approximative du terrain (modèle surrogate). Cette carte vous dit où l’altitude est probablement élevée (exploitation) et où vous manquez d’information (exploration). Vous choisissez votre prochain point de mesure en combinant ces deux critères.

Le modèle surrogate : le processus gaussien

Le processus gaussien (GP) est le modèle surrogate le plus utilisé en Bayesian Optimization. C’est une distribution de probabilité sur des fonctions : au lieu de prédire une seule valeur pour un point donné, il prédit une distribution normale (avec une moyenne et une variance).

Le GP est défini par deux composants :

La fonction de moyenne (mean function). Typiquement fixée à zéro, elle représente notre a priori sur la valeur attendue de la fonction. En pratique, l’initialisation avec des points aléatoires rend ce choix peu critique.

Le noyau (kernel function). Définit la « similarité » attendue entre deux points de l’espace. Le noyau Matérn-5/2 est le plus courant pour le tuning d’hyperparamètres. Deux points proches dans l’espace des hyperparamètres devraient avoir des performances similaires (c’est l’hypothèse de continuité encodée par le kernel).

Le GP offre deux propriétés essentielles : ses prédictions sont précises dans les zones bien échantillonnées (faible variance), et honnêtes sur leur incertitude dans les zones peu explorées (forte variance). C’est cette quantification d’incertitude qui rend la Bayesian Optimization supérieure à la random search.

Alternatives au processus gaussien

Tree-structured Parzen Estimator (TPE). Utilisé par Optuna et Hyperopt. Au lieu de modéliser la relation hyperparamètres → performance, TPE modélise deux distributions : la distribution des hyperparamètres qui donnent de bons résultats (l(x)) et celle des hyperparamètres qui donnent de mauvais résultats (g(x)). Le prochain point est choisi pour maximiser le ratio l(x)/g(x). TPE est efficace pour les espaces de grande dimension et les hyperparamètres conditionnels (arborescents).

Random Forests. SMAC (Sequential Model-based Algorithm Configuration) utilise des forêts aléatoires comme modèle surrogate. L’avantage : les random forests gèrent nativement les variables catégorielles et les hyperparamètres mixtes (continus + discrets). L’incertitude est estimée via la variance des arbres de la forêt.

Les fonctions d’acquisition

La fonction d’acquisition traduit les prédictions du modèle surrogate en un score indiquant l’intérêt de chaque point non évalué. Les deux plus populaires sont :

Expected Improvement (EI)

EI calcule l’amélioration espérée par rapport au meilleur résultat observé jusqu’ici. Si le modèle prédit une haute performance (exploitation) OU une forte incertitude (exploration), le EI sera élevé. La formule combine naturellement les deux objectifs.

EI est le choix par défaut dans la plupart des implémentations. Il est robuste, bien compris théoriquement, et fonctionne bien en pratique.

Upper Confidence Bound (UCB)

UCB sélectionne le point qui maximise μ(x) + κ × σ(x), où μ est la moyenne prédite, σ l’écart-type prédit, et κ un paramètre qui contrôle le compromis exploration/exploitation. Un κ élevé favorise l’exploration, un κ bas favorise l’exploitation.

UCB est plus simple à implémenter et à interpréter que EI, mais nécessite le réglage de κ, un « hyperparamètre de l’hyperparamètre tuning ».

Bayesian Optimization vs autres méthodes

Méthode Évaluations nécessaires Parallélisable Gère les dimensions élevées Cas d’usage
Grid Search Exponentielles (N^d) Oui Non (malédiction de la dimension) 1-2 hyperparamètres
Random Search ~50-100 Oui Moyen Baseline solide, 3-10 hyperparamètres
Bayesian Optimization ~10-50 Avec adaptations Jusqu’à ~20 dimensions Évaluations coûteuses, 3-15 hyperparamètres
Hyperband/ASHA Budget variable Oui (nativement) Bon Deep learning, early stopping naturel

La Bayesian Optimization est la plus sample-efficient : elle trouve de bonnes solutions avec le moins d’évaluations. Mais elle a un coût : l’ajustement du GP est en O(n³) avec n le nombre d’observations, ce qui devient lent au-delà de ~1000 évaluations. En pratique, ce n’est pas un problème pour le tuning d’hyperparamètres (où n < 100 est typique), mais c'est une limitation théorique.

Quand utiliser quoi Budget de 5-20 évaluations (coûteuses) : Bayesian Optimization. Budget de 50-200 évaluations (modérément coûteuses) : Hyperband ou Bayesian Optimization. Budget de 500+ évaluations (peu coûteuses) : Random Search suffit. Grid Search : uniquement pour 1-2 hyperparamètres avec des valeurs discrètes connues.

Outils pratiques

Optuna

Optuna est devenu l’outil de référence pour le tuning d’hyperparamètres en Python. Il utilise TPE (Tree-structured Parzen Estimator) comme sampler par défaut, avec support de CMA-ES et du processus gaussien. Son API « define-by-run » permet de définir l’espace de recherche programmatiquement, ce qui supporte nativement les espaces conditionnels.

import optuna

def objective(trial):
    lr = trial.suggest_float("lr", 1e-5, 1e-3, log=True)
    batch_size = trial.suggest_categorical("batch_size", [16, 32, 64])
    dropout = trial.suggest_float("dropout", 0.0, 0.5)

    model = create_model(lr=lr, batch_size=batch_size, dropout=dropout)
    accuracy = train_and_evaluate(model)
    return accuracy

study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)

print(f"Best params: {study.best_params}")
print(f"Best accuracy: {study.best_value}")

Optuna supporte aussi le pruning (arrêt précoce des essais peu prometteurs via MedianPruner ou HyperbandPruner), l’optimisation multi-objectif, et la visualisation intégrée des résultats.

Ray Tune

Ray Tune est un framework distribué qui orchestre le tuning sur un cluster de GPU. Il intègre de nombreux algorithmes (Bayesian Optimization via BoTorch, ASHA, PBT, HyperOpt) et gère nativement le checkpointing, la reprise, et le scheduling de ressources. C’est le choix pour les entreprises qui tunent sur des dizaines de GPU en parallèle.

BoTorch (Meta)

BoTorch est une bibliothèque de Bayesian Optimization construite sur PyTorch et GPyTorch (processus gaussiens sur GPU). C’est l’outil de choix pour les chercheurs qui veulent implémenter des variantes avancées de BO (multi-objectif, contraintes, batch BO). BoTorch est le backend de BO dans Ax (la plateforme d’expérimentation de Meta).

Weights & Biases Sweeps

Weights & Biases propose un service de Sweeps qui lance automatiquement des runs de tuning avec Bayesian Optimization, random search ou grid search. L’avantage principal est l’intégration avec le tracking de métriques W&B : chaque run est loggé, visualisé et comparable dans un dashboard unifié.

Limites de la Bayesian Optimization

Haute dimensionnalité

Les processus gaussiens souffrent de la « malédiction de la dimensionnalité » : au-delà de ~20 hyperparamètres, l’espace est tellement vaste que le GP a du mal à construire un modèle utile. TPE et les random forests gèrent mieux les hautes dimensions. Pour les espaces très grands (50+ dimensions), la random search reste compétitive.

Coût du GP

L’inversion de la matrice de covariance du GP est en O(n³) avec n le nombre d’observations. Après quelques centaines d’évaluations, l’optimisation du GP elle-même devient le goulot d’étranglement. Des approximations (processus gaussiens sparse, méthodes inducing-points) atténuent ce problème.

Parallélisme limité

La Bayesian Optimization est intrinsèquement séquentielle : on évalue un point, on met à jour le modèle, on choisit le suivant. Le « batch BO » (choisir K points simultanément) existe mais est moins sample-efficient que le BO séquentiel. Pour le tuning sur un large cluster de GPU, Hyperband/ASHA sont souvent préférés car nativement parallèles.

Sensibilité au kernel

La performance de la BO dépend du choix du kernel du GP, qui encode des hypothèses sur la régularité de la fonction objectif. Un kernel inadapté (trop lisse, trop rugueux) dégrade les performances. Google Research a proposé HyperBO (2022), qui pré-entraîne le GP sur des données de tuning passées pour éviter ce choix manuel.

Bayesian Optimization et LLM

Pour les LLM, la Bayesian Optimization a un rôle limité dans le pré-entraînement (les hyperparamètres sont bien établis par les scaling laws). En revanche, elle est très utile pour le fine-tuning où le choix du learning rate, du weight decay, du nombre d’epochs et des paramètres LoRA (rang, alpha) impacte significativement les résultats. Hugging Face Trainer s’intègre avec Optuna pour le tuning automatique de ces hyperparamètres.

Bayesian Optimization multi-objectif

Le tuning d’hyperparamètres implique souvent des objectifs contradictoires : maximiser la précision tout en minimisant la latence, ou maximiser la qualité tout en minimisant la taille du modèle. La Bayesian Optimization multi-objectif cherche le « front de Pareto », l’ensemble des solutions où aucun objectif ne peut être amélioré sans dégrader un autre.

BoTorch (Meta) propose des implémentations avancées de BO multi-objectif via les algorithmes EHVI (Expected HyperVolume Improvement) et NEHVI (Noisy Expected HyperVolume Improvement). Optuna supporte aussi l’optimisation multi-objectif via optuna.create_study(directions=["maximize", "minimize"]).

En pratique, le multi-objectif est particulièrement utile pour le déploiement de modèles sur des appareils à ressources limitées : vous cherchez le meilleur compromis entre qualité et latence pour votre hardware cible. C’est exactement l’approche utilisée par MnasNet (Google) pour concevoir des architectures mobiles optimales.

Techniques avancées

Transfer Learning pour la BO

Si vous avez déjà fait du tuning sur des tâches similaires, ces résultats passés peuvent « chauffer » le processus gaussien pour de nouvelles tâches. Google Research a proposé HyperBO, qui pré-entraîne le GP sur un large dataset de tuning multi-tâches (dizaines de milliers de configurations de modèles deep learning). Le résultat : HyperBO localise de bons hyperparamètres 3x plus efficacement que les méthodes concurrentes, même sur des tâches non vues pendant le pré-entraînement.

Multi-fidelity BO

Au lieu d’entraîner chaque modèle complètement (haute fidélité, coûteux), on peut d’abord l’entraîner partiellement (basse fidélité, rapide) pour estimer sa performance. La BO multi-fidelity utilise ces estimations à différents niveaux de fidélité (peu d’epochs, petit dataset, modèle réduit) pour guider la recherche de façon plus efficace. BOHB (Bayesian Optimization HyperBand) combine la BO avec Hyperband pour obtenir le meilleur des deux mondes : l’efficacité de la BO et l’allocation de ressources adaptative d’Hyperband.

BO sous contraintes

Dans certains cas, les hyperparamètres doivent respecter des contraintes (mémoire GPU maximale, latence maximale). La BO sous contraintes modélise à la fois la fonction objectif et les fonctions de contrainte avec des GP séparés, puis choisit le prochain point en tenant compte de la probabilité de satisfaire les contraintes. BoTorch supporte nativement ce type d’optimisation via la classe ConstrainedExpectedImprovement.

Conseils pratiques

Utilisez l’échelle logarithmique pour le learning rate. Le learning rate varie sur plusieurs ordres de grandeur (1e-5 à 1e-2). Échantillonner en échelle logarithmique (via trial.suggest_float("lr", 1e-5, 1e-2, log=True) dans Optuna) est bien plus efficace qu’en échelle linéaire, car cela donne un poids égal à chaque ordre de grandeur.

Commencez large, puis affinez. Lancez d’abord un run exploratoire avec des plages d’hyperparamètres larges et peu d’essais (20-30). Identifiez la zone prometteuse, puis relancez un run plus fin sur cette zone réduite. Cette approche en deux passes est plus efficace qu’un seul long run.

Activez le pruning dans Optuna. Le pruning arrête les essais peu prometteurs avant la fin de l’entraînement, économisant du GPU. Avec MedianPruner, un essai est arrêté si sa performance intermédiaire est en dessous de la médiane des essais précédents au même step. Cela peut réduire le temps total de tuning de 50% sans perte de qualité.

Fixez les hyperparamètres non critiques. Ne tunez pas tout en même temps. Fixez d’abord les hyperparamètres dont vous connaissez de bonnes valeurs (par exemple, Adam avec β1=0.9, β2=0.999) et ne tunez que les 3-5 hyperparamètres les plus impactants (learning rate, weight decay, batch size, warmup, dropout). Moins de dimensions = meilleure efficacité de la BO.


Questions fréquentes sur la Bayesian Optimization

La Bayesian Optimization est-elle meilleure que la random search ?

En nombre d’évaluations nécessaires, oui. La BO trouve de bonnes solutions avec 2 à 5x moins d’évaluations que la random search. Cependant, chaque itération de BO a un overhead (ajustement du GP, optimisation de la fonction d’acquisition). Pour les cas où les évaluations sont rapides (< 1 minute), la random search peut être plus pratique car elle est massivement parallélisable et n'a pas d'overhead. La BO brille quand chaque évaluation est coûteuse (heures ou jours d'entraînement).

Combien d’évaluations initiales faut-il ?

Typiquement 5 à 2×d évaluations initiales aléatoires (où d est le nombre d’hyperparamètres). Pour 5 hyperparamètres, commencez avec 10 points aléatoires. Trop peu de points initiaux donnent un GP imprécis, trop de points gaspillent le budget. Optuna gère cela automatiquement avec le paramètre n_startup_trials.

Peut-on utiliser la Bayesian Optimization pour autre chose que le tuning ?

Absolument. La BO est utilisée dans l’ingénierie des protéines (optimiser les séquences d’acides aminés), la chimie combinatoire (trouver de nouvelles molécules), la robotique (calibrer les paramètres de contrôle), la conception de matériaux, et même l’optimisation de recettes de cuisine. Tout problème d’optimisation où la fonction est coûteuse à évaluer et présumée continue est un bon candidat.

TPE ou processus gaussien ?

TPE (utilisé par défaut dans Optuna) est recommandé pour la plupart des cas pratiques : il gère bien les espaces de haute dimension (10-20 hyperparamètres), les hyperparamètres conditionnels, et les mélanges de variables continues et catégorielles. Le processus gaussien (via BoTorch) est préférable quand vous avez peu de dimensions (< 10), des évaluations très coûteuses, et que vous voulez une quantification d'incertitude rigoureuse.

Comment intégrer la Bayesian Optimization avec Hugging Face Trainer ?

Le Trainer de Hugging Face supporte Optuna nativement. Définissez une fonction hp_space qui retourne un dictionnaire d’hyperparamètres à tuner, puis appelez trainer.hyperparameter_search(n_trials=50, backend="optuna"). Le Trainer gère l’entraînement, l’évaluation et le reporting des métriques pour chaque essai. C’est la façon la plus simple de combiner BO et fine-tuning de LLM.

Polydesk.ai — Footer