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 = m a x ( a , b )
Sappiamo ∂J∂m 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 ∂J∂un' e ∂J∂B
Se a > b
A livello locale , *m = a. Così∂J∂un'=∂J∂m
A livello locale , *m non dipende da B. Così∂J∂B= 0
Perciò ∂J∂un'=∂J∂m Se a > b, altro ∂J∂un'= 0
e ∂J∂B=∂J∂m Se b > a, altro ∂J∂B= 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 a = b esattamente allora abbiamo una discontinuità, ma in pratica possiamo ignorarlo senza problemi durante l'addestramento di una rete neurale.