Je ne sais pas si cette question appartient ici, mais elle est étroitement liée aux méthodes de gradient en optimisation, qui semble être sur le sujet ici. Quoi qu'il en soit, n'hésitez pas à migrer si vous pensez qu'une autre communauté a une meilleure expertise dans le sujet.
En bref, je cherche un exemple étape par étape de différenciation automatique en mode inverse . Il n'y a pas beaucoup de littérature sur le sujet et l'implémentation existante (comme celle de TensorFlow ) est difficile à comprendre sans connaître la théorie qui la sous-tend. Je serais donc très reconnaissant si quelqu'un pouvait montrer en détail ce que nous transmettons , comment nous le traitons et ce que nous retirons du graphique de calcul.
Quelques questions avec lesquelles j'ai le plus de difficulté:
- graines - pourquoi en avons-nous besoin?
- règles de différenciation inversée - Je sais comment faire la différenciation vers l'avant, mais comment allons-nous en arrière? Par exemple, dans l'exemple de cette section , comment savons-nous que ?
- travaillons-nous uniquement avec des symboles ou passons-nous par des valeurs réelles ? Par exemple, dans le même exemple , les symboles ou valeurs et sont-ils?¯ w i
Réponses:
Disons que nous avons l'expressionz=x1x2+sin(x1) et que nous voulons trouver des dérivées dzdx1 etdzdx2 . L'AD en mode inverse divise cette tâche en 2 parties, à savoir les passes avant et arrière.
Passe avant
Tout d'abord, nous décomposons notre expression complexe en un ensemble d'expressions primitives, c'est-à-dire des expressions consistant au plus en un seul appel de fonction. Notez que je renomme également les variables d'entrée et de sortie pour des raisons de cohérence, bien que ce ne soit pas nécessaire:
L'avantage de cette représentation est que les règles de différenciation pour chaque expression distincte sont déjà connues. Par exemple, nous savons que la dérivée dupéché est cos , et donc réw4réw1= cos( w1) . Nous utiliserons ce fait en passe inverse ci-dessous.
Essentiellement, la transmission directe consiste à évaluer chacune de ces expressions et à enregistrer les résultats. Disons que nos entrées sont:X1= 2 et X2= 3 . Ensuite nous avons:
Passe arrière
C'est là que la magie commence, et cela commence par la règle de la chaîne . Dans sa forme de base, la règle de chaîne stipule que si vous avez la variablet(u(v)) qui dépend de u qui, à son tour, dépend de v , alors:
ou, sit dépend de v via plusieurs chemins / variables uje , par exemple:
alors (voir la preuve ici ):
En termes de graphe d'expression, si nous avons un nœud finalz et des nœuds d'entrée wje , et le chemin de z à wje passe par les nœuds intermédiaires wp (c'est-à-dire z= g( wp) où wp= f( wje) ), on peut trouver la dérivée rézréwje as
En d'autres termes, pour calculer la dérivée de la variable de sortiez rapport à toute variable intermédiaire ou d'entrée wje , il suffit de connaître les dérivées de ses parents et la formule pour calculer la dérivée de l'expression primitive wp= f( wje) .
La passe inverse commence à la fin (c'est-à-direrézréz ) et se propage en arrière vers toutes les dépendances. Nous avons ici (expression pour "graine"):
Cela peut être lu comme «un changement dez entraîne exactement le même changement de z », ce qui est assez évident.
On sait alors quez= w5 et ainsi:
D'après la définitionw3= w1w2 et les règles des dérivées partielles, nous constatons que réw3réw2= w1 . Ainsi:
Ce qui, comme nous le savons déjà par la passe avant, est:
Enfin,w1 contribue à z via w3 et w4 . Encore une fois, à partir des règles des dérivées partielles, nous savons que réw3réw1= w2 etréw4réw1= cos( w1) . Ainsi:
Et encore une fois, étant donné les entrées connues, nous pouvons le calculer:
Et c'est tout!
Cette description ne concerne que les entrées scalaires, c'est-à-dire les nombres, mais en fait, elle peut également être appliquée à des tableaux multidimensionnels tels que des vecteurs et des matrices. Deux choses que l'on doit garder à l'esprit lors de la différenciation des expressions avec de tels objets:
la source