Permettez-moi de peser ici avec quelques mots de prudence, précédés d'une histoire. Il y a longtemps, je travaillais avec un gars quand je débutais. Il avait un problème d'optimisation à résoudre, avec un objectif plutôt salissant. Sa solution a été de générer les dérivés analytiques pour une optimisation.
Le problème que j'ai vu était que ces dérivés étaient désagréables. Générés à l'aide de Macsyma, convertis en code fortran, ils comportaient chacun des dizaines d'instructions de continuation. En fait, le compilateur Fortran s'est énervé car il dépassait le nombre maximal d'instructions de continuation. Alors que nous avons trouvé un drapeau qui nous a permis de contourner ce problème, il y avait d'autres problèmes.
Dans les expressions longues, comme celles généralement générées par les systèmes CA, il existe un risque d'annulation massive soustractive. Calculez beaucoup de grands nombres, seulement pour découvrir qu'ils s'annulent tous pour donner un petit nombre.
Souvent, les dérivés générés analytiquement sont en fait plus coûteux à évaluer que les dérivés générés numériquement utilisant des différences finies. Un gradient pour n variables peut prendre plus de n fois le coût de l'évaluation de votre fonction objectif. (Vous pourrez peut-être gagner du temps, car de nombreux termes peuvent être réutilisés dans les divers dérivés, mais cela vous obligera également à effectuer un codage manuel minutieux, au lieu d'utiliser des expressions générées par ordinateur. Et chaque fois que vous codez de mauvaises mathématiques expressions, la probabilité d'une erreur n'est pas anodine. Assurez-vous de vérifier l'exactitude de ces dérivés.)
Le point de mon histoire est que ces expressions générées par CA ont leurs propres problèmes. Le plus drôle, c'est que mon collègue était en fait fier de la complexité du problème, qu'il résolvait clairement un problème vraiment difficile parce que l'algèbre était si méchante. Ce que je ne pense pas qu'il ait considéré, c'est si cette algèbre calculait réellement la bonne chose, si elle le faisait avec précision et si elle le faisait efficacement.
Si j'avais été la personne âgée à l'époque sur ce projet, je lui aurais lu l'acte anti-émeute. Sa fierté l'a amené à utiliser une solution qui était probablement inutilement complexe, sans même vérifier qu'un gradient basé sur les différences finies était adéquat. Je parie que nous avions peut-être passé une semaine-homme pour lancer cette optimisation. À tout le moins, je lui aurais conseillé de tester soigneusement le gradient produit. Était-ce exact? Quelle était sa précision par rapport aux dérivés à différences finies? En fait, il existe aujourd'hui des outils qui renverront également une estimation de l'erreur dans leur prédiction dérivée. C'est certainement vrai pour le code de différenciation adaptative (dérivé) que j'ai écrit dans MATLAB.
Testez le code. Vérifiez les dérivés.
Mais avant de faire TOUT cela, demandez-vous si d'autres, de meilleurs schémas d'optimisation sont une option. Par exemple, si vous faites un ajustement exponentiel, il y a de très bonnes chances que vous puissiez utiliser des moindres carrés non linéaires partitionnés (parfois appelés moindres carrés séparables. Je pense que c'était le terme utilisé par Seber et Wild dans leur livre.) L'idée consiste à décomposer l'ensemble des paramètres en ensembles intrinsèquement linéaires et intrinsèquement non linéaires. Utilisez une optimisation qui fonctionne uniquement sur les paramètres non linéaires. Étant donné que ces paramètres sont "connus", les paramètres intrinsèquement linéaires peuvent être estimés à l'aide de moindres carrés linéaires simples. Ce schéma réduira l'espace des paramètres dans l'optimisation. Cela rend le problème plus robuste, car vous n'avez pas besoin de trouver les valeurs de départ pour les paramètres linéaires. Il réduit la dimensionnalité de votre espace de recherche, ce qui accélère le problème. Encore une fois, j'ai fourniun outil à cet effet , mais uniquement dans MATLAB.
Si vous utilisez les dérivés analytiques, codez-les pour réutiliser les termes. Cela peut être un gain de temps considérable et peut en fait réduire les bugs, ce qui vous fait gagner du temps. Mais alors vérifiez ces chiffres!
codegen
paquet qu'il contient car il peut générer automatiquement du code C ou Fortran compact et efficace pour chacune ou l'ensemble des expressions.