Grafici computazionali
La backpropagation è implementata in framework di deep learning come Tensorflow, Torch, Theano, ecc., Utilizzando grafici computazionali. Più significativamente, la comprensione della propagazione all'indietro sui grafici computazionali combina diversi algoritmi e le sue variazioni come backprop nel tempo e backprop con pesi condivisi. Una volta che tutto è convertito in un grafo computazionale, sono ancora lo stesso algoritmo - solo indietro propagazione sui grafici computazionali.
Che cos'è il grafico computazionale
Un grafo computazionale è definito come un grafo diretto in cui i nodi corrispondono a operazioni matematiche. I grafici computazionali sono un modo per esprimere e valutare un'espressione matematica.
Ad esempio, ecco una semplice equazione matematica:
$$ p = x + y $$
Possiamo disegnare un grafico computazionale dell'equazione di cui sopra come segue.
Il grafico di calcolo sopra ha un nodo di addizione (nodo con segno "+") con due variabili di input xey e un output q.
Facciamo un altro esempio, leggermente più complesso. Abbiamo la seguente equazione.
$$ g = \ sinistra (x + y \ destra) \ ast z $$
L'equazione di cui sopra è rappresentata dal seguente grafico computazionale.
Grafici computazionali e backpropagation
Grafici computazionali e backpropagation, entrambi sono concetti fondamentali importanti nell'apprendimento profondo per l'addestramento delle reti neurali.
Passaggio in avanti
Forward pass è la procedura per valutare il valore dell'espressione matematica rappresentata dai grafici computazionali. Fare il passaggio in avanti significa che stiamo passando il valore dalle variabili nella direzione in avanti da sinistra (input) a destra dove si trova l'output.
Consideriamo un esempio dando un valore a tutti gli input. Supponiamo che i seguenti valori siano dati a tutti gli input.
$$ x = 1, y = 3, z = −3 $$
Dando questi valori agli input, possiamo eseguire il forward pass e ottenere i seguenti valori per gli output su ogni nodo.
Innanzitutto, usiamo il valore di x = 1 e y = 3, per ottenere p = 4.
Quindi usiamo p = 4 ez = -3 per ottenere g = -12. Andiamo da sinistra a destra, in avanti.
Obiettivi del passaggio all'indietro
Nel passaggio all'indietro, la nostra intenzione è di calcolare i gradienti per ogni input rispetto all'output finale. Questi gradienti sono essenziali per addestrare la rete neurale utilizzando la discesa del gradiente.
Ad esempio, desideriamo i seguenti gradienti.
Gradienti desiderati
$$ \ frac {\ partial x} {\ partial f}, \ frac {\ partial y} {\ partial f}, \ frac {\ partial z} {\ partial f} $$
Passaggio all'indietro (backpropagation)
Iniziamo il passaggio all'indietro trovando la derivata dell'output finale rispetto all'output finale (se stesso!). Pertanto, risulterà nella derivazione dell'identità e il valore è uguale a uno.
$$ \ frac {\ partial g} {\ partial g} = 1 $$
Il nostro grafico computazionale ora appare come mostrato di seguito:
Successivamente, eseguiremo il passaggio all'indietro attraverso l'operazione "*". Calcoleremo i gradienti in pe z. Poiché g = p * z, sappiamo che -
$$ \ frac {\ partial g} {\ partial z} = p $$
$$ \ frac {\ partial g} {\ partial p} = z $$
Conosciamo già i valori di ze p dal passaggio in avanti. Quindi, otteniamo -
$$ \ frac {\ partial g} {\ partial z} = p = 4 $$
e
$$ \ frac {\ partial g} {\ partial p} = z = -3 $$
Vogliamo calcolare i gradienti in x e y -
$$ \ frac {\ partial g} {\ partial x}, \ frac {\ partial g} {\ partial y} $$
Tuttavia, vogliamo farlo in modo efficiente (sebbene x e g siano solo due salti di distanza in questo grafico, immagina che siano davvero lontani l'uno dall'altro). Per calcolare questi valori in modo efficiente, useremo la regola della differenziazione della catena. Dalla regola della catena, abbiamo -
$$ \ frac {\ partial g} {\ partial x} = \ frac {\ partial g} {\ partial p} \ ast \ frac {\ partial p} {\ partial x} $$
$$ \ frac {\ partial g} {\ partial y} = \ frac {\ partial g} {\ partial p} \ ast \ frac {\ partial p} {\ partial y} $$
Ma sappiamo già che dg / dp = -3, dp / dx e dp / dy sono facili poiché p dipende direttamente da x e y. Abbiamo -
$$ p = x + y \ Rightarrow \ frac {\ partial x} {\ partial p} = 1, \ frac {\ partial y} {\ partial p} = 1 $$
Quindi, otteniamo -
$$ \ frac {\ partial g} {\ partial f} = \ frac {\ partial g} {\ partial p} \ ast \ frac {\ partial p} {\ partial x} = \ left (-3 \ right) .1 = -3 $$
Inoltre, per l'ingresso y -
$$ \ frac {\ partial g} {\ partial y} = \ frac {\ partial g} {\ partial p} \ ast \ frac {\ partial p} {\ partial y} = \ left (-3 \ right) .1 = -3 $$
La ragione principale per farlo al contrario è che quando abbiamo dovuto calcolare il gradiente in x, abbiamo usato solo valori già calcolati e dq / dx (derivata dell'output del nodo rispetto all'input dello stesso nodo). Abbiamo utilizzato le informazioni locali per calcolare un valore globale.
Passaggi per addestrare una rete neurale
Segui questi passaggi per addestrare una rete neurale:
Per il punto dati x nel set di dati, passiamo in avanti con x come input e calcoliamo il costo c come output.
Passiamo all'indietro a partire da c e calcoliamo i gradienti per tutti i nodi nel grafico. Ciò include i nodi che rappresentano i pesi della rete neurale.
Quindi aggiorniamo i pesi facendo W = W - tasso di apprendimento * gradienti.
Ripetiamo questo processo fino a quando non vengono soddisfatti i criteri di arresto.