Trouver un minimum global d'une fonction 2D lisse, bornée et non convexe dont l'évaluation est coûteuse


17

J'ai une fonction 2D non convexe bornée dont j'aimerais trouver le minimum. La fonction est assez fluide. L'évaluer coûte cher. Une erreur acceptable est d'environ 3% du domaine de la fonction dans chaque axe.

J'ai essayé d'exécuter l'implémentation de l'algorithme DIRECT dans la bibliothèque NLOPT, mais cela n'a pas donné une amélioration considérable par rapport à la recherche par force brute en termes de quantité d'évaluations de fonctions nécessaires pour la précision requise et il y avait des valeurs aberrantes.

Quels autres solveurs d'optimisation globale dois-je considérer?


Pouvez-vous calculer des gradients, ou auriez-vous besoin de les approximer par des quotients de différence?
Arnold Neumaier

J'ai besoin de les approximer par des quotients de différence.
Victor May

Dans ce cas, la méthode de Newton ne peut pas être recommandée, car les dérivées secondes numériques sont numériquement très instables et difficiles à régler pour fonctionner en toute sécurité.
Arnold Neumaier

@Victor May, avec quoi vous êtes-vous retrouvé? (Si vous pouviez poster une fonction similaire à la vôtre, cela aiderait vraiment les gens à comparer et à régler différents algorithmes.)
denis

@Denis, j'essayais d'obtenir plus de vitesse d'un algorithme pour suivre un objet en vidéo. La sortie de l'algorithme était une estimation de probabilité pour que chaque emplacement d'image contienne l'objet suivi. L'image contenant ces estimations de vraisemblance est la fonction que j'essayais d'optimiser. Je me suis retrouvé avec le forçage brutal à plusieurs étapes de résolution. Pour plus d'informations sur l'algorithme de suivi en question, lisez l'article "Suivi basé sur des fragments robustes à l'aide de l'histogramme intégré".
Victor May

Réponses:


12

Je voudrais suggérer une approche quelque peu différente par rapport aux autres réponses, bien que @barron ait indirectement discuté de la même chose.

Au lieu d'optimiser directement votre fonction, c'est-à-dire en l'évaluant en une série de points points qui (espérons-le) convergent vers un optimum (local), vous pouvez utiliser le concept de modélisation de substitution , qui est très bien adapté aux problèmes du type que vous décrivez (coût élevé, lisse, borné, de faible dimension, c'est-à-dire moins de 20 inconnues).x1,x2,,xksurrogate modelling

Plus précisément, la modélisation de substitution fonctionne par la mise en place d' une fonction de modèle de votre véritable fonction f R dR . La clé est que bien que c ne représente pas parfaitement f , il est beaucoup moins cher à évaluer.cRRFRRcF

Ainsi, un processus d'optimisation typique serait le suivant:

  1. Évaluez à un ensemble de j points initiaux x 1 , x 2 , , x j . Notez que les dérivés ne sont pas nécessaires. Notez également que ces points doivent être répartis uniformément dans tout l'espace de recherche, par exemple par Latin Hypercube Sampling ou une conception similaire remplissant l'espace.FjX1,X2,,Xj
  2. Sur la base de cet ensemble de données d'origine, créez une fonction de modèle . Vous pouvez utiliser la validation croisée pour valider votre modèle (c'est-à-dire utiliser uniquement un sous-ensemble des j points d' origine pour créer c , puis utiliser le reste de l'ensemble de données pour vérifier dans quelle mesure c prédit ces valeurs)cjcc
  3. Utilisez un critère tel que le critère d'amélioration attendue (IE) pour savoir où «remplir» plus d'échantillons pour rendre plus précis en échantillonnant f . Ceci est en réalité bien mieux étudié théoriquement qu'il n'y paraît, et le critère EI est très bien étudié. Le critère EI n'est pas non plus un critère gourmand, donc vous obtenez tous les deux une bonne amélioration globale de la précision du modèle, tout en priorisant la précision près des optima potentiels.cF
  4. Si votre modèle n'est pas assez précis, répétez l'étape 3, sinon utilisez votre routine d'optimisation préférée pour trouver l'optimum de , qui sera très bon marché à évaluer (vous pouvez donc utiliser n'importe quelle routine que vous voulez, même celles qui nécessitent des dérivés, ou tout simplement évaluer la fonction dans un maillage fin).c

En général, c'est ce que l'on entend par EGO, Efficient Global Optimization, comme l'a suggéré @barron. Je voudrais souligner que pour votre application, cela semble parfaitement adapté - vous obtenez un modèle étonnamment précis basé sur relativement peu d'évaluations de , et pouvez ensuite utiliser n'importe quel algorithme d'optimisation que vous souhaitez. Ce qui est souvent aussi intéressant, c'est que vous pouvez maintenant évaluer c sur un maillage et le tracer, ce qui permet de mieux comprendre l'apparence générale de f . Un autre point intéressant est que la plupart des techniques de modélisation de substitution fournissent également des estimations d'erreur statistique, permettant ainsi une estimation de l'incertitude.FcF

Comment construire est bien sûr une question ouverte, mais souvent des modèles de krigeage ou dits de cartographie spatiale sont utilisés.c

Bien sûr, c'est tout un travail de codage, mais beaucoup d'autres personnes ont fait de très bonnes implémentations. Dans Matlab, je ne connais que la boîte à outils du logiciel DACE DACE est gratuit. TOMLAB pourrait également offrir un package Matlab, mais coûte de l'argent - cependant, je pense qu'il fonctionne également en C ++ et a beaucoup plus de capacités que DACE n'en aura jamais. (Remarque: je suis l'un des développeurs de la nouvelle version de DACE, qui sortira bientôt et qui offrira un support supplémentaire pour EGO.)

