Sdílet prostřednictvím


Normalizace dávky

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

Parametry

  • input je vstup uzlu dávkové normalizace.
  • scale je parametrtensor{} , který obsahuje naučené faktory škálování v komponentách (gamma termín v následující rovnici).
  • bias je parametrtensor{} , který obsahuje naučené předsudky (beta termín). scale a bias musí mít stejné rozměry, které se musí rovnat input dimenzím v případě spatial = false nebo počtu výstupních konvolučních map v případě spatial = true.
  • runMean je průběžný průměr, který se používá během fáze vyhodnocení a může se použít i během trénování. ParametrTensor{} musíte předat se stejnými dimenzemi jako scale a bias, počáteční hodnota 0 a learningRateMultiplier=0 nastavit.
  • runVariance je spuštěná odchylka. Je reprezentován stejným způsobem jako runMean.
  • spatial je příznak, který určuje, zda se má vypočítat průměr nebo var pro každou funkci v minibatchu nezávisle nebo v případě konvolučních vrstev na mapě funkcí.
  • normalizationTimeConstant (výchozí hodnota 0): časová konstanta pro výpočet průměrného průměru a odchylky jako vyfiltrované verze dávkové statistiky s nízkým průchodem. Poznámka: Výchozí hodnota obvykle není to, co chcete.
  • blendTimeConstant (výchozí 0): umožňuje hladké odhady dávek se spuštěnými statistikami.
  • epsilon je kondiční konstanta přidaná k rozptylu při výpočtu inverzní směrodatné odchylky.
  • useCntkEngine (výchozí hodnota: true): Nastavte ji tak, aby false se vybrala implementace jen pro GPU cuDNN.

Vrácená hodnota

Dávkové normalizované input.

Description

BatchNormalization implementuje techniku popsanou v dávkové normalizaci: Zrychlení hlubokého síťového trénování snížením interního kovariantového posunu (Sergey Ioffe, Christian Szegedy). Stručně řečeno, normalizuje výstupy vrstvy pro každý minibatch pro každý výstup (funkce) nezávisle a použije affine transformace pro zachování reprezentace vrstvy. To znamená, že pro vrstvu input:

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

kde gamma a beta jsou vytrénovatelné parametry.

mean a variance odhadují se z trénovacích dat. V nejjednodušším případě jsou střední hodnotou a odchylkou aktuálního minibatchu během trénování. Odvozováním se místo toho použije dlouhodobý odhad.

Dlouhodobé odhady představují nízko pass-filtrovanou verzi statistiky minibatchu s časovou konstantou (v ukázkách) danou parametrem normalizationTimeConstant . Hodnota 0 znamená, že nedojde k exponenciálnímu vyhlazování a spuštění střední hodnoty a rozptylu bude vždy rovna hodnotám posledního viditelného minibatchu. To je často nežádoucí. Místo toho se doporučuje použít hodnotu pár tisíc. Obálka BatchNormalizationLayer{} má výchozí hodnotu 5000.

Další informace o časových konstantách a exponenciálním vyhlazování: https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant

Vzhledem k tomu, že minibatch statistiky mohou být hlučné, CNTK také umožňuje použít odhad MAP (maximum-a-posteriori) během trénování, kde se průběžný dlouhodobý odhad bere jako předchozí. Hmotnost předchozího parametru blendTimeConstant řídí. V našich experimentech to ale zatím nebylo užitečné.

Všimněte si, že během odvození nastaví CNTK obě časové konstanty automaticky tak, aby se používaly pouze existující spuštěné střední hodnoty a že se neaktualizuje. Uživatel nevyžaduje žádnou explicitní akci.

Implementace cuDNN

Ve výchozím nastavení tato funkce používá implementaci CNTK, která funguje s grafickými procesory i procesory. Můžete se rozhodnout použít implementaci cuDNN, což je výkonnější. Mějte však na paměti, že implementace cuDNN nepodporuje všechny možnosti a trénování vyžaduje GPU (CNTK ale poskytuje emulaci procesoru pro odvozování i v případě, že vyberete implementaci cuDNN).