Capire come funzionano i livelli convoluzionali

Aug 18 2020

Dopo aver lavorato con una CNN utilizzando Keras e il set di dati Mnist per il noto problema di riconoscimento delle cifre scritte a mano, ho sollevato alcune domande su come funziona lo strato convoluzionale. Posso capire qual è il processo di convoluzione.

La mia prima domanda è: quali sono i filtri? Posso capire il loro scopo. Sono utilizzati per mappare bordi, forme, ecc. Su un'immagine. Ma come vengono inizializzati? Hanno un valore iniziale casuale o ci sono filtri immagine standard che vengono utilizzati? Se vengono inizializzati con un valore casuale, i valori dovrebbero essere modificati durante il processo di addestramento della rete. Se è così, viene creata una nuova domanda, come fa qualcuno a propagare il filtro dello strato convoluzionale? Qual è l'algoritmo alla base di questo processo?

In secondo luogo, ho notato che posso aggiungere una funzione di attivazione allo strato convoluzionale in Keras. L'intera matrice dell'output passa attraverso la funzione di attivazione? In che modo l'utilizzo di una funzione di attivazione cambia il processo di apprendimento dello strato convoluzionale?

Ultimo ma non meno importante, uno strato convoluzionale ha peso e polarizzazioni come uno strato denso? Moltiplichiamo la matrice di output dopo il processo di convoluzione con una matrice di peso e aggiungiamo alcuni bias prima di passarla attraverso la funzione di attivazione? Se è vero, allora seguiamo lo stesso processo che facciamo con gli strati densi per allenare questi pesi e pregiudizi?

Risposte

11 AkshaySehgal Aug 18 2020 at 20:34

Quali sono i filtri?

Un filtro / kernel è un insieme di pesi apprendibili che vengono appresi utilizzando l'algoritmo di backpropagation. Puoi pensare a ogni filtro come a memorizzare un singolo modello / modello. Quando convolgi questo filtro sull'input corrispondente, stai fondamentalmente cercando di scoprire la somiglianza tra il modello memorizzato e le diverse posizioni nell'input.

Ma come vengono inizializzati? Hanno un valore iniziale casuale o ci sono filtri immagine standard che vengono utilizzati?

I filtri sono generalmente inizializzati con un valore apparentemente arbitrario e quindi useresti un ottimizzatore di discesa del gradiente per ottimizzare i valori in modo che i filtri risolvano il tuo problema.

Esistono molte diverse strategie di inizializzazione.

  • Campione da una distribuzione, come una distribuzione normale o uniforme
  • Imposta tutti i valori su 1 o 0 o su un'altra costante
  • Ci sono anche alcuni metodi euristici che sembrano funzionare molto bene nella pratica, uno popolare è il cosiddetto inizializzatore glorot che prende il nome da Xavier Glorot che li ha introdotti qui. Gli inizializzatori Glorot campionano anche dalla distribuzione ma troncano i valori in base alla complessità del kernel.
  • Per tipi specifici di kernel, ci sono altri valori predefiniti che sembrano funzionare bene. Vedi ad esempio questo articolo .

Se vengono inizializzati con un valore casuale, i valori dovrebbero essere modificati durante il processo di addestramento della rete. Se è così, viene creata una nuova domanda, come fa qualcuno a propagare il filtro dello strato convoluzionale? Qual è l'algoritmo alla base di questo processo?

Considera l'operazione di convoluzione come una funzione tra l'immagine di input e una matrice di pesi casuali. Man mano che si ottimizza la funzione di perdita del modello, i pesi (e i bias) vengono aggiornati in modo tale da iniziare a formare caratteristiche spaziali discriminatorie estremamente buone. Questo è lo scopo della backpropogation, che viene eseguita con l'ottimizzatore definito nell'architettura del modello. Matematicamente ci sono alcuni altri concetti che spiegano come avviene il backprop su un'operazione di convoluzione (piena conv con 180 rotazioni). Se sei interessato, controlla questo link .

L'intera matrice dell'output passa attraverso la funzione di attivazione? In che modo l'utilizzo di una funzione di attivazione cambia il processo di apprendimento dello strato convoluzionale?

