Comment les réseaux de neurones convolutionnels utilisent-ils exactement la convolution à la place de la multiplication matricielle?


13

Je lisais le livre de Yoshua Bengio sur l'apprentissage profond et il est dit à la page 224:

Les réseaux convolutifs sont simplement des réseaux neuronaux qui utilisent la convolution à la place de la multiplication matricielle générale dans au moins une de leurs couches.

cependant, je ne savais pas à 100% comment "remplacer la multiplication matricielle par convolution" dans un sens mathématiquement précis.

Ce qui m'intéresse vraiment, c'est de définir cela pour les vecteurs d'entrée en 1D (comme dans xRd ), donc je n'aurai pas d'entrée en tant qu'images et j'essaierai d'éviter la convolution en 2D.

Ainsi, par exemple, dans les réseaux de neurones "normaux", les opérations et le modèle de la salle d'alimentation peuvent être exprimés de manière concise comme dans les notes d'Andrew Ng:

W(l)a(l)=z(l+1)
f(z(l+1))=a(l+1)

est le vecteur calculé avant de le faire passer par la non-linéarité f . La non-linéarité agit entrée pero sur le vecteur z ( l ) et a ( l + 1 ) est la sortie / activation d'unités cachées pour la couche en question.z(l)fz(l)a(l+1)

Ce calcul est clair pour moi car la multiplication matricielle est clairement définie pour moi, cependant, le simple remplacement de la multiplication matricielle par convolution me semble peu clair. c'est à dire

f ( z ( l + 1 ) ) = a ( l + 1 )

W(l)a(l)=z(l+1)
f(z(l+1))=a(l+1)

Je veux m'assurer de bien comprendre mathématiquement l'équation ci-dessus.

Le premier problème que j'ai avec le simple remplacement de la multiplication matricielle par la convolution est qu'en général, on identifie une ligne de avec un produit scalaire. On sait donc clairement comment l'ensemble a ( l ) est lié aux poids et qui correspond à un vecteur z ( l + 1 ) de la dimension indiquée par W ( l ) . Cependant, quand on le remplace par des circonvolutions, il n'est pas clair pour moi quelle ligne ou quels poids correspondent à quelles entrées dans un ( l )W(l)a(l)z(l+1)W(l)a(l). Ce n'est même pas clair pour moi qu'il est logique de représenter les poids comme une matrice en fait (je fournirai un exemple pour expliquer ce point plus tard)

Dans le cas où les entrées et sorties sont toutes en 1D, calcule-t-on simplement la convolution selon sa définition puis la passe-t-elle par une singularité?

Par exemple, si nous avions le vecteur suivant en entrée:

x=[1,2,3,4]

et nous avions les poids suivants (peut-être que nous l'avons appris avec backprop):

W=[5,6,7]

alors la convolution est:

xW=[5,16,34,52,45,28]

Serait-il correct de simplement passer la non-linéarité à travers cela et de traiter le résultat comme la couche / représentation cachée (supposons pas de mise en commun pour le moment)? c'est-à-dire comme suit:

f(xW)=f([5,16,34,52,45,28])=[f(5),f(16),f(34),f(52),f(45),f(28)])

( Le tutoriel stanford UDLF, je pense, coupe les bords où la convolution convov avec des 0 pour une raison quelconque, devons-nous couper cela?)

Est-ce ainsi que cela devrait fonctionner? Au moins pour un vecteur d'entrée en 1D? Le n'est-il plus un vecteur?W

J'ai même dessiné un réseau de neurones à quoi cela devrait ressembler, je pense:

entrez la description de l'image ici

Réponses:


3

Il me semble que vous êtes sur la bonne voie, mais je peux peut-être aider à clarifier.

Sortie unique

nwRn

La couche prend une entrée et la met en correspondance avec une activation a R en calculant le produit scalaire de xxRnaRxwσ

a=σ(xw)

wxxw

Dans un environnement convolutionnel, il y a plus de valeurs dans que dans w ; supposons maintenant notre entrée x R m pourxwxRmm>nwx

a1=σ(x1:nw)a2=σ(x2:n+1w)a3=σ(x3:n+2w)amn+1=σ(xmn+1:mw)

w

Vous avez déjà posé cela dans votre question, mais j'essaie de parcourir la connexion avec les couches de réseau neuronal vanille en utilisant le produit scalaire pour faire valoir un point. La principale différence avec les couches de réseau vanille est que si le vecteur d'entrée est plus long que le vecteur de poids, une convolution transforme la sortie de la couche réseau en un vecteur - dans les réseaux de convolution, ce sont des vecteurs à fond! Ce vecteur de sortie est appelé "carte d'entités" pour l'unité de sortie de cette couche.

Sorties multiples

nw1Rnw2Rn

W=[w1w2]

a1=σ(xw1)a2=σ(xw2)
a=[a1a2]=σ(xW)

w1w2a1=[a11a21amn+11]a2=[a12a22amn+12]A=[a1a2]

A=σ(XW)
XW

W

J'espère que c'est utile!


1

Une couche convolutionnelle est un sous-ensemble strict d'un réseau entièrement connecté, c'est-à-dire une multiplication matricielle. Une couche convolutionnelle dans la passe avant est en fait équivalente à une multiplication matricielle où:

  • certains poids sont liés / partagés
  • certains poids sont nuls

Dans la passe en arrière, les poids seront mis à jour en fonction des poids qui ont contribué combien dans la passe en avant. c'est-à-dire que les poids qui étaient nuls sont toujours nuls. Les poids qui étaient liés à plusieurs sorties recevront un gradient de toutes ces sorties (lesquels gradients sont additionnés ensemble, pour produire la mise à jour finale du gradient pour ce poids).


0

Non, ce n'est pas ainsi que cela est censé fonctionner. L'opération de convolution réduit toujours l'entrée (pour les filtres de taille> 1), pas plus grande que dans votre exemple.

15+26+3sept=38


N+n-1N-n+1

La convolution utilisée dans cette webapge n'est pas la définition de la convolution mathématique.
Charlie Parker

2
Oui, la convolution utilisée pour CNN n'est pas la convolution habituelle. C'est déroutant pour tout le monde, mais c'est comme ça :) Étant donné la nature de CNN, c'est-à-dire analyser une image, elle commencera toujours par la premièren éléments, où nest la taille du filtre et ensuite être passé sur l'entrée. Cependant, il ne sera pas étendu au-delà de la fin, donc la sortie sera réduite den-1.
pir

1
Je vois, je pense que cela a du sens maintenant que je l'ai regardé. Cependant, il y a une petite erreur. L'entrée ne la rend pas toujours plus petite, je connais les différents types de convolutions maintenant et même dans le CNN, selon le livre de Yoshua Bengio, il existe 3 types de convolutions (complet, valide, même) iro.umontreal.ca/ ~ bengioy / dlbook . Je ne les comprends pas en détail mais au moins je les connais! Merci Felbo. La communauté de la vision ne devrait pas utiliser le mot convolutions, son déroutant et irritant. Quoi qu'il en soit, merci.
Charlie Parker

2
@CharlieParker La fonction conv dans Matlab a les mêmes 3 types de "formes" (complet, valide, identique), Matlab se contente par défaut de "plein" - voir les documents sur mathworks.com/help/matlab/ref/conv.html . Une convolution sans renverser le noyau est donc une corrélation croisée xcorr(x, y) = conv(x, fliplr(y)). La communauté NN a tendance à dire convolution quand elle fait une corrélation croisée, mais c'est assez similaire.
lmjohns3
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.