Vérification du gradient numérique: à quelle distance est assez proche?


8

J'ai fait un réseau neuronal convolutionnel et je voulais vérifier que mes gradients sont calculés correctement en utilisant la vérification numérique du gradient. La question est, à quelle distance est assez proche?

Ma fonction de vérification crache simplement la dérivée calculée, la dérivée approximée numériquement, la différence entre les deux, et si les deux valeurs ont le même signe (l'une étant positive et l'autre négative est un grand non-non) pour chacune poids.

La principale préoccupation que j'ai est que pour toutes les couches entièrement connectées et toutes les couches convolutives à l'exception de la première, les différences semblent similaires - les 9 à 13 premiers caractères des deux nombres correspondront. Cela semble assez bon, non? Mais pour les poids de la première couche convolutionnelle, je reçois parfois jusqu'à 12 décimales pour correspondre, mais cela peut aussi être aussi faible que 3. Est-ce suffisant, ou pourrait-il y avoir une erreur possible?

Une bonne chose à noter est que le signe des deux valeurs correspond toujours, ce qui est bon, donc le réseau fera toujours des mouvements dans la bonne direction, même si l'amplitude du mouvement est un peu décalée. Mais c'est la question ... y a-t-il une chance qu'il soit éteint?

Réponses:


9

Le plus proche que j'ai vu pour résoudre ce problème était dans le tutoriel Stanford UFLDL dans la section de régression softmax . Copie de l'énoncé clé:

La norme de la différence entre le gradient numérique et votre gradient analytique doit être petite, de l'ordre de 109.

En python, le code ressemblerait à ceci:

norm(gradients - numericalGradients)/norm(gradients + numericalGradients)

gradientsêtes-vous les résultats de la dérivée et numericalGradientssont les gradients approximatifs.


Merci, que se passe-t-il si mes dégradés sont stockés dans une matrice matricielle 2D? Après avoir soustrait 2 matrices l'une de l'autre, comment dois-je évaluer la norme de la matrice de "différence" résultante?
Kari

1
@Kari Je les aplatirais en vecteurs et utiliserais le même code montré ci-dessus. Par exemple, si vous avez un tableau numpy, vous pouvez simplement utiliser la flattenméthode.
cdeterman

7

Théorie de base utile

Un petit fait que vous pouvez utiliser pour comprendre si une dérivée numérique est correctement calculée ou non est le reste de Cauchy de l'expansion de Taylor. C'est,

f(x+h)=f(x)+hf(x)+h22f(ξ)pour certainsξ[x,x+h]

Ceci est utile, car vous avez probablement approximé votre première dérivée en

f(x)f(x+h)f(xh)2h

avec quelques petits (j'utilise généralement , mais je suis sûr qu'un jour je vais rencontrer un cas où ce n'est pas approprié).h104

Après un peu d'algèbre, nous pouvons utiliser le reste de Cauchy pour voir que notre approximation numérique devrait théoriquement être dans de .hf(ξ),ξ[xh,x+h]f(x)

En fait, vous pouvez réellement le délimiter par , où et ... ce qui équivaut à , .h(f(ξ1)f(ξ2))ξ1[xh,x]ξ2[x,x+h]h2f(ξ)ξ[xh,x+h]

Problèmes dans la pratique

D'accord, nous avons une belle théorie qui limite l'erreur de la dérivée numérique. Mais il y a deux trous à essayer directement d'utiliser ces résultats:

1.) Nous ne savons pas (et nous ne voulons probablement pas passer le temps à l'approcher)f(x)

2.) comme , souffre d'instabilité numériqueh0f(x+h)f(xh)2h

Donc, en utilisant ce que nous savons de la façon dont je vérifie mes dérivés analytiques (ce qui n'est peut-être pas le meilleur moyen), j'écris la fonction dérivée numérique en fonction de . Si je ne peux pas dire si la différence entre les dérivés numériques et analytiques est due à une erreur de codage ou simplement à une approximation numérique, je peux réduire et voir si ma dérivée numérique s'approche de ma dérivée analytique avant de souffrir d'instabilité numérique (lorsque cela se produit, vos approximations numériques deviendront moins cohérentes à mesure que diminue). Notez que le terme devrait disparaître de façon quadratique, donc si mon erreur est d'environ avechhhf(ξ)0.01h=104 , il devrait être d'environ avec supposant que l'instabilité numérique ne s'est pas encore déclenchée .0.0001h=105

Malheureusement, il n'y a pas de ligne directrice stricte et rapide pour toujours déterminer ces choses; cela dépend beaucoup de la stabilité de la fonction (et je veux dire à la fois en termes de stabilité numérique et de dérivés supérieurs). Mais dans mes expériences, je n'ai jamais vu un cas où l'erreur de n'allait pas définitivement à 0 (c'est-à-dire que l'utilisation de donnait pratiquement la même réponse que ) au moment où l'instabilité numérique de déclenchée.h2f(ξ)h=104h=105h0


5

Veuillez vous référer à ce tutoriel http://cs231n.github.io/neural-networks-3/#ensemble . La section "Gradient Check" est très détaillée et utile.

Comme le suggère Gung, j'inclus les principaux points de ce lien:

  • Utilisez approximation, où .f(w+h)f(wh)2hh105

  • Surveillez la fraction de , où est le gradient analytique et est le gradient approximativement numérique. Habituellement, la plage préférée de cette fraction doit être .|fa(w)fn(w)|max(|fa(w)|,|fn(w)|)fa(w)fn(w)<102

  • Utilisez la double précision au lieu du flottant.

  • Esprit de kink (s) dans les fonctions d'activation, par exemple, lorsque l'on utilise ReLU. Lorsqu'il y a un ou des plis, il faut surveiller les valeurs de et . Si ces deux valeurs sont sur les deux côtés d'un pli, il faut exclure cette vérification de gradient.x=0xhx+h

  • Utilisez quelques points de données.

  • Ne faites pas de vérification de gradient au tout début du processus de formation.

  • Vérifiez d'abord le modèle sans régularisation puis avec lui.

  • Désactivez le décrochage et le décrochage inversé lors de la vérification du dégradé.

  • Cochez seulement au hasard quelques dimensions.

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.