In che modo esattamente le reti neurali convoluzionali usano la convoluzione al posto della moltiplicazione della matrice?


13

Stavo leggendo il Libro di Yoshua Bengio sull'apprendimento profondo e si dice a pagina 224:

Le reti convoluzionali sono semplicemente reti neurali che usano la convoluzione al posto della moltiplicazione della matrice generale in almeno uno dei loro strati.

tuttavia, non ero sicuro al 100% di come "sostituire la moltiplicazione della matrice con la convoluzione" in un senso matematicamente preciso.

Ciò che mi interessa davvero è definire questo per i vettori di input in 1D (come in xRd ), quindi non avrò input come immagini e cercherò di evitare la convoluzione in 2D.

Quindi, ad esempio, nelle reti neurali "normali", le operazioni e il modello del reparto di alimentazione possono essere espressi in modo conciso come nelle note di Andrew Ng:

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

dove è il vettore calcolato prima di passarlo attraverso la non linearità f . La non linearità agisce pero sul vettore z ( l ) e a ( l + 1 ) è l'output / attivazione delle unità nascoste per il layer in questione.z(l)fz(l)a(l+1)

Questo calcolo mi è chiaro perché la moltiplicazione della matrice è chiaramente definita per me, tuttavia, mi sembra poco chiaro sostituire semplicemente la moltiplicazione della matrice con la convoluzione. vale a dire

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

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

Voglio essere sicuro di comprendere matematicamente l'equazione sopra.

Il primo problema che ho appena sostituito la moltiplicazione di matrice con la convoluzione è che di solito si identifica una riga di con un prodotto punto. Quindi si sa chiaramente come l'intera a ( l ) sia in relazione ai pesi e che sia mappata a un vettore z ( l + 1 ) della dimensione come indicato da W ( l ) . Tuttavia, quando uno lo sostituisce con convoluzioni, non mi è chiaro quale riga o pesi corrispondano a quali voci in a ( l )W(l)a(l)z(l+1)W(l)a(l). Non è nemmeno chiaro per me che abbia senso rappresentare più i pesi come una matrice (fornirò un esempio per spiegare questo punto in seguito)

Nel caso in cui input e output siano tutti in 1D, si calcola semplicemente la convoluzione in base alla sua definizione e poi la passa attraverso una singolarità?

Ad esempio se avessimo il seguente vettore come input:

x=[1,2,3,4]

e abbiamo avuto i seguenti pesi (forse l'abbiamo imparato con il backprop):

W=[5,6,7]

quindi la convoluzione è:

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

sarebbe corretto passare semplicemente attraverso la non linearità e trattare il risultato come un livello / rappresentazione nascosta ( per ora non assumere pool )? cioè come segue:

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

(il tutorial UDLF di Stanford credo ritaglia i bordi in cui la convoluzione si unisce agli 0 per qualche motivo, dobbiamo tagliarli?)

È così che dovrebbe funzionare? Almeno per un vettore di input in 1D? La non è più un vettore?W

Ho anche disegnato una rete neurale di come questo dovrebbe apparire come penso:

inserisci qui la descrizione dell'immagine

Risposte:


3

Mi sembra che tu sia sulla buona strada, ma forse posso aiutarti a chiarire.

Uscita singola

Immaginiamo un tradizionale livello di rete neurale con unità di input e 1 output (supponiamo anche che non ci siano errori). Questo strato ha un vettore di pesi w R n che possono essere apprese utilizzando vari metodi (backprop, algoritmi genetici, ecc), ma ignoreremo l'apprendimento e concentrarsi solo sulla propagazione in avanti.nwRn

xRnaRxwσ

a=σ(xw)

wxxw

xwxRmm>nwx

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

w

Fondamentalmente hai già inserito questo nella tua domanda, ma sto cercando di esaminare la connessione con i livelli di rete neurale vaniglia usando il prodotto punto per fare un punto. La differenza principale con i livelli di rete vaniglia è che se il vettore di input è più lungo del vettore di peso, una convoluzione trasforma l'output del livello di rete in un vettore: nelle reti di convoluzione, i vettori sono completamente verso il basso! Questo vettore di output è chiamato "mappa caratteristica" per l'unità di output in questo layer.

Uscite multiple

nw1Rnw2Rn

W=[w1w2]

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

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

A=σ(XW)
XW

W

Speriamo sia utile!


1

Uno strato convoluzionale è un sottoinsieme rigoroso di una rete completamente connessa, ovvero una moltiplicazione di matrici. Uno strato convoluzionale nel passaggio in avanti equivale infatti a una moltiplicazione di matrice in cui:

  • alcuni pesi sono legati / condivisi
  • alcuni pesi sono zero

Nel passaggio all'indietro, i pesi verranno aggiornati in base ai pesi che hanno contribuito a quanto nel passaggio in avanti. cioè, i pesi che erano zero sono ancora zero. I pesi che sono stati collegati tra più uscite riceveranno il gradiente da tutti questi output (i cui gradienti vengono sommati insieme, per produrre l'aggiornamento del gradiente finale per quel peso).


0

No, non è così che dovrebbe funzionare. L'operazione di convoluzione rende sempre più piccolo l'ingresso (per filtri con dimensione> 1), non più grande come nell'esempio.

È semplicemente una moltiplicazione elementally. Quando si esegue la convoluzione sui primi 3 elementi dell'input, l'output sarebbe1*5+2*6+3*7=38. (vedi deeplearning.stanford.edu per un esempio)


hai provato conv ([1, 2, 3, 4], [5,6,7]) in matlab? Vai al terminale e controllalo tu stesso. Se usi la definizione convenzionale di convoluzione, puoi calcolare a mano il vettore [5,16,34,52,45,28]. Il vettore non si restringe sempre. Dipende da dove inizi a fare la convoluzione e se tratti le cose al di fuori dell'intervallo dell'indice come zero. Se lo fai come ti ho suggerito in questo post, otterrai un vettore di dimensioniN+n-1. Se tagli i bordi (cuz di indice che esce dall'intervallo) otterrai un vettore di dimensioniN-n+1, dove N e n sono le dimensioni dei vettori in questione.
Charlie Parker,

The convolution used in that webapge is not the definition of the mathematical convolution.
Charlie Parker

2
Yes, the convolution used for CNN is not the usual convolution. That's confusing to everyone, but that's just how it is :) Given the nature of CNN i.e. analyze an image it will always start with the first n elements, where n is the filter size and then be passed over the input. However, it will not be extended beyond the end, so the output will be shrinked by n1.
pir

1
I see, I think that makes sense now that I looked it up. However, there is one tiny mistake. The input doesn't always make it smaller, I am aware of the different type of convolutions now and even in the CNN, according to Yoshua Bengio's book there are 3 types of convolutions (full, valid, same) iro.umontreal.ca/~bengioy/dlbook. I don't understand them in detail but at least I am aware of them! Thanks Felbo. The vision community should not be using the word convolutions, its confusing and irritating. Anyway, thanks.
Charlie Parker

2
@CharlieParker The conv function in Matlab has the same 3 types of "shapes" (full, valid, same), Matlab just defaults to "full" -- see docs at mathworks.com/help/matlab/ref/conv.html. A convolution without flipping the kernel is a cross-correlation, so xcorr(x, y) = conv(x, fliplr(y)). The NN community tends to say convolution when they are actually doing a cross-correlation, but it's pretty similar.
lmjohns3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.