Come funziona la backpropagation attraverso il livello Max Pooling quando si esegue un batch?


10

Supponiamo che stiamo usando una dimensione batch di 100 campioni per l'apprendimento.

Quindi in ogni batch, il peso di ogni neurone (e distorsione, ecc.) Viene aggiornato aggiungendo il meno della velocità di apprendimento * il valore di errore medio che abbiamo trovato usando i 100 campioni * la derivata della funzione di errore rispetto a l'attuale peso del neurone che viene aggiornato.

Ora, quando utilizziamo un livello Max Pool, come possiamo calcolare la derivata su questo livello? In ogni campione che avanziamo, viene scelto un pixel diverso (diciamo) come massimo, quindi quando eseguiamo la backpropagazione di oltre 100 campioni in cui ogni volta che viene scelto un percorso diverso, come possiamo farlo? Una soluzione che ho in mente è quella di ricordare ogni pixel che è stato scelto come massimo, e quindi forse dividere la derivata su tutti i pixel massimi. È questo che si sta facendo?


Ho la stessa domanda quando BP con un solo campione, è chiaro che solo la derivata dell'elemento più grande non è zero, ma quando BP con campioni in batch, un campione diverso può causare una posizione diversa dell'elemento più grande, possiamo semplicemente calcolare la derivata media di ciascun parametro come al solito (solo aggiungere ∂L / ∂wi di ogni campione e diviso per dimensione del lotto)?
Shaotao Li,

Risposte:


8

Quando una rete neurale elabora un batch, tutti i valori di attivazione per ogni livello vengono calcolati per ciascun esempio (forse in parallelo per esempio se la libreria e l'hardware lo supportano). Tali valori vengono archiviati per un possibile utilizzo successivo, ovvero un valore per attivazione per esempio nel batch, non vengono aggregati in alcun modo

Durante la propagazione posteriore, questi valori di attivazione vengono utilizzati come una delle fonti numeriche per calcolare i gradienti, insieme ai gradienti calcolati finora lavorando all'indietro e ai pesi di collegamento. Come la propagazione diretta, la propagazione posteriore viene applicata per esempio, non funziona con valori medi o sommati. Solo quando tutti gli esempi sono stati elaborati, si lavora con i gradienti sommati o medi per il batch.

Questo vale anche per i livelli massimi del pool. Non solo sai quale era l'output dal livello di pool per ciascun esempio nel batch, ma puoi guardare il livello precedente e determinare quale input per il pool era il massimo.

Matematicamente, ed evitando la necessità di definire indici per strati e neuroni NN, la regola può essere espressa in questo modo

  • La funzione forward è m=mun'X(un',B)

  • Sappiamo Jm per alcune funzioni target J (nella rete neurale che sarà la funzione di perdita che vogliamo minimizzare, e stiamo assumendo che abbiamo già ripropagato su questo punto)

  • Vogliamo sapere Jun' e JB

  • Se un'>B

    • A livello locale , *m=un'. CosìJun'=Jm

    • A livello locale , *m non dipende da B. CosìJB=0

  • Perciò Jun'=Jm Se un'>B, altro Jun'=0

  • e JB=Jm Se B>un', altro JB=0

Quando la propagazione posteriore attraversa un livello di pool massimo, il gradiente viene elaborato per esempio e assegnato solo all'input del livello precedente che era il massimo. Gli altri input ottengono un gradiente zero. Quando questo viene raggruppato, non è diverso, viene solo elaborato per esempio, forse in parallelo. In un intero batch questo può significare che più di una, forse tutte, le attivazioni di input al pool massimo ottengono una parte del gradiente, ognuna da un diverso sottoinsieme di esempi nel batch.


* Localmente -> quando si apportano solo modifiche infinitesime a m.

** Tecnicamente, se un'=B esattamente allora abbiamo una discontinuità, ma in pratica possiamo ignorarlo senza problemi durante l'addestramento di una rete neurale.


3
Non sono sicuro di capirti. Quello che stai dicendo funziona quando fai il backprop dopo un singolo prop di andata. Ma quando si dispone di un batch, si propongono 100 campioni per calcolare una funzione di errore medio. L'intero punto di un batch è quello di essere in grado di produrre gradienti più precisi, e quindi si esegue una sola volta il backprop in base alla derivata della funzione di errore rispetto a W, al valore di errore medio trovato moltiplicato per il tasso di apprendimento. Quindi non è ancora chiaro come si calcoli la derivata della funzione max, quando ogni volta è stato selezionato un nodo diverso come massimo. Cosa mi sto perdendo?
Nadav B,

4
@NadavB: manca la sequenza di eventi. 1) Il lotto viene calcolato in avanti, articolo per articolo. 2) Il lotto viene retropropagato, articolo per articolo. 3) Prendi le medie per gradienti. 4) Applicare una fase di discesa gradiente (forse modificata da qualcosa come Adagrad o RMSProp). Quindi stai mettendo il passaggio 3 fuori sequenza e ti stai chiedendo come deselezionare i gradienti medi sul livello massimo del pool - ma non devi mai farlo, perché esegui il backprop di ciascun esempio singolarmente - successivamente aggreghi solo i risultati per il batch
Neil Slater

1
Perfetto. Lo hai chiarito ora.
Nadav B,

@NeilSlater La backpropagation viene eseguita solo articolo per articolo perché è necessario per il livello massimo del pool? In una MLP la media dell'errore dell'intero batch e quindi il calcolo del gradiente su quell'errore medio è identico al calcolo del gradiente per articolo e quindi alla regolazione dei parametri in base al gradiente medio * tasso di apprendimento, giusto? Tuttavia, il backpropagating dell'errore medio è molto più veloce del backpropagating di tutti i singoli errori e quindi l'applicazione degli aggiornamenti. Quindi, quando possibile, vorrai farlo in questo modo e solo per articolo, se necessario ... come per max pool. È giusto?
lo tolmencre,

@lotolmencre Ti sbagli nel calcolare l'errore medio su un batch. È necessario eseguire la propagazione posteriore individualmente, quindi sommare i gradienti alla fine. I calcoli del gradiente non funzioneranno correttamente altrimenti attraverso qualsiasi non linearità. Se vuoi saperne di più, ti preghiamo di porre una nuova domanda
Neil Slater,

2

Ho la stessa domanda, ma probabilmente lo capisco rivedendo il codice sorgente di Caffe.

Si prega di consultare il codice sorgente di Caffe:

riga 620 e 631 di questo codice.

Calcola la derivata di ciascun parametro aggiungendo la derivata (di questo parametro) di ciascun input, quindi lo divide per dimensione del batch.

Vedi anche la riga 137 di questo codice, ridimensiona semplicemente la derivata in 1 / iter_size, proprio come nella media.

Possiamo vedere che non esiste alcun trattamento speciale per il livello Max Pooling quando BP.

Per quanto riguarda il derivato di Max Pooling, vediamo di nuovo il codice sorgente di Caffe:

riga 272 di questo codice. Ovviamente, solo la derivata dell'elemento più grande è 1*top_diff, la derivata degli altri è 0*top_diff.

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.