Udostępnij przez


Normalizacja wsadowa

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

Parametry

  • input to dane wejściowe węzła normalizacji partii
  • scale jest parametrem ParameterTensor{} , który zawiera poznane czynniki skalowania składników (gamma termin w równaniu poniżej).
  • bias jest parametrem ParameterTensor{} , który przechowuje poznane odchylenie (beta termin). scale i bias muszą mieć te same wymiary, które muszą być równe input wymiarom w przypadku spatial = false map funkcji konwolucji wyjściowej lub w przypadku spatial = true.
  • runMean to średnia bieżąca, która jest używana podczas fazy oceny i może być również używana podczas trenowania. Należy przekazać parametrTensor{} o tych samych wymiarach co scale i bias, wartość początkowa 0 i learningRateMultiplier=0 ustawiona.
  • runVariance jest uruchomioną wariancją. Jest ona reprezentowana w taki sam sposób jak runMean.
  • spatial to flaga określająca, czy obliczyć średnią/var dla każdej funkcji w minibatch niezależnie, czy w przypadku warstw splotowych na mapę cech.
  • normalizationTimeConstant (wartość domyślna 0): stała czasowa obliczania średniej średniej i wariancji jako przefiltrowanej wersji statystyki wsadowej o niskim przebiegu. Uwaga: wartość domyślna zazwyczaj nie jest odpowiednia.
  • blendTimeConstant (wartość domyślna 0): umożliwia wygładzanie oszacowań wsadowych przy użyciu uruchomionych statystyk
  • epsilon jest stałą warunekatora dodaną do wariancji podczas obliczania odwrotnego odchylenia standardowego.
  • useCntkEngine (wartość domyślna: true): ustaw tę wartość na , false aby wybrać implementację cuDNN tylko z procesorem GPU

Wartość zwracana

Znormalizowane wsadowo input.

Opis

BatchNormalization implementuje technikę opisaną w artykule Normalizacja partii: przyspieszanie głębokiego trenowania sieci poprzez zmniejszenie wewnętrznej zmiany zmian (Sergey Ioffe, Christian Szegedy). Krótko mówiąc, normalizuje dane wyjściowe warstwy dla każdego minibatcha dla każdego wyjścia (funkcji) niezależnie i stosuje przekształcenia affine w celu zachowania reprezentacji warstwy. Oznacza to, że dla warstwy input:

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

gdzie gamma i beta są parametrami do trenowania.

mean i variance są szacowane na podstawie danych treningowych. W najprostszym przypadku są to średnia i wariancja bieżącego minibatcha podczas trenowania. Wywnioskowość jest używana zamiast tego długoterminowe oszacowanie.

Długoterminowe oszacowania to przefiltrowana niskoprzepustowo wersja statystyk minibatch, ze stałą czasu (w próbkach) podaną normalizationTimeConstant przez parametr . Wartość 0 oznacza, że nie będzie wygładzania wykładniczego, a średnia/wariancja będzie zawsze równa wartości ostatniej widocznej minibatch. Jest to często niepożądane. Zamiast tego zaleca się użycie wartości kilku tysięcy w tym miejscu. Otoka BatchNormalizationLayer{} ma wartość domyślną 5000.

Aby uzyskać więcej informacji na temat stałych czasu i wygładzania wykładniczego: https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant

Ponieważ statystyki minibatch mogą być hałaśliwy, CNTK umożliwia również użycie oszacowania MAP (maximum a-posteriori) podczas trenowania, w którym długotrwałe oszacowanie jest traktowane jako poprzednie. Waga poprzedniego jest kontrolowana blendTimeConstant przez parametr . Nie znaleziono jednak tego przydatnego do tej pory w naszych eksperymentach.

Należy pamiętać, że podczas wnioskowania CNTK ustawi obie stałe czasu automatycznie, tak aby używać tylko istniejącej średniej uruchomionej i że nie jest aktualizowana. Użytkownik nie wymaga jawnej akcji.

implementacja cuDNN

Domyślnie ta funkcja używa implementacji CNTK, która współdziała zarówno z procesorami GPU, jak i procesorami CPU. Możesz użyć implementacji cuDNN, która jest bardziej wydajna. Należy jednak pamiętać, że implementacja cuDNN nie obsługuje wszystkich opcji, a trenowanie wymaga procesora GPU (CNTK jednak zapewnia emulację procesora CPU na potrzeby wnioskowania, nawet jeśli wybrano implementację cuDNN).