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 batchscale
è 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
ebias
devono avere le stesse dimensioni che devono essere uguali alleinput
dimensioni in caso dispatial = false
o numero di mappe delle caratteristiche di convoluzione di output nel caso dispatial = 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 discale
ebias
, il valore iniziale 0 elearningRateMultiplier=0
impostare .runVariance
è la varianza in esecuzione. È rappresentato allo stesso modo dirunMean
.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 esecuzioneepsilon
è una costante condizionatore aggiunta alla varianza durante il calcolo della deviazione standard inversa.useCntkEngine
(impostazione predefinita: true): impostare questa opzione sufalse
per selezionare l'implementazione cuDNN solo GPU
Valore restituito
Oggetto normalizzato in input
batch.
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).