Come posso calcolare il termine delta di uno strato convoluzionale, dati i termini delta e i pesi del precedente strato convoluzionale?


10

Sto cercando di formare una rete neurale artificiale con due strati convoluzionali (c1, c2) e due strati nascosti (c1, c2). Sto usando l'approccio standard di backpropagation. Nel passaggio indietro calcolo il termine di errore di un livello (delta) in base all'errore del livello precedente, ai pesi del livello precedente e al gradiente di attivazione rispetto alla funzione di attivazione del livello corrente. Più specificamente, il delta del livello l è simile al seguente:

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

Sono in grado di calcolare il gradiente di c2, che si collega in un livello normale. Moltiplico semplicemente i pesi di h1 con il suo delta. Quindi rimodulo quella matrice nella forma dell'output di c2, la moltiplico per il gradiente della funzione di attivazione e ho finito.

Ora ho un termine delta di c2 - che è una matrice 4D di dimensioni (featureMapSize, featureMapSize, filterNum, patternNum). Inoltre ho i pesi di c2, che sono una matrice 3D di dimensioni (filterSize, filterSize, filterNum).

Con questi due termini e il gradiente dell'attivazione di c1 voglio calcolare il delta di c1.

Per farla breve:

Dato il termine delta di un livello convoluzionale precedente e i pesi di quel livello, come posso calcolare il termine delta di un livello convoluzionale?

Risposte:


6

In primo luogo sto derivando l'errore per uno strato convoluzionale di seguito per semplicità per un array monodimensionale (input) che può essere facilmente trasferito in un multidimensionale quindi:

Partiamo dal presupposto che di lunghezza N sono gli input della l - 1 -conv. strato, m è il nucleo dimensioni dei pesi w denota ogni peso w i e l'uscita è x l . Quindi possiamo scrivere (notare la somma da zero): x l i = m - 1 a = 0 w a y l - 1 a + i dove y l iyl-1Nl-1mwwioXl

Xiol=Σun'=0m-1wun'yun'+iol-1
e f la funzione di attivazione (ad es sigmoidale). Con questo a portata di mano ora possiamo considerare alcune funzioni di errore E e la funzione di errore a livello convoluzionale (quella del tuo livello precedente) data daE /y l i . Vogliamo ora scoprire la dipendenza dell'errore in uno dei pesi nei layer precedenti: Eyiol=f(Xiol)fEE/yiol dove abbiamo la somma su tutte le espressioni in cui siverificawa, che sonoN-m. Nota anche che sappiamo che l'ultimo termine deriva dal fatto chex l i
Ewun'=Σun'=0N-mEXiolXiolwun'=Σun'=0N-mEwun'yio+un'l-1

wun'N-m che puoi vedere dalla prima equazione. Per calcolare il gradiente dobbiamo conoscere il primo termine, che può essere calcolato con: EXiolwun'=yio+un'l-1
dove nuovamente il primo termine è l'errore nel livello precedente efla funzione di attivazione non lineare.
EXiol=EyiolyiolXiol=EyiolXiolf(Xiol)
f

Avendo tutte le entità necessarie, siamo ora in grado di calcolare l'errore e di propagarlo in modo efficiente al prezioso strato:

δun'l-1=Eyiol-1=Σun'=0m-1EXio-un'lXio-un'lyiol-1=Σun'=0m-1EXio-un'lwun'fliopped
Xiolyiol-1flioppedT

Quindi puoi semplicemente calcolare l'errore nel prossimo livello (ora in notazione vettoriale):

δl=(wl)Tδl+1f'(Xl)

δl=upSun'mple((wl)Tδl+1)f'(Xl)
upSun'mple

Sentiti libero di aggiungermi o correggermi!

Per riferimenti vedi:

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

e per un'implementazione C ++ (senza obbligo di installazione): https://github.com/nyanp/tiny-cnn#supported-networks

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.