Teilen über


Batchnormalisierung

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

Parameter

  • input ist die Eingabe des Batch normalisierungsknotens
  • scale ist ein ParameterTensor{} , der die gelernten Komponentenskalierungsfaktoren (gamma Ausdruck in der folgenden Formel) enthält.
  • bias ist ein ParameterTensor{} , der die gelernte Verzerrung (beta Ausdruck) enthält. scale und bias muss dieselben Dimensionen aufweisen, die den input Abmessungen entsprechen müssen, falls die Anzahl der spatial = false Ausgabekonvolution-Featurezuordnungen im Fall von spatial = true.
  • runMean ist der laufende Mittelwert, der während der Evaluierungsphase verwendet wird und auch während der Schulung verwendet werden kann. Sie müssen einen ParameterTensor{} mit den gleichen Dimensionen scale wie und bias, Anfangswert 0 übergeben und learningRateMultiplier=0 festlegen.
  • runVariance ist die laufende Varianz. Es wird auf die gleiche Weise dargestellt wie runMean.
  • spatial ist ein Flag, das angibt, ob für jedes Feature in einem Minibatch unabhängig oder im Falle von konvolutionalen Layern pro Featurezuordnung mittel/var berechnet werden soll.
  • normalizationTimeConstant (Standard 0): Zeitkonstante für die Berechnung des Mittelwerts und der Varianz als gefilterte Version der Batchstatistik mit niedriger Übergabe. Hinweis: Der Standardwert ist in der Regel nicht das gewünschte.
  • blendTimeConstant (Standard 0): Ermöglicht eine reibungslose Batchschätzung mit den laufenden Statistiken
  • epsilon ist eine Bedingungskonstante, die der Varianz beim Berechnen der umgekehrten Standardabweichung hinzugefügt wird.
  • useCntkEngine (Standard: true): Legen Sie dies so fest, dass false die GPU-einzige CuDNN-Implementierung ausgewählt wird.

Rückgabewert

Die Batchnormalisierung input.

BESCHREIBUNG

BatchNormalization implementiert die in Papierbatch normalisierung beschriebene Technik: Beschleunigen der Tiefennetzwerkschulung durch Reduzierung der internen Covariate-Schicht (Sergey Ioffe, Christian Szegedy). Kurz gesagt, es normalisiert Layerausgaben für jede Minibatch für jede Ausgabe (Feature) unabhängig und wendet affine Transformation an, um die Darstellung der Ebene beizubehalten. Dies gilt für Schicht input:

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

wo gamma und beta sind trainierbare Parameter.

mean und variance werden von Schulungsdaten geschätzt. Im einfachsten Fall sind sie die Mittel- und Varianz des aktuellen Minibatchs während des Trainings. Stattdessen wird eine langfristige Schätzung verwendet.

Die langfristigen Schätzungen sind eine durch den Parameter angegebene normalizationTimeConstant Zeitkonstante (in Beispielen) eine version der Minibatchstatistik mit niedriger Pass-Filterung. Ein Wert der 0 Mittel bedeutet, dass es keine exponentielle Glättung gibt und die Mittel-/Varianz immer gleich denen des letzten gesehenen Minibatchs ist. Dies ist oft unerwünschter. Stattdessen wird empfohlen, hier einen Wert von ein paar Tausend zu verwenden. Der BatchNormalizationLayer{} Wrapper hat einen Standardwert von 5000.

Weitere Informationen zu Zeitkonstanten und exponentieller Glättung: https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant

Da Minibatchstatistiken laut sein können, ermöglicht CNTK auch die Verwendung einer MAP-Schätzung (maximum-a-posteriori) während der Schulung, bei der die laufende langfristige Schätzung als vorheriges verwendet wird. Die Gewichtung des Vorherigen wird durch den blendTimeConstant Parameter gesteuert. Dies wurde jedoch bisher in unseren Experimenten nicht nützlich gefunden.

Beachten Sie, dass CNTK beide Zeitkonstanten automatisch festlegen, sodass nur das vorhandene Ausführungsmittel verwendet wird und dass sie nicht aktualisiert wird. Es gibt keine explizite Aktion, die vom Benutzer benötigt wird.

cuDNN-Implementierung

Standardmäßig verwendet diese Funktion eine CNTK Implementierung, die sowohl mit GPUs als auch mit CPUs funktioniert. Sie können die CuDNN-Implementierung verwenden, die leistungsfähiger ist. Beachten Sie jedoch, dass die CuDNN-Implementierung nicht alle Optionen unterstützt, und die Schulung erfordert eine GPU (CNTK stellt jedoch eine CPU-Emulation bereit, auch wenn Sie die CuDNN-Implementierung auswählen).