En fait, je voulais vous demander comment puis-je définir la condition de fin pour la descente en gradient.
Puis-je l'arrêter en fonction du nombre d'itérations, c'est-à-dire en tenant compte des valeurs des paramètres pour, disons, 100 itérations?
Ou dois-je attendre de telle sorte que les différentes valeurs des deux paramètres «nouveau» et «ancien» soient très petites de l'ordre de disons ? Cela prendra certainement beaucoup de temps.
Quel est le meilleur moyen? Dans mon cas, une seule itération prend beaucoup de temps. Dans cette situation, si j'attends la deuxième condition, cela peut même prendre des semaines, je suppose.
Alors quelle approche dois-je utiliser. Comment faire face à ce scénario?
algorithms
optimization
gradient-descent
user31820
la source
la source
ftolabs
ftolrel
xtolabs
Réponses:
Bonne question. J'ai vu beaucoup de règles d'arrêt dans la littérature, et il y a des avantages et des inconvénients pour chacun, selon le contexte. La
optim
fonction dans R, par exemple, a au moins trois règles d'arrêt différentes:maxit
, c'est-à-dire un nombre maximum prédéterminé d'itérations. Une autre alternative similaire que j'ai vue dans la littérature est un nombre maximum de secondes avant expiration. Si tout ce dont vous avez besoin est une solution approximative, cela peut être très raisonnable. En fait, il existe des classes de modèles (en particulier les modèles linéaires) pour lesquels un arrêt précoce est similaire à la mise en priorité gaussienne de vos valeurs de paramètres. Un habitué dirait que vous avez une "norme L2" plutôt qu'un précédent, mais il pense aussi que c'est une chose raisonnable à faire. J'ai seulement survolé ce document , mais il parle de la relation entre l'arrêt précoce et la régularisation et pourrait vous aider à vous orienter vers plus d'informations. Mais la version courte est, oui, un arrêt précoce peut être une chose parfaitement respectable, selon ce que vous ''abstol
, c'est-à-dire s'arrêter lorsque la fonction est "assez proche" de zéro. Cela peut ne pas être pertinent pour vous (il ne semble pas que vous vous attendiez à un zéro), donc je vais le sauter.reltol
, ce qui est comme votre deuxième suggestion - arrêtez-vous lorsque l'amélioration descend en dessous d'un seuil. Je ne sais pas vraiment combien il y a de théorie à ce sujet, mais vous aurez probablement tendance à obtenir des minima inférieurs de cette façon qu'avec un petit nombre maximum d'itérations. Si cela est important pour vous, il peut être utile d'exécuter le code pour plus d'itérations.Une autre famille de règles d'arrêt concerne l'optimisation d'une fonction de coût sur un ensemble de données de validation (ou avec validation croisée) plutôt que sur les données de formation. Selon l'utilisation que vous souhaitez faire de votre modèle, vous souhaiterez peut-être vous arrêter bien avant d'atteindre le minimum local sur vos données d'entraînement, car cela pourrait impliquer un surapprentissage. Je suis à peu près sûr que Trevor Hastie a écrit sur les bonnes façons de le faire, mais je ne me souviens pas de la citation.
D'autres options possibles pour trouver des minima inférieurs dans un délai raisonnable pourraient inclure:
Descente de gradient stochastique, qui ne nécessite d'estimer les gradients que pour une petite partie de vos données à la fois (par exemple, un point de données pour le SGD "pur" ou de petits mini-lots).
Fonctions d'optimisation plus avancées (par exemple, méthodes de type Newton ou gradient conjugué), qui utilisent des informations sur la courbure de votre fonction objectif pour vous aider à pointer dans de meilleures directions et à prendre de meilleures tailles de pas lorsque vous descendez.
Un terme "dynamique" dans votre règle de mise à jour, pour que votre optimiseur fasse un meilleur travail de descente plutôt que de délimiter les parois du canyon dans votre fonction d'objectif.
Ces approches sont toutes discutées dans ces notes de cours que j'ai trouvées en ligne.
J'espère que cela t'aides!
Modifiez oh, et vous pouvez également essayer d'obtenir de meilleures valeurs de départ (par exemple en résolvant une version plus simple du problème) de sorte qu'il faut moins d'itérations pour se rapprocher de l'optimum à partir de votre "démarrage à chaud".
la source
reltol
(c'est-à-dire quand il n'y a plus "d'amélioration"). La première amélioration signifie une diminution de la fonction de coût. Je suppose donc que vous voulez dire que lorsque la fonction de coût cesse de diminuer suffisamment (ou commence à augmenter), on s'arrête, non? On ne fait pas vraiment "| ancien - nouveau |" type de règle de mise à jour, non?abstol
paramètre n'a de sens que si vous prenez la tolérance du gradient de la fonction de coût, pas la fonction de coût elle-même. Dans un optimiseur local, la valeur du gradient est nulle; mais pas la valeur de la fonction.