Пакетна нормалізація використовується для нормалізації вхідного шару, а також прихованих шарів за допомогою регулювання середнього та масштабування активацій. Завдяки цьому нормалізуючому ефекту з додатковим шаром у глибоких нейронних мережах мережа може використовувати більш високу швидкість навчання без зникнення або вибуху градієнтів. Крім того, пакетна нормалізація регулює мережу таким чином, щоб її було легше узагальнити, і, таким чином, не потрібно використовувати випадання для пом'якшення перевитрати.
Одразу після обчислення лінійної функції за допомогою скажімо, щільної () або Conv2D () у Керасі, ми використовуємо BatchNormalization (), яка обчислює лінійну функцію в шарі, а потім додаємо нелінійність до шару за допомогою активації ().
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)
Як застосовується пакетна нормалізація?
Припустимо, ми ввели a [l-1] в шар l. Також маємо ваги W [l] та одиницю зміщення b [l] для шару l. Нехай [l] - обчислений вектор активації (тобто після додавання нелінійності) для шару l і z [l] - вектор перед додаванням нелінійності
- Використовуючи [l-1] і W [l], ми можемо обчислити z [l] для шару l
- Зазвичай при розповсюдженні подачі вперед ми додамо одиницю зміщення до z [l] на цьому етапі, як це z [l] + b [l], але в Batch Normalization цей крок додавання b [l] не потрібен і ні b [l] використовується параметр.
- Обчислити z [l] означає і відняти його від кожного елемента
- Ділимо (z [l] - середнє значення), використовуючи стандартне відхилення. Назвіть це Z_temp [l]
Тепер визначте нові параметри γ і β, які змінять масштаб прихованого шару наступним чином:
z_norm [l] = γ.Z_temp [l] + β
У цьому витязі з коду Dense () приймає a [l-1], використовує W [l] і обчислює z [l]. Тоді негайна BatchNormalization () виконає вищезазначені кроки, щоб дати z_norm [l]. І тоді негайна активація () обчислить tanh (z_norm [l]), щоб дати [l], тобто
a[l] = tanh(z_norm[l])