Pensiamo alle funzioni di attivazione come semplici funzioni di "ridimensionamento" non lineare. Dato un input, il compito di una funzione di attivazione è quello di "schiacciare" i dati in un dato intervallo (esempio -> Relu "schiaccia" l'input in un intervallo (0, inf) semplicemente impostando ogni valore negativo a zero e restituendo ogni valore positivo così com'è)

Ora, nelle reti neurali, le attivazioni vengono applicate ai nodi che applicano una funzione lineare sulla funzione di input, la matrice del peso e il bias (mx + c). Pertanto, nel caso della CNN, è lo stesso. Una volta che il tuo forward-pass prende l'immagine in ingresso, esegue una funzione di convoluzione su di essa applicando un filtro (matrice del peso), aggiunge un bias, l'uscita viene quindi inviata a una funzione di attivazione per `` schiacciarla '' in modo non lineare prima di portarla a il livello successivo.

È abbastanza semplice capire perché le attivazioni aiutano. Se ho un nodo che sputa x1 = m0*x0+b0e che viene quindi inviato a un altro nodo che sputa x2 = m1*x1+b1, il passaggio in avanti complessivo è proprio x2 = m1*(m0*x0+b0)+b1lo stesso di x2 = (m1*m0*x0) + (m1*b0+b1)o x2 = M*x0 + B. Questo mostra che il solo impilare 2 equazioni lineari dà un'altra equazione lineare e quindi in realtà non c'era bisogno di 2 nodi, invece avrei potuto usare solo 1 nodo e usare i nuovi valori M e B per ottenere lo stesso risultato x2 da x0.

È qui che l'aggiunta di una funzione di attivazione aiuta. L'aggiunta di una funzione di attivazione consente di impilare i livelli della rete neurale in modo da poter esplorare correttamente lo spazio del modello non lineare, altrimenti rimarrai bloccato con lo y=mx+cspazio modello da esplorare perché tutte le combinazioni lineari di funzioni lineari sono un modello lineare stesso.

Uno strato convoluzionale ha peso e polarizzazioni come uno strato denso?

Sì, lo fa. Viene aggiunto dopo che la matrice del peso (filtro) è stata applicata all'immagine di input utilizzando un'operazione di convoluzioneconv(inp, filter)

Moltiplichiamo la matrice di output dopo il processo di convoluzione con una matrice di peso e aggiungiamo alcuni bias prima di passarla attraverso la funzione di attivazione?

Un'operazione di prodotto punteggiato viene eseguita tra una sezione dell'immagine di input e il filtro mentre si esegue una convoluzione sull'immagine di input più grande. La matrice di output, viene quindi aggiunta con bias (broadcasting) e passata attraverso una funzione di attivazione a 'squish'.

Se è vero, seguiamo lo stesso processo che facciamo con gli strati densi per allenare questi pesi e pregiudizi?

Sì, seguiamo lo stesso identico processo nel passaggio in avanti tranne per il fatto che c'è una nuova operazione aggiunta all'intero mix, che è la convoluzione. Cambia la dinamica soprattutto per il passaggio all'indietro ma, in sostanza, l'intuizione complessiva rimane la stessa.


