Delen via


Batchnormalisatie

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

Parameters

  • input is de invoer van het batchnormalisatieknooppunt
  • scale is een ParameterTensor{} die de geleerde factoren voor componentgewijze schaalaanpassing bevat (gamma term in de onderstaande vergelijking).
  • bias is een ParameterTensor{} die de geleerde bias (beta term) bevat. scale en bias moet dezelfde dimensies hebben die gelijk moeten zijn aan de input dimensies in het geval van spatial = false of het aantal functietoewijzingen voor uitvoerconvolution in het geval van spatial = true.
  • runMean is het actieve gemiddelde dat wordt gebruikt tijdens de evaluatiefase en kan ook tijdens de training worden gebruikt. U moet een ParameterTensor{} doorgeven met dezelfde dimensies als scale en bias, initiële waarde 0 en learningRateMultiplier=0 instellen.
  • runVariance is de actieve variantie. Het wordt op dezelfde manier weergegeven als runMean.
  • spatial is een vlag waarmee wordt aangegeven of voor elke functie in een minibatch afzonderlijk moet worden berekend of, in geval van convolutionele lagen, per functieoverzicht.
  • normalizationTimeConstant (standaard 0): tijdconstante voor het berekenen van het gemiddelde gemiddelde en de variantie als een gefilterde versie met lage pass van de batchstatistieken. Opmerking: de standaardwaarde is meestal niet wat u wilt.
  • blendTimeConstant (standaard 0): maakt het mogelijk om batchschattingen soepel te maken met de actieve statistieken
  • epsilon is een conditionerconstante toegevoegd aan de variantie bij het berekenen van de inverse standaarddeviatie.
  • useCntkEngine (standaard: true): stel dit in om false de CUDNN-implementatie met GPU te selecteren

Retourwaarde

De batchgenormaliseerd input.

Description

BatchNormalization implementeert de techniek die wordt beschreven in paper Batch Normalization: Accelerating Deep Network Training by Reduce Internal Covariate Shift (Sergey Ioffe, Christian Szegedy). Kortom, het normaliseert laaguitvoer voor elke minibatch voor elke uitvoer (functie) onafhankelijk en past affine transformatie toe om de weergave van de laag te behouden. Dat wil wel, voor laag input:

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

waar gamma en beta trainbare parameters zijn.

mean en variance worden geschat op basis van trainingsgegevens. In het eenvoudigste geval zijn ze het gemiddelde en de variantie van de huidige minibatch tijdens de training. In deductie wordt in plaats daarvan een schatting op lange termijn gebruikt.

De schattingen voor de lange termijn zijn een laag-pass-gefilterde versie van de minibatch-statistieken, met de tijdconstante (in steekproeven) gegeven door de normalizationTimeConstant parameter. Een waarde van 0 de middelen zal er geen exponentiële afvlakking en lopende gemiddelde/variantie altijd gelijk zijn aan die van de laatst geziene minibatch. Dit is vaak ongewenst. In plaats daarvan is het raadzaam om hier een waarde van een paar duizend te gebruiken. De BatchNormalizationLayer{} wrapper heeft een standaardwaarde van 5000.

Voor meer informatie over tijdconstanten en exponentieel gladmaken: https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant

Omdat minibatchstatistieken luidruchtig kunnen zijn, kan CNTK ook een MAP-schatting (maximum-a-posteriori) gebruiken tijdens de training, waarbij de lopende langetermijnraming wordt genomen als de vorige. Het gewicht van de vorige wordt bepaald door de blendTimeConstant parameter. Dit is echter tot nu toe niet nuttig gevonden in onze experimenten.

Houd er rekening mee dat tijdens deductie CNTK beide tijdconstanten automatisch instelt, zodat alleen het bestaande actieve gemiddelde wordt gebruikt en dat deze niet wordt bijgewerkt. De gebruiker heeft geen expliciete actie nodig.

cuDNN-implementatie

Deze functie maakt standaard gebruik van een CNTK-implementatie die werkt met zowel GPU's als CPU's. U kunt ervoor kiezen om de cuDNN-implementatie te gebruiken, die beter presteert. Houd er echter rekening mee dat de cuDNN-implementatie niet alle opties ondersteunt, en training vereist een GPU (CNTK echter wel een CPU-emulatie biedt voor deductie, zelfs als u de cuDNN-implementatie selecteert).