La normalisation par lots est utilisée pour normaliser la couche d'entrée ainsi que les couches cachées en ajustant la moyenne et la mise à l'échelle des activations. En raison de cet effet de normalisation avec une couche supplémentaire dans les réseaux de neurones profonds, le réseau peut utiliser un taux d'apprentissage plus élevé sans disparaître ou exploser de gradients. En outre, la normalisation par lots régularise le réseau de sorte qu'il est plus facile à généraliser, et il n'est donc pas nécessaire d'utiliser le décrochage pour atténuer le surajustement.
Juste après avoir calculé la fonction linéaire en utilisant, par exemple, Dense () ou Conv2D () dans Keras, nous utilisons BatchNormalization () qui calcule la fonction linéaire dans un calque, puis nous ajoutons la non-linéarité au calque en utilisant 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)
Comment la normalisation des lots est-elle appliquée?
Supposons que nous ayons entré a [l-1] dans une couche l. Nous avons également les poids W [l] et l'unité de biais b [l] pour la couche l. Soit a [l] le vecteur d'activation calculé (c'est-à-dire après addition de la non-linéarité) pour la couche l et z [l] le vecteur avant d'ajouter la non-linéarité
- En utilisant a [l-1] et W [l] nous pouvons calculer z [l] pour la couche l
- Habituellement, dans la propagation par anticipation, nous ajouterons l'unité de biais au z [l] à ce stade comme ceci z [l] + b [l], mais dans la normalisation par lots, cette étape d'ajout de b [l] n'est pas requise et non Le paramètre b [l] est utilisé.
- Calculer les moyennes de z [l] et les soustraire de chaque élément
- Divisez (z [l] - moyenne) en utilisant l'écart type. Appelez-le Z_temp [l]
Définissez maintenant de nouveaux paramètres γ et β qui changeront l'échelle du calque caché comme suit:
z_norm [l] = γ.Z_temp [l] + β
Dans cet extrait de code, le Dense () prend le a [l-1], utilise W [l] et calcule z [l]. Ensuite, le BatchNormalization () immédiat exécutera les étapes ci-dessus pour donner z_norm [l]. Et puis l'activation immédiate () calculera tanh (z_norm [l]) pour donner un [l] ie
a[l] = tanh(z_norm[l])