Come velocizzare il training delle reti neurali

APZero | Alessandro Padrin
4 min readAug 21, 2017

In questi giorni ho potuto sperimentare una tecnica, chiamata Batch Normalization, proposta nel 2015 da Sergey Ioffe e Christian Szegedy, per velocizzare il training delle reti neurali e migliorarne le performance: i risultati sono incredibili !

L’intuizione da cui nasce la BN è abbastanza semplice: il training delle reti neurali viene rallentano da un fenomeno noto come internal covariate shift.

Ovvero, durante la fase di training, i parametri di ogni sub-strato della rete neurale vengono ottimizzati, affinchè l’errore finale prodotto dalla rete sia minimizzato, iterazione dopo iterazione; ad ogni iterazione, dunque, l’output di ogni sub-strato (che è l’input del sub-strato successivo) varia. Con internal covariate shift ci si riferisce proprio al fatto che ogni strato della rete, ad ogni iterazione, viene esposto ad un input completamente diverso rispetto all’iterazione precedente.

Il cambiamento degli input ad ogni strato rappresenta un problema perchè gli strati della rete devono continuamente adattarsi ad una nuova distribuzione dei valori di ingresso, quindi, per migliorare la fase di training, occorre fissare questa distribuzione.

La soluzione consiste nel normalizzare gli input della rete ad ogni sub-strato della rete stessa (viene chiamata Batch Normalization perchè media e varianza sono calcolati sui valori del batch/gruppo corrente di input).

Vantaggi?

  • Training della rete più veloce
  • Si possono utilizzare tassi di apprendimento più alti
  • L’inizializzazione dei pesi della rete può essere fatta con meno cautela
  • Le funzioni di attivazione quali Sigmoide e Relu sono utilizzabili anche con reti maggiormente profonde
  • Fornisce una sorta di regolarizzazione aggiuntiva e potrebbe ridurre la necessità di Dropout
  • Miglioramento delle Performance in generale

Personalmente sono rimasto folgorato dall’effettività della tecnica e, nei prossimi post, pubblicherò il codice che ho utilizzato per implementare la BN in Tensorflow insieme ai risultati ottenuti.

Per implementarla:

  • si trova il valore medio per il batch corrente, ovvero il valore medio prodotto da un particolare sub-strato della rete, prima di passare dalla funzione di attivazione non-lineare, quindi μB
  • si trova la varianza per il batch corrente, σB²
  • si normalizza il valore con l’equazione

Quindi, ad ogni valore si sottrae la media e si divide per una deviazione standard a cui si aggiunge il valore ϵ (epsilon)

Il valore ϵ è una costante positiva, ad esempio 0.001, che conferisce maggiore stabilità numerica (evita divisioni per zero) e incrementa, di poco, la varianza per ogni batch. Incrementare la varianza ha lo scopo di tenere in considerazione che la varianza della popolazione è maggiore di ogni campione preso dalla popolazione stessa.

Il valore normalizzato viene poi moltiplicato per Gamma a sommato al parametro Beta, entrambi parametri che la rete apprenderà in fase di training:

y è il valore normalizzato prodotto da ogni sub-strato della rete che passerà attraverso la funzione di attivazione, quali Sigmoide, Relu, Tanh ecc ecc.

Durante il training il gradiente dovrà propagarsi a ritroso (backpropagation) attraverso questa trasformazione, affinchè Beta e Gamma ricevano il segnale di errore e vengano ottimizzati.

La fase di inferenza, rispetto alla fase di training, presenta alcune differenze:

la rete, infatti, non viene esposta ad un batch di input ma ad un solo valore di input, per il quale dovrà produrre un output.

Se utilizzassimo la medesima tecnica applicata durante il training dovremmo calcolare media e varianza su un singolo valore e non si produrrebbe quindi nessun risultato sensato.

Per supearare questo problema, la rete, durante la fase di testing, normalizza i valori di input utilizzando media e varianza stimati durante la fase di training.

La Batch normalization si può utilizzare su reti feed forward, come su reti convoluzionali e reti ricorrenti.

Per le reti ricorrenti, lstm, gru o vanilla, media e varianza vengono calcolate per ogni step di tempo anzichè per ogni strato.

Per le reti convoluzionali media e varianza vengono calcolate per ogni filtro.

Lascio ad un post successivo l’implementazione della BN in tensorflow.

--

--

APZero | Alessandro Padrin

Founder @icarex.ai | Founder @APZero | Ex AI Scientist @Kearney, @Accenture, @NTTData | Ex Founder @IRA3D Printers