Définitions de travail de la fonction ReLU et de sa dérivée:
ReLU(x)={0,x,if x<0,otherwise.
ddxReLU(x)={0,1,if x<0,otherwise.
La dérivée est la fonction de pas d' unité . Cela ignore un problème à x=0 , où le gradient n'est pas strictement défini, mais ce n'est pas une préoccupation pratique pour les réseaux de neurones. Avec la formule ci-dessus, la dérivée à 0 est 1, mais vous pouvez également la traiter comme 0 ou 0,5 sans impact réel sur les performances du réseau de neurones.
Réseau simplifié
Avec ces définitions, regardons vos exemples de réseaux.
Vous exécutez une régression avec la fonction de coût C=12(y−y^)2. Vous avez définiRcomme la sortie du neurone artificiel, mais vous n'avez pas défini de valeur d'entrée. J'ajouterai cela pour être complet - appelez-lez, ajoutez une indexation par couche, et je préfère les minuscules pour les vecteurs et les majuscules pour les matrices, doncr(1)sortie de la première couche,z(1)pour son entrée etW(0)pour le poids reliant le neurone à son entréex(dans un réseau plus grand, qui pourrait se connecter à unrplus profondrà la place). J'ai également ajusté le numéro d'index pour la matrice de poids - pourquoi cela deviendra plus clair pour le plus grand réseau. NB J'ignore avoir plus de neurones dans chaque couche pour l'instant.
En regardant votre simple couche 1, 1 réseau de neurones, les équations de rétroaction sont:
z(1)=W(0)x
y^=r(1)=ReLU(z(1))
La dérivée de la fonction de coût par rapport à un exemple d'estimation est:
∂C∂y^=∂C∂r(1)=∂∂r(1)12(y−r(1))2=12∂∂r(1)(y2−2yr(1)+(r(1))2)=r(1)−y
Utilisation de la règle de chaîne pour la propagation arrière à la valeur de pré-transformation ( z ):
∂C∂z(1)=∂C∂r(1)∂r(1)∂z(1)=(r(1)−y)Step(z(1))=(ReLU(z(1))−y)Step(z(1))
Ce ∂C∂z(1) est une étape intermédiaire et une partie critique du backprop reliant les étapes ensemble. Les dérivations sautent souvent cette partie car des combinaisons intelligentes de fonction de coût et de couche de sortie signifient qu'elle est simplifiée. Ici non.
Pour obtenir le gradient par rapport au poids W(0) , alors c'est une autre itération de la règle de chaîne:
∂C∂W(0)=∂C∂z(1)∂z(1)∂W(0)=(ReLU(z(1))−y)Step(z(1))x=(ReLU(W(0)x)−y)Step(W(0)x)x
. . . car z(1)=W(0)x donc ∂z(1)∂W(0)=x
C'est la solution complète pour votre réseau le plus simple.
Cependant, dans un réseau en couches, vous devez également appliquer la même logique à la couche suivante. De plus, vous avez généralement plus d'un neurone dans une couche.
Réseau ReLU plus général
Si nous ajoutons des termes plus génériques, nous pouvons travailler avec deux couches arbitraires. Appelez-les Layer (k) indexé par i , et Layer (k+1) indexé par j . Les poids sont maintenant une matrice. Donc, nos équations de rétroaction ressemblent à ceci:
z(k+1)j=∑∀iW(k)ijr(k)i
r(k+1)j=ReLU(z(k+1)j)
Dans la couche de sortie, le gradient initial wrt ro u t p u tj est encore ro u t p u tj- yj . Cependant, ignorez cela pour l'instant et regardez la façon générique de propager en arrière, en supposant que nous avons déjà trouvé ∂C∂r( k + 1 )j
Nous devons d'abord accéder à l'entrée des neurones avant d'appliquer ReLU:
- ∂C∂z( k + 1 )j= ∂C∂r( k + 1 )j∂r( k + 1 )j∂z( k + 1 )j= ∂C∂r( k + 1 )jSt e p ( z( k + 1 )j)
Nous devons également propager le gradient vers les couches précédentes, ce qui implique de résumer toutes les influences connectées à chaque neurone:
- ∂C∂r( k )je= ∑∀ j∂C∂z( k + 1 )j∂z( k + 1 )j∂r( k )je= ∑∀ j∂C∂z( k + 1 )jW( k )je j
Et nous devons le connecter à la matrice des poids afin de faire des ajustements plus tard:
- ∂C∂W( k )je j= ∂C∂z( k + 1 )j∂z( k + 1 )j∂W( k )je j= ∂C∂z( k + 1 )jr( k )je
St e p ( z( k + 1 )j)
Retour à vos questions:
Si cette dérivation est correcte, comment cela empêche-t-il de disparaître?
Votre dérivation n'était pas correcte. Cependant, cela ne répond pas complètement à vos préoccupations.
y( 1 - y)x = 0 , y= 0,5x = 0. Le gradient du ReLU est soit 0 soit 1, et dans un réseau sain sera 1 assez souvent pour avoir moins de perte de gradient pendant la rétropropagation. Ce n'est pas garanti, mais les expériences montrent que ReLU a de bonnes performances dans les réseaux profonds.
S'il y a des milliers de couches, il y aurait beaucoup de multiplication à cause des poids, alors cela ne causerait-il pas un gradient de fuite ou d'explosion?
Oui, cela peut aussi avoir un impact. Cela peut être un problème indépendamment du choix de la fonction de transfert. Dans certaines combinaisons, ReLU peut également aider à garder les gradients explosifs sous contrôle, car il ne sature pas (donc les normes de poids importantes auront tendance à être de mauvaises solutions directes et il est peu probable qu'un optimiseur se déplace vers elles). Cependant, cela n'est pas garanti.