Question

Je vais avoir quelques difficultés à tirer la propagation de retour avec Relu, et je l'ai un peu de travail, mais je ne sais pas si je suis sur la bonne voie.

Coût Fonction: $ \ frac {1} {2} (y- \ hat y) ^ 2 $ où $ y $ est la valeur réelle, et est une valeur prédite $ y $ \ hat. Supposons également que $ x $> 0 toujours.


1 couche Relu, où le poids à la 1ère couche est $ W_1 $

 entrer image description ici

$ \ frac {} {dC dw_1} = \ frac {} {dC dR} \ frac {} {dR dw_1} $

$ \ frac {} {dC W_1} = (y Relu (w_1x)) (x) $


2 couche Relu, où les poids à la 1ère couche est w_2 $ $, et la 2ème couche est $ W_1 $ et je voulais à jour la 1ère couche $ w_2 $

 entrer image description ici

$ \ frac {} {dC dw_2} = \ frac {} {dC dR} \ frac {} {dR dw_2} $

$ \ frac {} {dC w_2} = (y Relu (W_1 * Relu (w_2x)) (w_1x) $

Depuis $ Relu (W_1 * Relu (w_2x)) = w_1w_2x $


3 couche Relu, où les poids à la 1ère couche est w_3 $ $, 2e couche $ w_2 $ et 3 $ W_1 couche $

 entrer image description ici

$ \ frac {} {dC dw_3} = \ frac {} {dC dR} \ frac {} {dR dw_3} $

$ \ frac {} {dC w_3} = (y Relu (W_1 * Relu (w_2 (* Relu (w_3))) (w_1w_2x) $

Depuis Relu $ (* W_1 Relu (de w_2 (* Relu (w_3)) = w_1w_2w_3x $

Étant donné que la règle de la chaîne ne dure que 2 dérivés, par rapport à un sigmoïde, qui pourrait être aussi longtemps que $ n $ nombre de couches.


Dites que je voulais à jour tous les 3 poids de la couche, où $ W_1 $ est la 3ème couche, $ w_2 $ est la 2ème couche, $ W_1 $ est la 3ème couche

$ \ frac {} {dC W_1} = (y Relu (w_1x)) (x) $

$ \ frac {} {dC w_2} = (y Relu (W_1 * Relu (w_2x)) (w_1x) $

$ \ frac {} {dC w_3} = (y Relu (W_1 * Relu (w_2 (* Relu (w_3))) (w_1w_2x) $

Si cette dérivation est correcte, comment cela empêche de disparaître? Par rapport à sigmoïde, où nous avons beaucoup de multiplier par 0,25 dans l'équation, alors que Relu n'a pas de multiplication de valeur constante. S'il y a des milliers de couches, il y aurait beaucoup de multiplication en raison de poids, alors ne serait pas cette cause gradient de fuite ou d'explosion?

Était-ce utile?

La solution

définitions de travail de la fonction RELU et son dérivé:

Relu $ (x) = \ begin {cas} 0, & \ texte {if} x <0, \\ x, & \ texte {} sinon. \ End {cas} $

$ \ frac {d} {dx} Relu (x) = \ begin {cas} 0, & \ texte {if} x <0, \\ 1, & \ texte {} sinon. \ End {cas} $

Le dérivé est l'unité de href="https://en.wikipedia.org/wiki/Step_function". Cela n'ignorer un problème à $ x = 0 $ , où le gradient est pas strictement défini, mais qui ne sont pas une préoccupation pratique pour les réseaux de neurones. Avec la formule ci-dessus, le dérivé à 0 est égal à 1, mais on peut également traiter comme 0, ou 0,5 sans impact réel pour les performances du réseau de neurones.


réseau simplifié

Avec ces définitions, nous allons jeter un oeil à vos réseaux par exemple.

Vous exécutez la régression avec la fonction de coût $ C = \ frac {1} {2} (y- \ hat {y}) ^ 2 $ . Vous avez défini $ R $ comme la sortie du neurone artificiel, mais vous n'avez pas défini une valeur d'entrée. Je vais ajouter que pour être complet - appeler $ z $ , ajoutez une indexation par couche, et je préfère minuscules pour les vecteurs et les majuscules pour les matrices, donc $ r ^ {(1)} $ sortie de la première couche, $ z ^ {(1)} $ pour son entrée et $ W ^ {(0)} $ pour le poids de liaison du neurone à son entrée $ x $ (dans un réseau plus large, qui pourrait se connecter à une plus profonde $ r $ valeur à la place). J'ai également ajusté le numéro d'index pour la matrice de poids - pourquoi est deviendra plus clair pour le plus grand réseau. NB Je suis ignorant d'avoir plus de neurones dans chaque couche pour l'instant.

En regardant votre simple 1 couche, 1 réseau de neurones, les équations d'alimentation vers l'avant sont:

$ z ^ {(1)} = {W ^ (0)} x $

$ \ hat {y} = r ^ {(1)} = RELU (z ^ {(1)}) $

La dérivée de la fonction de coût w.r.t. une estimation de l'exemple est la suivante:

$ \ frac {\ partial C} {\ partial \ hat {y}} = \ frac {\ partial C} {\ partial r ^ {(1)}} = \ frac {\ partial} {\ partial r ^ {(1)}} \ frac {1} {2} (yr ^ {(1)}) ^ 2 = \ frac {1} {2} \ frac {\ partial } {\ partial r ^ {(1)}} (y ??^ 2 - 2yr ^ {(1)} + (r ^ {(1)}) ^ 2) = r ^ {(1)} - y $

Utilisation de la règle de la chaîne de propagation de retour à la pré-transformation ( $ z $ ) Valeur:

$ \ frac {\ partial C} {\ partial z ^ {(1)}} = \ frac {\ partial C} {\ r partielle ^ {(1)} } \ frac {\ r partielle ^ {(1)}} {\ z partielle ^ {(1)}} = (r ^ {(1)} - y) L'étape (z ^ {(1)}) = (RELU (z ^ {(1)}) - y) L'étape (z ^ {(1)}) $

$ \ frac {\ C partielle} {\ z partielle ^ {(1)}} $ est une étape intermédiaire et une partie critique de mesures de liaison de backprop ensemble . Dérivations souvent sauter cette partie parce que des combinaisons intelligentes de fonction de coût et de la couche de sortie signifie qu'il est simplifié. Ici, ce n'est pas.

Pour obtenir le gradient par rapport au poids $ W ^ {(0)} $ , alors il est une autre itération de la règle de la chaîne:

$ \ frac {\ partial C} {\ partial W ^ {(0)}} = \ frac {\ partial C} {\ z partielle ^ {(1)} } \ frac {\ z partielle ^ {(1)}} {\ W partielle ^ {(0)}} = (RELU (z ^ {(1)}) - y) L'étape (z ^ {(1)}) x = (RELU (W ^ {(0)} x) - y) Etape (W ^ {(0)} x) x $

. . . car $ z ^ {(1)} = W ^ {(0)} x $ donc $ \ frac {\ partial z ^ {(1)}} {\ W ^ {partielle (0)}} = x $

C'est la solution complète pour votre réseau plus simple.

Cependant, dans un réseau en couches, vous devez également porter la même logique jusqu'à la couche suivante. En outre, vous avez généralement plusd'un neurone dans une couche.


Réseau Relu Plus générale

Si l'on ajoute en des termes plus génériques, alors nous pouvons travailler avec deux couches arbitraires. Appelez-les couche $ (k) $ indexé par $ i $ , et la couche $ (k + 1) $ indexé par $ j $ . Les poids sont maintenant une matrice. Ainsi, nos équations feed-forward ressemblent à ceci:

$ z ^ {(k + 1)} _ j = \ sum _ {\ forall i} W ^ {(k)} _ {ij} r ^ {(k)} _Je $

$ r ^ {(k + 1)} _ j = RELU (z ^ {(k + 1)} _ j) $

Dans la couche de sortie, le gradient initial w.r.t. $ r ^ {sortie} _j $ est toujours $ r ^ {sortie} _j - y_j $ . Cependant, ne pas tenir compte que pour l'instant, et regarder les générique chemin de retour Propager, en supposant que nous avons déjà trouvé $ \ frac {\ partial C} {\ partial r ^ {(k + 1)} _ j} $ - il suffit de noter que c'est en fin de compte où nous obtenons les gradients de fonction des coûts de sortie de. Ensuite, il y a 3 équations, on peut écrire à la suite de la règle de la chaîne:

Il faut d'abord se rendre à l'entrée des neurones avant d'appliquer Relu:

  1. $ \ frac {\ partial C} {\ z partielle ^ {(k + 1)} _ j} = \ frac {\ C partielle} {\ partial r ^ {( k + 1)} _ j} \ frac {\ r partielle ^ {(k + 1)} _ j} {\ z partielle ^ {(k + 1)} _ j} = \ frac {\ C partielle} {\ partial r ^ {(k + 1)} _ j} L'étape (z ^ {(k + 1)} _ j) $

Nous avons besoin aussi de propager le gradient aux couches précédentes, qui consiste à additionner toutes les influences connectées à chaque neurone:

  1. $ \ frac {\ C partielle} {\ r partielle ^ {(k)} _ i} = \ sum _ {\ forall j} \ frac {\ partial C} {\ z partielle ^ {(k + 1)} _ j} \ frac {\ z partielle ^ {(k + 1)} _ j} {\ partial r ^ {(k)} _ i} = \ sum _ {\ forall j} \ frac {\ C partielle} {\ z partielle ^ {(k + 1)} _ j} W ^ {(k)} _ {ij} $

Et nous devons le connecter à la matrice de poids afin d'effectuer des réglages plus tard:

  1. $ \ frac {\ partial C} {\ W partielle ^ {(k)} _ {ij}} = \ frac {\ partial C} {\ z partielle ^ { (k + 1)} _ j} \ frac {\ partial z ^ {(k + 1)} _ j} {\ W partielle ^ {(k)} _ {ij}} = \ frac {\ partial C} {\ partial z ^ {(k + 1)} _ j} r ^ {(k)} _ {i} $

Vous pouvez résoudre ces plus (en substituant des valeurs précédentes), ou les combiner (étapes souvent 1 et 2 sont combinés pour relier pré-transformer la couche de gradients par couche). Cependant ce qui précède est la forme la plus générale. Vous pouvez également remplacer la $ Etape (z ^ {(k + 1)} _ j) $ dans l'équation 1 pour quelle que soit la fonction dérivée est de votre fonction d'activation en cours - ce est le seul endroit où elle affecte les calculs.


Retour à vos questions:

Si cette dérivation est correcte, comment cela empêche de disparaître?

Votre dérivation n'a pas été correcte. Toutefois, cela ne répond pas complètement à vos préoccupations.

La différence entre l'utilisation sigmoïde par rapport à RELU est juste dans la fonction de l'étape par rapport à, par exemple sigmoïde de $ y (1-y) $ , appliqué une fois par couche. Comme vous pouvez le voir à partir des équations couche par couche générique ci-dessus, le gradient de la fonction de transfert apparaît dans un seul endroit. meilleur dérivé de cas du sigmoïde ajoute un facteur de 0,25 (lorsque $ x = 0, y = 0,5 $ ), et il y a pire que cela et sature rapidement proche de zéro dérivé loin de $ x = 0 $ . Le gradient de Relu est 0 ou 1, et dans un réseau sain sera 1 assez souvent pour avoir une perte moins gradient pendant 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 en raison de poids, alors ne cette cause de fuite ou expgradient loding?

Oui, cela peut avoir un impact aussi. Cela peut être un problème quel que soit le choix de la fonction de transfert. Dans certaines combinaisons, Relu peut aider à maintenir l'explosion des gradients sous contrôle trop, car il ne sature pas (si grandes normes de poids ont tendance à être pauvres des solutions directes et un optimisateur est peu susceptible de se diriger vers eux). Cependant, ce n'est pas garanti.

scroll top