Пакетная нормализация используется для нормализации входного слоя, а также скрытых слоев, путем регулировки среднего и масштабирования активаций. Из-за этого нормализующего эффекта с дополнительным слоем в глубоких нейронных сетях сеть может использовать более высокую скорость обучения без исчезновения или взрыва градиентов. Кроме того, пакетная нормализация упорядочивает сеть так, что ее легче обобщать, и, таким образом, нет необходимости использовать отсев для уменьшения перегрузки.
Сразу после вычисления линейной функции, скажем, Dense () или Conv2D () в Keras, мы используем BatchNormalization (), которая вычисляет линейную функцию в слое, а затем мы добавляем нелинейность в слой, используя 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)
Как применяется нормализация партии?
Предположим, мы ввели слой [l-1] в слой l. Также мы имеем веса W [l] и единицу смещения b [l] для слоя l. Пусть a [l] будет вектором активации, рассчитанным (т.е. после добавления нелинейности) для слоя l, а z [l] будет вектором до добавления нелинейности
- Используя [l-1] и W [l] мы можем вычислить z [l] для слоя l
- Обычно при прямом распространении мы добавляем единицу смещения к z [l] на этом этапе, как это z [l] + b [l], но в нормализации партии этот шаг добавления 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]. И тогда немедленная Activation () вычислит tanh (z_norm [l]), чтобы получить [l], т.е.
a[l] = tanh(z_norm[l])