Comme le déclare Paul, sans plus d'informations, il est difficile de donner des conseils sans hypothèses.
Avec 10 à 20 variables et des évaluations de fonctions coûteuses, la tendance est de recommander des algorithmes d'optimisation sans dérivé. Je vais être en profond désaccord avec les conseils de Paul: vous avez généralement besoin d'un gradient de précision machine à moins que vous n'utilisiez une sorte de méthode spéciale (par exemple, la descente de gradient stochastique dans l'apprentissage automatique exploitera la forme de l'objectif pour arriver à un résultat raisonnable). estimations de gradient).
Chaque étape quasi-Newton va prendre la forme:
H~( xk) dk= - ∇ f( xk) ,
où est une approximation de la matrice de Hesse, d k est la direction de recherche, x k est la valeur des variables de décision à l'itération actuelle, f est votre fonction objectif, et ∇ f est le gradient de votre objectif, et le les variables de décision sont mises à jour comme x k + 1 = x k + α k d k , où α kH~rékXkF∇ fXk + 1= xk+ αkrékαkest une taille de pas déterminée d'une certaine manière (comme une recherche de ligne). Vous pouvez vous éloigner de l'approximation de la Hesse de certaines manières et vos itérations convergeront, bien que si vous utilisez quelque chose comme des approximations de différences finies de la Hesse via des gradients exacts, vous pourriez souffrir de problèmes dus à un mauvais conditionnement. En règle générale, le Hessian est approximé en utilisant le gradient (par exemple, les méthodes de type BFGS avec des mises à jour de rang 1 pour le Hessian).
Rapprocher la Hesse et le gradient via des différences finies est une mauvaise idée pour plusieurs raisons:
- vous allez avoir une erreur dans le gradient, donc la méthode quasi-Newton que vous appliquez s'apparente à trouver la racine d'une fonction bruyante
- si les évaluations de fonctions sont coûteuses et que vous essayez d'évaluer un gradient par rapport à variables, cela vous coûtera N évaluations de fonctions par itérationNN
- si vous avez une erreur dans le gradient, vous allez avoir plus d'erreur dans votre Hesse, ce qui est un gros problème en termes de conditionnement du système linéaire
- ... et ça va vous coûter évaluations de fonction par itérationN2
Donc, pour obtenir une mauvaise itération de quasi-Newton, vous faites quelque chose comme jusqu'à 420 évaluations de fonctions à 30 minutes par évaluation, ce qui signifie que vous allez attendre un certain temps pour chaque itération, ou vous allez besoin d'un grand cluster juste pour les évaluations de fonctions. Les résolutions linéaires réelles seront de 20 x 20 matrices (au plus!), Il n'y a donc aucune raison de les paralléliser. Si vous pouvez obtenir des informations sur le gradient, par exemple, en résolvant un problème adjoint, alors cela pourrait être plus intéressant, auquel cas, cela pourrait valoir la peine de consulter un livre comme Nocedal & Wright.
Si vous allez faire beaucoup d'évaluations de fonctions en parallèle, vous devriez plutôt chercher des approches de modélisation de substitution ou générer des méthodes de recherche d'ensemble avant d'envisager des approches quasi-Newton. Les articles de la revue classique sont celui de Rios et Sahinidis sur les méthodes sans dérivés , qui a été publié en 2012 et fournit une comparaison très bonne et large; l'article d'analyse comparative de More et Wild de 2009; le manuel 2009 "Introduction to Derivative-Free Optimization" par Conn, Scheinberg et Vicente; et l' article de synthèse sur la génération de méthodes de recherche par Kolda, Lewis et Torczon de 2003.
Comme indiqué ci-dessus, le progiciel DAKOTA implémentera certaines de ces méthodes, tout comme NLOPT , qui implémente DIRECT, et quelques-unes des méthodes de modélisation de substitution de Powell. Vous pouvez également jeter un œil à MCS ; il est écrit en MATLAB, mais vous pouvez peut-être porter l'implémentation MATLAB dans la langue de votre choix. DAKOTA est essentiellement une collection de scripts que vous pouvez utiliser pour exécuter votre simulation coûteuse et collecter des données pour les algorithmes d'optimisation, et NLOPT a des interfaces dans un grand nombre de langages, donc le choix du langage de programmation ne devrait pas être un problème majeur dans l'utilisation de l'un ou l'autre des logiciels; Cependant, DAKOTA prend un certain temps à apprendre et a une énorme quantité de documentation à parcourir.