배치 정규화는 활성화의 평균 및 스케일링을 조정하여 입력 레이어와 숨겨진 레이어를 정규화하는 데 사용됩니다. 심층 신경망에서 추가 레이어로 인한 정규화 효과로 인해 네트워크는 그라디언트를 없애거나 폭발시키지 않고 더 높은 학습 속도를 사용할 수 있습니다. 또한 일괄 정규화는 네트워크를 정규화하여 일반화하기가 쉬우므로 드롭 아웃을 사용하여 과적 합을 완화 할 필요가 없습니다.
Keras에서 Dense () 또는 Conv2D ()를 사용하여 선형 함수를 계산 한 직후에는 레이어의 선형 함수를 계산하는 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에 a [l-1]을 입력했다고 가정하자. 또한 레이어 l에 대한 가중치 W [l] 및 바이어스 단위 b [l]이 있습니다. a [l]은 레이어 l에 대해 계산 된 (즉, 비선형 성을 추가 한 후) 활성화 벡터이고 z [l]은 비선형 성을 추가하기 전에 벡터가되도록합니다.
- a [l-1]과 W [l]을 사용하여 레이어 l에 대한 z [l]을 계산할 수 있습니다
- 일반적으로 피드 포워드 전파에서는이 z [l] + b [l]과 같이이 단계에서 z [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])를 계산하여 a [l]
a[l] = tanh(z_norm[l])