Comment puis-je calculer le terme delta d'une couche convolutionnelle, étant donné les termes delta et les poids de la couche convolutionnelle précédente?

10

J'essaie de former un réseau neuronal artificiel avec deux couches convolutionnelles (c1, c2) et deux couches cachées (c1, c2). J'utilise l'approche de rétropropagation standard. Dans la passe arrière, je calcule le terme d'erreur d'une couche (delta) en fonction de l'erreur de la couche précédente, des poids de la couche précédente et du gradient de l'activation par rapport à la fonction d'activation de la couche actuelle. Plus précisément, le delta de la couche l ressemble à ceci:

delta(l) = (w(l+1)' * delta(l+1)) * grad_f_a(l)

Je suis capable de calculer le gradient de c2, qui se connecte à une couche régulière. Je multiplie simplement les poids de h1 avec son delta. Ensuite, je remodèle cette matrice sous la forme de la sortie de c2, la multiplie par le gradient de la fonction d'activation et j'ai terminé.

J'ai maintenant le terme delta de c2 - qui est une matrice 4D de taille (featureMapSize, featureMapSize, filterNum, patternNum). De plus, j'ai les poids de c2, qui sont une matrice 3D de taille (filterSize, filterSize, filterNum).

Avec ces deux termes et le gradient d'activation de c1 je veux calculer le delta de c1.

Longue histoire courte:

Étant donné le terme delta d'une couche convolutionnelle précédente et les poids de cette couche, comment puis-je calculer le terme delta d'une couche convolutionnelle?

cdwoelk
la source

Réponses:

6

Je dérive d'abord l'erreur pour une couche convolutionnelle ci-dessous pour plus de simplicité pour un tableau unidimensionnel (entrée) qui peut facilement être transféré vers un multidimensionnel puis:

Nous supposons ici que les de longueur N sont les entrées de la l - 1 -ième conv. couche, m est la taille du noyau des poids w indiquant chaque poids par w i et la sortie est x l . On peut donc écrire (noter la somme de zéro): x l i = m - 1 a = 0 w a y l - 1 a + iyl-1Nl-1mwwjeXl

Xjel=une=0m-1wuneyune+jel-1
yjel=F(Xjel)et la fonction d'activation (par exemple sigmoïde). Avec cela à portée de main, nous pouvons maintenant considérer une fonction d'erreur E et la fonction d'erreur à la couche convolutionnelle (celle de votre couche précédente) donnée par E /y l i . Nous voulons maintenant découvrir la dépendance de l'erreur dans l'un des poids de la ou des couches précédentes: EFEE/yjel où nous avons la somme de toutes les expressions dans lesquelleswase produit, qui sontN-m. Notez également que nous savons que le dernier terme provient du fait quex l i
Ewune=une=0N-mEXjelXjelwune=une=0N-mEwuneyje+unel-1

wuneN-m que vous pouvez voir dans la première équation. Pour calculer le gradient, nous devons connaître le premier terme, qui peut être calculé par: EXjelwune=yje+unel-1
où encore le premier terme est l'erreur dans la couche précédente etfla fonction d'activation non linéaire.
EXjel=EyjelyjelXjel=EyjelXjelF(Xjel)
F

Ayant toutes les entités nécessaires, nous pouvons maintenant calculer l'erreur et la propager efficacement vers la couche précieuse:

δunel-1=Eyjel-1=une=0m-1EXje-unelXje-unelyjel-1=une=0m-1EXje-unelwuneFljeppe
Xjelyjel-1FljeppeT

Par conséquent, vous pouvez simplement calculer l'erreur dans la couche suivante par (maintenant en notation vectorielle):

δl=(wl)Tδl+1F(Xl)

δl=upsunemple((wl)Tδl+1)F(Xl)
upsunemple

N'hésitez pas à m'ajouter ou à me corriger!

Pour les références, voir:

http://ufldl.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/ http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

et pour une implémentation C ++ (sans obligation d'installation): https://github.com/nyanp/tiny-cnn#supported-networks

LeoW.
la source