Apache MXNet - Pacchetti Python

In questo capitolo impareremo a conoscere i pacchetti Python disponibili in Apache MXNet.

Pacchetti MXNet Python importanti

MXNet ha i seguenti importanti pacchetti Python di cui discuteremo uno per uno:

  • Autograd (differenziazione automatica)

  • NDArray

  • KVStore

  • Gluon

  • Visualization

Per prima cosa iniziamo con Autograd Pacchetto Python per Apache MXNet.

Autograd

Autograd sta per automatic differentiationutilizzato per propagare di nuovo i gradienti dalla metrica di perdita a ciascuno dei parametri. Insieme alla backpropagation utilizza un approccio di programmazione dinamico per calcolare in modo efficiente i gradienti. Viene anche chiamata differenziazione automatica in modalità inversa. Questa tecnica è molto efficiente nelle situazioni "fan-in" in cui molti parametri influenzano una singola metrica di perdita.

Cosa sono i gradienti?

I gradienti sono i fondamenti del processo di formazione della rete neurale. Fondamentalmente ci dicono come modificare i parametri della rete per migliorarne le prestazioni.

Come sappiamo, le reti neurali (NN) sono composte da operatori come somme, prodotto, convoluzioni, ecc. Questi operatori, per i loro calcoli, utilizzano parametri come i pesi nei kernel di convoluzione. Dovremmo trovare i valori ottimali per questi parametri e gradienti ci mostrano la strada e ci portano anche alla soluzione.

Ci interessa l'effetto della modifica di un parametro sulle prestazioni della rete e le pendenze ci dicono di quanto una data variabile aumenta o diminuisce quando cambiamo una variabile da cui dipende. La performance viene solitamente definita utilizzando una metrica di perdita che cerchiamo di ridurre al minimo. Ad esempio, per la regressione potremmo provare a minimizzareL2 perdita tra le nostre previsioni e il valore esatto, mentre per la classificazione potremmo minimizzare il cross-entropy loss.

Una volta calcolato il gradiente di ogni parametro con riferimento alla perdita, possiamo quindi utilizzare un ottimizzatore, come la discesa del gradiente stocastico.

Come calcolare i gradienti?

Abbiamo le seguenti opzioni per calcolare i gradienti:

  • Symbolic Differentiation- La prima opzione è la differenziazione simbolica, che calcola le formule per ogni gradiente. Lo svantaggio di questo metodo è che porterà rapidamente a formule incredibilmente lunghe man mano che la rete diventa più profonda e gli operatori diventano più complessi.

  • Finite Differencing- Un'altra opzione è quella di utilizzare la differenziazione finita che prova leggere differenze su ogni parametro e vedere come risponde la metrica di perdita. Lo svantaggio di questo metodo è che sarebbe computazionalmente costoso e potrebbe avere una scarsa precisione numerica.

  • Automatic differentiation- La soluzione agli inconvenienti dei metodi di cui sopra consiste nell'utilizzare la differenziazione automatica per propagare i gradienti dalla metrica di perdita a ciascuno dei parametri. La propagazione ci consente un approccio di programmazione dinamico per calcolare in modo efficiente i gradienti. Questo metodo è anche chiamato differenziazione automatica in modalità inversa.

Differenziazione automatica (autograd)

Qui capiremo in dettaglio il funzionamento di autograd. Fondamentalmente funziona in due fasi seguenti:

Stage 1 - Questa fase è chiamata ‘Forward Pass’di formazione. Come suggerisce il nome, in questa fase crea il record dell'operatore utilizzato dalla rete per fare previsioni e calcolare la metrica di perdita.

Stage 2 - Questa fase è chiamata ‘Backward Pass’di formazione. Come suggerisce il nome, in questa fase funziona a ritroso attraverso questo disco. Andando a ritroso, valuta le derivate parziali di ogni operatore, fino al parametro di rete.

Vantaggi di autograd

Di seguito sono riportati i vantaggi dell'utilizzo della differenziazione automatica (autograd):

  • Flexible- La flessibilità, che ci offre quando definiamo la nostra rete, è uno degli enormi vantaggi dell'utilizzo di autograd. Possiamo cambiare le operazioni ad ogni iterazione. Questi sono chiamati i grafici dinamici, che sono molto più complessi da implementare in framework che richiedono grafici statici. Autograd, anche in questi casi, sarà comunque in grado di retropropagare correttamente i gradienti.

  • Automatic- Autograd è automatico, cioè le complessità della procedura di backpropagation vengono risolte per te. Dobbiamo solo specificare quali gradienti siamo interessati a calcolare.

  • Efficient - Autogard calcola i gradienti in modo molto efficiente.

  • Can use native Python control flow operators- Possiamo usare gli operatori nativi del flusso di controllo di Python come if condition e while loop. L'autograd sarà ancora in grado di retropropagare i gradienti in modo efficiente e corretto.

Utilizzo di autograd in MXNet Gluon

Qui, con l'aiuto di un esempio, vedremo come possiamo utilizzare autograd in MXNet Gluon.

Esempio di implementazione

Nell'esempio seguente, implementeremo il modello di regressione con due livelli. Dopo l'implementazione, utilizzeremo autograd per calcolare automaticamente il gradiente della perdita con riferimento a ciascuno dei parametri di peso -

Per prima cosa importa l'autogrard e gli altri pacchetti richiesti come segue:

from mxnet import autograd
import mxnet as mx
from mxnet.gluon.nn import HybridSequential, Dense
from mxnet.gluon.loss import L2Loss

Ora, dobbiamo definire la rete come segue:

N_net = HybridSequential()
N_net.add(Dense(units=3))
N_net.add(Dense(units=1))
N_net.initialize()

Ora dobbiamo definire la perdita come segue:

loss_function = L2Loss()

Successivamente, dobbiamo creare i dati fittizi come segue:

x = mx.nd.array([[0.5, 0.9]])
y = mx.nd.array([[1.5]])

Ora siamo pronti per il nostro primo passaggio in avanti attraverso la rete. Vogliamo che autograd registri il grafico computazionale in modo da poter calcolare i gradienti. Per questo, dobbiamo eseguire il codice di rete nell'ambito diautograd.record contesto come segue -

with autograd.record():
   y_hat = N_net(x)
   loss = loss_function(y_hat, y)

Ora siamo pronti per il passaggio all'indietro, che iniziamo chiamando il metodo all'indietro sulla quantità di interesse. La quantità di interesse nel nostro esempio è la perdita perché stiamo cercando di calcolare il gradiente di perdita con riferimento ai parametri -

loss.backward()

Ora abbiamo gradienti per ogni parametro della rete, che verranno utilizzati dall'ottimizzatore per aggiornare il valore del parametro per migliorare le prestazioni. Controlliamo i gradienti del 1 ° livello come segue:

N_net[0].weight.grad()

Output

L'output è il seguente:

[[-0.00470527 -0.00846948]
[-0.03640365 -0.06552657]
[ 0.00800354 0.01440637]]
<NDArray 3x2 @cpu(0)>

Esempio di implementazione completo

Di seguito è riportato l'esempio di implementazione completo.

from mxnet import autograd
import mxnet as mx
from mxnet.gluon.nn import HybridSequential, Dense
from mxnet.gluon.loss import L2Loss
N_net = HybridSequential()
N_net.add(Dense(units=3))
N_net.add(Dense(units=1))
N_net.initialize()
loss_function = L2Loss()
x = mx.nd.array([[0.5, 0.9]])
y = mx.nd.array([[1.5]])
with autograd.record():
y_hat = N_net(x)
loss = loss_function(y_hat, y)
loss.backward()
N_net[0].weight.grad()