Backpropagation nelle reti neurali
introduzione
In questa storia, spiegherò come una rete neurale può essere addestrata con la retropropagazione. Nella storia precedente è stato introdotto l'algoritmo di discesa del gradiente, ma non abbiamo considerato come calcolare il gradiente di una funzione a un milione di variabili. Prima di derivare le principali equazioni della retropropagazione, spiegherò brevemente come i neuroni in diversi strati sono collegati tra loro e introdurrò anche la notazione per le variabili.
Rete neurale
Nella Figura 1 è possibile vedere un NN completamente connesso con quattro livelli: uno di input, due nascosti e uno di output. Se utilizziamo questa rete per riconoscere le immagini, l'immagine di input verrà inviata al livello di input sotto forma di vettore. Se inizializziamo tutte le variabili in modo casuale, i risultati ottenuti nel livello di output non classificheranno gli input in modo appropriato. Per questo motivo, è necessario regolare queste variabili in modo tale che la rete classifichi gli input di conseguenza. Per semplicità, considereremo la seguente rete, che contiene solo quattro strati. La notazione per i pesi e le distorsioni utilizzate in questa storia si riflette nella Figura 1.
Per prima cosa, consideriamo la relazione tra l'output del neurone corrente e quelli dello strato precedente. La seguente equazione rappresenta la parte principale di questa dipendenza.
Ad esempio, per il 2° neurone del 3° strato, possiamo scrivere questa equazione come segue:
Questi valori z vengono calcolati per ciascun neurone e infine viene applicata loro una funzione di attivazione per produrre l'output.
Un esempio comunemente usato di una funzione di attivazione è la funzione sigmoidea, che aumenta la capacità di calcolo di una rete neurale aggiungendo non linearità. Infine, l'output del neurone j-esimo dello strato l sarà indicato come segue:
dove sigma è una funzione di attivazione. Tieni presente che la funzione di attivazione viene applicata a partire dal secondo livello, incluso il livello di output. Pertanto, gli output del livello di input ripeteranno semplicemente gli input senza attivazione.
Quando iniziamo con pesi e pregiudizi casuali, la nostra rete produrrà numeri a livello di output che sono lontani da ciò che vogliamo. Fortunatamente, possiamo aggiustare gradualmente tutti i pesi e le distorsioni per classificare accuratamente i dati.
Ora introdurrò la funzione di costo e spiegherò chiaramente perché minimizzare questa funzione produce una migliore classificazione. La funzione di costo totale di NN è data dalla seguente formula:
Dove:
x è il vettore di input
y_a è un vettore di output effettivo (che è una funzione del vettore di input, tutti i pesi e le distorsioni)
y_d è il vettore di output desiderato (che è fissato per ogni vettore di input x.)
n è il numero totale di vettori di input (ad esempio il numero di immagini)
Poiché ogni termine nella somma non è negativo, minimizzare il costo totale equivale a minimizzare ogni termine, e minimizzare ogni termine può essere ottenuto solo avvicinando la produzione effettiva a quella desiderata. Un metodo per minimizzare la funzione è l'algoritmo di discesa del gradiente. Tuttavia l'algoritmo del gradiente non ci dice come calcolare il gradiente per una funzione con migliaia di variabili. Per questo motivo, considereremo la retropropagazione in questa sezione.
È chiaro che la funzione di costo è la somma di diverse funzioni. Pertanto, il gradiente dell'intera funzione di costo può essere trovato aggiungendo i gradienti di ciascun termine nella somma. Per questo motivo, proviamo a mostrare la nostra funzione di costo come segue:
Dove
La formula sopra è in forma vettoriale, con y_a e y_d che rappresentano rispettivamente i vettori effettivo e desiderato. Nella forma dei componenti, il costo può essere mostrato come:
Poiché y_ai rappresenta il livello di output di NN, possiamo riscrivere il costo per la Figura 1 come segue:
È chiaro che per ogni vettore di input x, abbiamo una funzione di costo associata indicata con C_x. La media di queste funzioni di costo è pari al costo totale di NN. Pertanto, la media dei gradienti di questi costi ci darà il gradiente dell'intero costo.
Ora considereremo come possiamo ottenere il gradiente (in altre parole, tutte le derivate parziali rispetto a pesi e distorsioni in una rete) di C_x utilizzando l'algoritmo di backpropagation.
Prima di iniziare, introduciamo una funzione di errore che verrà calcolata per ciascun neurone e semplificheremo il nostro compito durante il processo di ricerca delle derivate parziali. Definiremo un errore per ogni neurone come segue:
Calcoliamo prima l'errore di cui sopra per il livello di output (in altre parole, il 4° livello). Secondo le seguenti formule:
L'errore per il livello di output può essere calcolato come segue, che è la normale regola della catena:
Successivamente, dimostriamo come calcolare l'errore per i neuroni nel terzo strato. Dalla nostra rete neurale, è chiaro che zj³ ha un impatto su tutti gli output del livello successivo, vale a dire z1⁴, z2⁴,z3⁴ e z4⁴ che a loro volta influenzano la funzione di costo. Pertanto, supponendo che zj³ sia una variabile indipendente, la regola della catena può essere applicata come segue:
Dalla definizione:
e ∂zk⁴/∂zj³ può essere calcolato come segue utilizzando l'equazione per zk⁴:
Infine, sostituendo queste derivate parziali nell'equazione per gli errori nel terzo strato, otteniamo il seguente risultato:
In modo simile, gli errori del secondo strato saranno:
La formula generale per l'errore nel neurone j-esimo dello strato l sarà indicata come segue:
Finora, sembra che qualsiasi errore nel livello tre dipenda da quelli nel livello quattro, proprio come quelli nel livello due dipendono dai valori di errore nel livello tre. Calcolando l'errore per il livello di output e propagandolo indietro, possiamo effettivamente trovare il gradiente della funzione di costo. (che verrà spiegato in seguito). Il nome "backpropagation" in realtà deriva da questa dipendenza unidirezionale dell'errore tra i neuroni degli strati adiacenti.
Con gli errori noti, vediamo ora come possiamo calcolare le derivate parziali della funzione di costo rispetto a tutte le incognite (pesi e distorsioni). Iniziare con:
Sappiamo che per lo strato l, tutti i pesi wjk^l connessi al neurone j-esimo dello strato l influenzano direttamente zj^l, che a sua volta ha un impatto sulla funzione di costo. Pertanto, possiamo applicare la regola della catena come segue:
Dalla definizione di errore:
e l'altro termine della somma può essere calcolato come segue:
Sostituendo queste equazioni, otteniamo la seguente formula per le derivate parziali della funzione di costo rispetto a tutti i pesi:
Ora calcoliamo le derivate parziali rispetto ai bias:
In modo simile, un cambiamento nella distorsione j-esima dello strato l influisce direttamente su zj^l che a sua volta ha un impatto sulla funzione di costo. Pertanto, secondo la regola della catena:
Dove:
e
Dunque:
Conclusione
In questa storia, abbiamo discusso di come viene costruita una rete neurale attraverso i neuroni collegati ai pesi. Abbiamo anche introdotto la notazione ampiamente utilizzata per nominare pesi e distorsioni. La relazione tra i livelli di output e di input è stata spiegata attraverso l'introduzione di operazioni di somma ponderata tra i livelli e una funzione di attivazione applicata ad essi.
Dopo aver definito la funzione di errore, che viene calcolata per tutti i neuroni a partire dallo strato di output, abbiamo scoperto che l'errore può essere calcolato in modo ricorsivo a partire dallo strato di output. E infine, supponendo che gli errori fossero calcolati, abbiamo derivato le equazioni per le derivate parziali per ottenere il gradiente della funzione di costo.
Ora, con diverse frasi, vorrei riassumere l'algoritmo di back-propagation:
Passaggio 1: inizializzazione della rete con pesi e distorsioni casuali (ad esempio, in un intervallo [0–1])
Passaggio 2: per ogni vettore di input x, calcolare i valori z e gli output (a) di tutti i neuroni in una rete. (questo processo è chiamato propagazione in avanti). (Eq 1,2)
Passaggio 3: calcolare gli errori per ciascun neurone nel livello di output e propagarli indietro (utilizzando gli errori dal livello di output, calcolare gli errori per il livello precedente e continuare questo processo in modo ricorsivo). (questo è il processo di backpropagation). (Eq 3)
Passaggio 4: utilizzando i risultati ottenuti per errori e output, calcolare tutte le derivate parziali (vettore gradiente). (Eq 4,5)
Passaggio 5: utilizzando il gradiente ottenuto, eseguire un'iterazione in Gradient Descent Algorithm (fare un passaggio verso il minimo locale della funzione di costo)

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































