2012-02-06 4 views
4

J'ai implémenté à la fois la descente par lots et la descente de gradient stochastique. Je rencontre quelques problèmes cependant. Telle est la règle stochastique:Mise en œuvre de la descente de gradient

1 to m { 
theta(j):=theta(j)-step*derivative (for all j) 
} 

La question que j'ai est que, même si la fonction de coût est de plus en plus petit et plus le test dit que ce n'est pas bon. Si je change un peu l'étape et change le nombre d'itérations, la fonction de coût est un peu plus grande en valeur mais les résultats sont corrects. Est-ce un «symptôme» de suralimentation? Comment savoir lequel est le bon? :)

Comme je l'ai dit, même si la fonction de coût est plus réduite, le test indique que ce n'est pas bon.

+0

Que signifie "pas bon"? –

+0

@ MichaelJ.Barber Par exemple, la valeur attendue est de 0,35 et je reçois 0,65. C'est une différence. Cependant, avec un nombre différent d'étapes et d'itérations, je peux obtenir 0,35. La question est, comment puis-je savoir à plus grande échelle quand j'obtiens les bons paramètres? – Andrew

+0

@ MichaelJ.Barber et même si la valeur de la fonction de coût est plus petite, la valeur de test est très éloignée de la bonne, tandis que la fonction de coût un peu plus élevé fournit la bonne valeur pour l'exemple de test. – Andrew

Répondre

17

La descente de gradient est une méthode de recherche locale pour minimiser une fonction. Quand il atteint un minimum local dans l'espace des paramètres, il ne pourra pas aller plus loin. Cela rend la descente de gradient (et d'autres méthodes locales) susceptible de rester coincée dans les minima locaux, plutôt que d'atteindre le minimum global. Les minima locaux peuvent ou non être de bonnes solutions pour ce que vous essayez d'accomplir. À quoi s'attendre dépendra de la fonction que vous essayez de minimiser.

En particulier, les problèmes NP-complets de haute dimension peuvent être difficiles. Ils ont souvent de façon exponentielle de nombreux optima locaux, dont beaucoup sont presque aussi bons que l'optimum global en termes de coût, mais avec des valeurs de paramètres orthogonales à celles de l'optimum global. Ce sont des problèmes durs: vous ne vous attendez généralement pas à trouver l'optimum global, mais plutôt à chercher un minimum local qui soit assez bon. Ce sont également problèmes pertinents: de nombreux problèmes intéressants ont juste ces propriétés.

Je suggérerais d'abord tester votre mise en œuvre de descente de gradient avec un problème facile. Vous pourriez essayer de trouver le minimum dans un polynôme. Comme c'est un problème à un paramètre, vous pouvez tracer la progression des valeurs des paramètres le long de la courbe du polynôme. Vous devriez être en mesure de voir si quelque chose est radicalement faux, et peut également observer comment la recherche se coince dans les minima locaux. Vous devriez également être en mesure de voir que le choix initial des paramètres peut être très important.

Pour traiter des problèmes plus difficiles, vous pouvez modifier votre algorithme pour l'aider à échapper aux minimums locaux. Quelques approches courantes:

  • Ajouter du bruit. Cela réduit la précision des paramètres que vous avez trouvés, ce qui peut "brouiller" les minima locaux. La recherche peut alors sauter hors des minima locaux qui sont petits par rapport au bruit, tout en restant piégés dans des minima plus profonds. Une approche bien connue pour ajouter du bruit est simulated annealing.

  • Ajouter un moment.En plus d'utiliser le dégradé actuel pour définir l'étape, continuez également dans la même direction que l'étape précédente. Si vous prenez une fraction de l'étape précédente comme terme d'impulsion, vous avez tendance à continuer, ce qui peut faire passer la recherche au-delà du minimum local. En utilisant une fraction, les étapes décroissent de façon exponentielle, de sorte que les étapes médiocres ne sont pas un gros problème. C'était toujours une modification populaire à la descente de gradient quand elle était utilisée pour former des réseaux de neurones, où la descente de gradient est connue comme rétropropagation.

  • Utilisez une recherche hybride. Utilisez d'abord une recherche globale (par exemple, des algorithmes génétiques, diverses méthodes de Monte Carlo) pour trouver de bons points de départ, puis appliquez une descente de gradient pour tirer parti des informations de gradient dans la fonction.

Je ne vais pas faire une recommandation sur lequel utiliser. Au lieu de cela, je suggère de faire un peu de recherche pour voir ce que les autres ont fait avec des problèmes liés à ce que vous travaillez. Si c'est purement une expérience d'apprentissage, l'élan est probablement le plus facile à travailler.

+0

pourriez-vous recommander une lecture sur l'hybridation GA avec descente en gradient – Alex

0

Il y a beaucoup de choses qui pourraient se passer:

  • votre step pourrait être un mauvais choix
  • votre dérivé peut être désactivé
  • votre « valeur attendue » pourrait être confondu avec
  • votre descente de gradient pourrait simplement être lent à converger

Je voudrais essayer d'augmenter le long terme th, et l'intrigue fonctionne avec une variété de valeurs d'étape. Un pas plus petit aura une meilleure chance d'éviter les problèmes de, euh, les étapes qui sont trop grandes.

+0

Si le problème vient du fait de rester coincé dans les minima locaux, une taille de pas * plus grande * pourrait en fait être le meilleur choix. Il va falloir expérimenter. –

+0

Bon, je n'avais même pas envisagé de rester coincé dans un minimum local. Mais si c'est le problème, il est probablement préférable de faire autre chose que la descente de gradient en premier lieu. – comingstorm

+0

Trop gros, je dirais. Les méthodes basées sur les dégradés ont souvent été utilisées avec succès - les dégradés ont un * lot * d'informations. Les problèmes difficiles sont difficiles, nous devrions donc essayer différentes méthodes. Ce n'est pas comme si nous trouvions l'optimum global dans la plupart des cas, quelle que soit la méthode utilisée. –

Questions connexes