J'espère que cette vue d'ensemble vous a aidé, veuillez poser des questions s'il y a des points qui peuvent être clarifiés ou des choses que j'ai manquées, ou si vous souhaitez plus d'informations sur le sujet.


Fwiw, google surrogate-model fait apparaître un laboratoire de modélisation de substitution à l'Université de Gand et un livre Engineering Design via Surrogate Modeling , 2008 228p 0470770791. Un problème avec toute approche très générale est que vous avez bientôt un évier de cuisine rempli de variantes de méthode, plus que de véritables fonctions de test.
denis


3

Pour une fonction fluide, la méthode d'optimisation globale efficace devrait fonctionner assez bien et être considérablement plus efficace que DIRECT. Les implémentations sont disponibles dans TOMLAB (je ne l'ai pas utilisé moi-même) et DAKOTA (avec lesquelles j'ai eu un certain succès).


1

Puisque la fonction est fluide, la méthode de Newton sera la méthode la plus efficace pour trouver un minimum. Puisque la fonction n'est pas convexe, vous devrez appliquer les astuces habituelles pour faire converger la méthode de Newton (modification de Levenberg-Marquardt, recherche de ligne ou région de confiance à globaliser). Si vous ne pouvez pas obtenir de dérivés de votre fonction, essayez de la calculer via des différences finies ou en utilisant une mise à jour BFGS. Si vous soupçonnez que le problème a plus d'un minimum local, on pourrait simplement démarrer la méthode de Newton à partir d'un tas de points choisis au hasard ou pas si au hasard et voir où ils convergent.


Mon problème a en effet des minima locaux. Quelles méthodes existe-t-il pour choisir les points de départ?
Victor May

1
À moins que vous ne sachiez quoi que ce soit du problème, l'échantillonnage statistique est essentiellement votre seul choix.
Wolfgang Bangerth

@Wolfgang: Des idées sur la façon d'aborder "l'échantillonnage statistique"? Essayez simplement 10, 100, ... suppositions initiales aléatoires? Existe-t-il des approches "plus rigoureuses"? Je demande, car j'ai plus ou moins un problème similaire (voir scicomp.stackexchange.com/q/4708/1789 )
André

Tout dépend de ce que vous savez sur la fonction. Si vous connaissez quelque chose comme une "échelle de longueur typique" pour votre fonction, cela donnerait une indication de la distance entre les extrema locaux. Cela vous donnera également une indication du nombre de points que vous devrez peut-être commencer et de la distance à laquelle ils devraient être choisis les uns des autres.
Wolfgang Bangerth

0

Étant donné que vos évaluations sont coûteuses, vous devez tirer parti de plusieurs évaluations de fonctions en parallèle.

Je vous recommande de jeter un œil à ce code . Les mathématiques derrière sont décrites ici .


1
ce code et cet article sont-ils écrits par vous? Si oui, pouvez-vous le dire explicitement dans votre réponse? De plus, en ce moment, vous pouvez améliorer la réponse en fournissant une description de votre suggestion.
nicoguaro
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.