Condividi tramite


Normalizzazione batch

BatchNormalization(input, scale, bias, runMean, runVariance, spatial,
                   normalizationTimeConstant = 0,
                   blendTimeConstant = 0, epsilon = 0.00001, useCntkEngine = true)

Parametri

  • input è l'input del nodo di normalizzazione batch
  • scale è un ParameterTensor{} che contiene i fattori di ridimensionamento componenti per componente appresi (gamma termine nell'equazione seguente).
  • bias è un ParameterTensor{} che contiene la distorsione appresa (beta termine). scale e bias devono avere le stesse dimensioni che devono essere uguali alle input dimensioni in caso di spatial = false o numero di mappe delle caratteristiche di convoluzione di output nel caso di spatial = true.
  • runMean è la media in esecuzione usata durante la fase di valutazione e può essere usata anche durante il training. È necessario passare un ParameterTensor{} con le stesse dimensioni di scale e bias, il valore iniziale 0 e learningRateMultiplier=0 impostare .
  • runVariance è la varianza in esecuzione. È rappresentato allo stesso modo di runMean.
  • spatial è un flag che specifica se calcolare media/var per ogni funzionalità in un minibatch in modo indipendente o, in caso di livelli convoluzionali, per mappa delle funzionalità.
  • normalizationTimeConstant (valore predefinito 0): costante temporale per il calcolo della media in esecuzione della media e della varianza come versione filtrata a basso passaggio delle statistiche batch. Nota: l'impostazione predefinita non è in genere quella desiderata.
  • blendTimeConstant (impostazione predefinita 0): consente di uniformare le stime batch con le statistiche in esecuzione
  • epsilon è una costante condizionatore aggiunta alla varianza durante il calcolo della deviazione standard inversa.
  • useCntkEngine (impostazione predefinita: true): impostare questa opzione su false per selezionare l'implementazione cuDNN solo GPU

Valore restituito

Oggetto normalizzato in inputbatch.

Descrizione

BatchNormalization implementa la tecnica descritta in Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (Sergey Ioffe, Christian Szegedy). In breve, normalizza gli output del livello per ogni minibatch per ogni output (funzionalità) in modo indipendente e applica la trasformazione affine per mantenere la rappresentazione del livello. Vale a dire, per il livello input:

m = mean (input)
var = variance (input)
inputNorm = (input - mean)/sqrt (epsilon + var)
output = gamma * inputNorm + beta

dove gamma e beta sono parametri sottoponibili a training.

mean e variance vengono stimati dai dati di training. Nel caso più semplice, sono la media e la varianza del minibatch corrente durante il training. Nell'inferenza viene invece usata una stima a lungo termine.

Le stime a lungo termine sono una versione filtrata a basso passaggio delle statistiche di minibatch, con la costante temporale (in campioni) specificata dal normalizationTimeConstant parametro . Un valore indica 0 che non ci sarà un smoothing esponenziale e la varianza media/varianza in esecuzione sarà sempre uguale a quelle dell'ultimo minibatch visto. Questo è spesso indesiderato. È invece consigliabile usare un valore di poche migliaia qui. Il BatchNormalizationLayer{} wrapper ha un valore predefinito di 5000.

Per altre informazioni sulle costanti temporali e sull'smoothing esponenziale: https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant

Poiché le statistiche di minibatch possono essere rumorose, CNTK consente anche di usare una stima MAP (massimo a posteriori) durante il training, in cui la stima a lungo termine in esecuzione viene presa come precedente. Il peso del precedente è controllato dal blendTimeConstant parametro . Tuttavia, questo non è stato trovato utile finora nei nostri esperimenti.

Si noti che durante l'inferenza, CNTK imposterà automaticamente entrambe le costanti temporali in modo che usino solo la media in esecuzione esistente e che non venga aggiornata. Non è necessaria alcuna azione esplicita da parte dell'utente.

Implementazione cuDNN

Per impostazione predefinita, questa funzione usa un'implementazione CNTK che funziona con GPU e CPU. È possibile scegliere di usare l'implementazione cuDNN, che è più efficiente. Si noti, tuttavia, che l'implementazione cuDNN non supporta tutte le opzioni e il training richiede una GPU (CNTK tuttavia fornisce un'emulazione della CPU per l'inferenza anche se si seleziona l'implementazione cuDNN).