Il punto cruciale dell'intuizione è:

  • Non confondere una funzionalità e un filtro. Un filtro è ciò che ti aiuta a estrarre le caratteristiche (modelli di base) dall'immagine di input utilizzando operazioni come punto, conv, bias e attivazioni
  • Ciascun filtro consente di estrarre una mappa 2D di un semplice motivo esistente sull'immagine (come un bordo). Se hai 20 filtri, otterrai 20 mappe delle caratteristiche per un'immagine a 3 canali, che vengono impilate come canali nell'output.
  • Molte di queste funzionalità, che catturano diversi modelli semplici, vengono apprese come parte del processo di formazione e diventano le caratteristiche di base per il livello successivo (che potrebbe essere un'altra CNN o un denso)
  • Le combinazioni di queste funzionalità consentono di eseguire l'attività di modellazione.
  • I filtri vengono addestrati ottimizzando per ridurre al minimo una funzione di perdita utilizzando backprop. Segue il ragionamento a ritroso:
      - How can I minimize my loss?
      - How can I find the best features that minimize the loss?
      - How can I find the best filters that generate the best features? 
      - What are the best weights and biases which give me the best filters?

Ecco una buona immagine di riferimento da tenere a mente ogni volta che si lavora con le CNN (solo per rafforzare l'intuizione)

Spero che risponda alle tue domande.

2 10xAI Aug 18 2020 at 22:22

La CNN apprende nello stesso modo in cui apprende una rete neurale densa, ovvero Forwardpass e Backpropagation .
Quello che apprendiamo qui sono i pesi dei filtri .

Quindi, risposte alle tue domande individuali -

  • Ma come vengono inizializzati? - Inizializzazione standard ad esempio glorot_uniform
  • quindi i valori dovrebbero essere modificati nel processo di formazione della rete .
  • Come fa qualcuno a propagare il filtro dello strato convoluzionale? Qual è l'algoritmo alla base di questo processo? - Proprio come ANN Backpropagation con GradientDescent
  • Posso aggiungere una funzione di attivazione allo strato convoluzionale in Keras. L'intera matrice dell'output passa attraverso la funzione di attivazione? - Sì, teniamo ReLU la maggior parte del tempo
  • In che modo l'utilizzo di una funzione di attivazione cambia il processo di apprendimento dello strato convoluzionale? - È per lo stesso motivo per cui lo usiamo in ANN, ovvero Non linearità
  • Uno strato convoluzionale ha peso e polarizzazioni come uno strato denso? -
  • Se è vero, seguiamo lo stesso processo che facciamo con gli strati densi per allenare questi pesi e pregiudizi? Sì, aggiungo solo il concetto di peso / filtri / convoluzione condivisi e pooling


Cercherò di spiegare alcuni punti chiave della CNN per chiarire le risposte di cui sopra -

  • Ciascun filtro esegue una convoluzione sul volume nD, ad esempio 3-D per RGB
  • Quindi, esegue una moltiplicazione in termini di elemento con i pixel, l'output viene sommato e passa attraverso una funzione di attivazione
  • Questo diventa il singolo elemento di una mappa delle caratteristiche
  • Ogni filtro crea una mappa delle caratteristiche.
  • La profondità del filtro sarà uguale al numero di mappe delle caratteristiche, ad esempio se hai utilizzato 20 filtri per la prima immagine RGB. Creerà 20 mappe di caratteristiche e se utilizzi filtri 5x5 su questo livello, la dimensione del filtro = 5x5x20 .
  • Ogni filtro aggiungerà parametri = la sua dimensione, ad esempio 25 per l'ultimo esempio
  • Se vuoi visualizzare come un semplice NN. Vedi l'immagine sotto . Tutti i theta vengono moltiplicati, sommati e passano attraverso una funzione di attivazione. La backpropagazione avviene nello stesso modo di una rete neurale densa


$\hspace{6cm}$Credito immagine - Jeremy Jordan


Puoi leggere questi riferimenti per sviluppare un'intuizione in bianco e nero.
CS231n: Implementazione Numpy del
blog di Jeremy Jordan per l' inverno 2016

1 JoshPurtell Aug 18 2020 at 19:39

In un certo senso, le convoluzioni non introducono una deviazione radicale dall'architettura standard. Poiché le operazioni applicate all'ingresso filtrato (max, min, mean, ecc.) Sono continue, questi filtri costituiscono uno "strato" con perdita della rete. Hai ragione a intuire che i parametri del filtro possono essere addestrati - quindi un filtro che trasforma un quadrato 2x2 secondo [0,1,2,0] e quindi restituisce il massimo in un periodo di allenamento può trasformarsi secondo [.1 ,. 9,1.7,0] e restituisci il massimo nel successivo. Questa formazione può essere eseguita utilizzando SGD. Puoi pensare alla matrice di transizione come espressa in modo equivalente come un insieme di pesi e pregiudizi, insieme a una funzione, anche se potrebbe non essere istanziata come tale in ogni pacchetto (non ho usato keras).

Per quanto ne so, tuttavia, la funzione di filtro non è soggetta a modifiche durante l'allenamento: un livello "max" non si trasformerà in un livello "medio". Considera perché è così.

Per quanto riguarda le funzioni di attivazione, introducono semplicemente una maggiore non linearità al risultato. Inoltre, se sono monotoni (questo è spesso il caso), dovrebbero essere in grado di spostarsi con molte delle operazioni di filtro comuni, come max, min, mean, ecc. Quindi l'output del livello potrebbe apparire come Max (Relu (Filter (Input))) o Relu (Max (Filter (Input))), con il primo caso probabilmente un po 'più idiosincratico.

leftaroundabout Aug 19 2020 at 16:29

La mia prima domanda è: quali sono i filtri?

La convenzione nel Deep Learning consiste nel chiamare i pesi utilizzati nella convoluzione filtri o sinonimi. Altri campi fanno una distinzione tra questi due termini: nel mio libro, l'array di pesi è il kernel e l'operazione che esegue una convoluzione con quei pesi è il filtro. Cioè, un filtro è una funzione che accetta un input, ad esempio un'immagine, e ti dà un'immagine filtrata . Con la consapevolezza che stiamo parlando di filtri convoluzionali, addestrare il kernel equivale ad addestrare il filtro, perché il filtro è completamente definito dai pesi nel kernel.

(Matematicamente parlando, i filtri convoluzionali sono la classe dei filtri lineari tempo-invarianti con supporto compatto.)

Ma come vengono inizializzati?

Ci sono una miriade di modi, vedi altre risposte.

come fa qualcuno a propagare il filtro dello strato convoluzionale

È qui che paga per la comprensione fare una distinzione tra filtri e kernel. Quello che stai effettivamente facendo è passare due argomenti all'operazione di convoluzione: il kernel e l' input .$$ f(k,x) = k\star x $$ Il filtro è $f$ parzialmente applicato al kernel: $$ f_k = \backslash x \mapsto f(k,x) $$Questo è ciò che alla fine ti interessa; dopo l'addestramento il kernel verrà corretto in modo che il filtro sia solo una funzione di$x$. Ma non puoi davvero propagare il filtro (almeno nei framework comuni) perché è una funzione. Quello che invii a ritroso è il kernel , e funziona allo stesso modo in cui riproporesti qualsiasi altro parametro: valuti$f$ insieme alle sue derivate (di entrambi gli argomenti!) per un particolare $x$ nel passaggio in avanti, quindi inviare attraverso un doppio vettore nel passaggio all'indietro che indica i contributi del gradiente in entrambi $x$ e $k$. Quello in$x$ si torna indietro al livello precedente, quello in $k$ usi per l'aggiornamento dell'apprendimento.

In secondo luogo, ho notato che posso aggiungere una funzione di attivazione allo strato convoluzionale in Keras

Sì, ma l'attivazione non fa parte dell'operazione di convoluzione. È meglio inteso come un livello separato, ma poiché non ha parametri e poiché le CNN in genere contengono un Relu dopo ogni convoluzione, Keras ha una scorciatoia per questo.$$ g(k,x) = \operatorname{Relu}(f_k(x)) $$ $$ g_k = \bigl(\backslash x\mapsto \operatorname{Relu}(f_k(x))\bigr) = \operatorname{Relu} \circ f_k $$ Per retropropagare questo, devi prima tirare il passaggio all'indietro attraverso la derivata dell'attivazione prima di arrivare alla convoluzione.

Ultimo ma non meno importante, uno strato convoluzionale ha peso e polarizzazioni come uno strato denso?

Sì, i pesi sono nel kernel e in genere aggiungerai anche i bias, che funzionano esattamente allo stesso modo di un'architettura completamente connessa.

Una cosa che è importante in architetture convoluzionali, e spesso non in realtà spiegato molto bene, è che un tale strato non è in realtà solo un unico filtro convoluzionale ma un intero “banca” di tali filtri, ognuno con il proprio kernel. Così per ogni ingresso si ottiene un'intera famiglia di uscite, chiamate canali :$$ f_i(\mathbf{k},x) = f(k_i,x) $$Quindi, si passa tutti questi al livello successivo, cioè anche i livelli devono accettare più canali - che è di nuovo gestito da più kernel, cioè hai un'intera matrice di kernel . Un modo matematico di vedere questo è che il flusso del segnale non contiene vettori nello spazio$I$ di immagini, ma in uno spazio tensore-prodotto $\mathbb{R}^m\otimes I$, dove $m$è il numero di canali. E nello "spazio canale", stai effettivamente suonando completamente connesso. (Quando le persone ne parlano$1\times1$ strati convoluzionali, significa che non stanno effettivamente eseguendo una convoluzione meschina, ma solo una matrice completamente connessa tra i canali.)