Normalizacja wsadowa służy do normalizacji warstwy wejściowej oraz warstw ukrytych poprzez dostosowanie średniej i skalowania aktywacji. Ze względu na ten efekt normalizujący z dodatkową warstwą w głębokich sieciach neuronowych, sieć może używać wyższego tempa uczenia się bez zanikania lub eksplozji gradientów. Ponadto normalizacja wsadowa reguluje sieć w taki sposób, że łatwiej jest uogólniać, a zatem nie jest konieczne stosowanie przerywania w celu złagodzenia nadmiernego dopasowania.
Zaraz po obliczeniu funkcji liniowej za pomocą, powiedzmy, Dense () lub Conv2D () w Keras, używamy BatchNormalization (), które oblicza funkcję liniową w warstwie, a następnie dodajemy nieliniowość do warstwy za pomocą Activation ().
from keras.layers.normalization import BatchNormalization
model = Sequential()
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('softmax'))
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True,
validation_split=0.2, verbose = 2)
W jaki sposób stosowana jest normalizacja wsadowa?
Załóżmy, że wprowadziliśmy [l-1] do warstwy l. Mamy również wagi W [l] i jednostkę odchylenia b [l] dla warstwy l. Niech a [l] będzie wektorem aktywacji (tj. Po dodaniu nieliniowości) dla warstwy l i z [l] będzie wektorem przed dodaniem nieliniowości
- Używając [l-1] i W [l], możemy obliczyć z [l] dla warstwy l
- Zwykle w propagacji z wyprzedzeniem dodajemy jednostkę odchylenia do z [l] na tym etapie, tak jak to z [l] + b [l], ale w normalizacji wsadowej ten krok dodawania b [l] nie jest wymagany i nie używany jest parametr b [l].
- Oblicz średnią z [l] i odejmij ją od każdego elementu
- Podziel (z [l] - średnia) za pomocą odchylenia standardowego. Nazwij to Z_temp [l]
Teraz zdefiniuj nowe parametry γ i β, które zmienią skalę ukrytej warstwy w następujący sposób:
z_norm [l] = γ.Z_temp [l] + β
W tym fragmencie kodu Dense () przyjmuje a [l-1], używa W [l] i oblicza z [l]. Następnie natychmiastowa BatchNormalization () wykona powyższe kroki, aby uzyskać z_norm [l]. Następnie natychmiastowa Activation () obliczy tanh (z_norm [l]), aby dać [l] ie
a[l] = tanh(z_norm[l])