CNN
Il fully connected layer in MLP ha una matrice dei pesi molto grande.

Le CNN, invece, usano un vettore di input fisso chiamato kernel.

- Il kernel V viene applicato per ogni i.
- Si sposta lungo x della dimensione del kernel e viene applicato.
- Anche l’operazione di convoluzione, escludendo la funzione di attivazione, è una trasformazione lineare.
Formule
Le formule per i casi continuo e discreto sono le seguenti.

La convoluzione amplifica o attenua localmente un segnale per estrarre o filtrare informazioni.
Cross-correlation
La cross-correlation è l’operazione di convoluzione unita con +. In pratica, la cross-correlation viene usata nell’implementazione delle CNN. Tradizionalmente la cross-correlation veniva chiamata convoluzione, ma sono operazioni diverse.

Operazione di convoluzione
Translation invariant: il kernel non cambia mentre si sposta nel dominio. Inoltre, il kernel viene applicato solo localmente al segnale. undefined undefined
Esempio di convoluzione nelle immagini
Demo interattiva: https://setosa.io/ev/image-kernels/
Formule di convoluzione multi-dimensionale

Applicare la convoluzione

- f è il kernel, g è l’input.
- Le coordinate per l’input sono (i, j).
- Nell’esempio, gli intervalli di p e q sono rispettivamente 0-1 e 0-1. Cioè, gli intervalli di p e q servono ad accoppiare ogni elemento del kernel con un elemento della matrice di input.
- Ogni coppia viene moltiplicata element-wise e sommata.
- Questo si ripete senza superare i confini dell’input.
Stima della dimensione dell’output della convoluzione

- Dimensione input = (H, W)
- Dimensione kernel = (KH, KW)
- Dimensione output = (OH, OW)
Convoluzione 2D
Da 3 dimensioni in su, si parla di tensore, non di matrice.

Quando un input 2D entra con 3 canali, la convoluzione viene eseguita come mostrato sopra. Si crea un kernel per ogni canale, e la convoluzione viene eseguita tra il kernel e l’input 2D di ogni canale. Poi tutti i risultati vengono sommati.
Illustrato graficamente:

Si preparano un kernel 3D e un input 3D. Naturalmente, sono diventati 3D perché abbiamo assunto dei canali per un input 2D.
Quando si esegue una convoluzione tra 3D e 3D, si produce un output 2D con 1 canale. Questo perché i kernel per tutti i canali sono stati preparati.
Se si vuole un output 2D con più canali invece di 1, basta creare più tensori kernel 3D e applicarli!

Backpropagation nelle CNN
Quando si calcola la backpropagation, compaiono anche le operazioni di convoluzione. Sembra complicato, ma la formula è la seguente.

- f: kernel
- g: segnale (input)
- Obiettivo: derivare la convoluzione di f e g
Per derivare rispetto a x, solo g contiene il termine x, quindi la derivata si applica solo a g. In altre parole, come mostrato nella seconda riga della formula, diventa una convoluzione di f e la derivata di g!
Questo vale anche nel caso discreto.
Esempio
Supponiamo di eseguire una convoluzione con input e kernel come vettori. I risultati vengono memorizzati nel vettore di output.

Supponiamo che l’errore sia calcolato dalla loss function e la sua derivata abbia raggiunto il vettore di output tramite backpropagation.
Può confondere, ma guardando la figura sopra: X3 e W3 vengono moltiplicati per produrre O1. Allo stesso modo, X3 e W2 vengono moltiplicati per O2, e X3 e W1 per O3.
Nello stesso modo, le derivate vengono moltiplicate con W3, W2, W1 del kernel e consegnate a X3.

Il kernel viene aggiornato allo stesso modo, a quanto pare. Onestamente, non capisco bene questa parte…
Mettendo tutto insieme, anche la backpropagation procede in modo identico a un’operazione di convoluzione!