Commande de normalisation de lots et abandon?

117

La question initiale concernait spécifiquement les implémentations de TensorFlow. Cependant, les réponses concernent les implémentations en général. Cette réponse générale est également la bonne réponse pour TensorFlow.

Lors de l'utilisation de la normalisation par lots et de l'abandon dans TensorFlow (en particulier en utilisant les contrib.layers), dois-je m'inquiéter de la commande?

Il semble possible que si j'utilise une suppression suivie immédiatement d'une normalisation par lots, il peut y avoir des problèmes. Par exemple, si le décalage dans la normalisation par lots s'entraîne vers les numéros d'échelle plus grands des sorties d'apprentissage, mais que ce même décalage est appliqué aux numéros d'échelle plus petits (en raison de la compensation pour avoir plus de sorties) sans abandon pendant le test, alors que le quart de travail peut être désactivé. La couche de normalisation par lots TensorFlow compense-t-elle automatiquement cela? Ou cela n'arrive-t-il pas pour une raison quelconque qui me manque?

En outre, y a-t-il d'autres pièges à éviter lors de l'utilisation de ces deux éléments ensemble? Par exemple, en supposant que je les utilise dans le bon ordre par rapport à ce qui précède (en supposant qu'il y ait un ordre correct), pourrait-il y avoir des problèmes avec l'utilisation de la normalisation par lots et de la suppression sur plusieurs couches successives? Je ne vois pas immédiatement de problème avec cela, mais il me manque peut-être quelque chose.

Merci beaucoup!

METTRE À JOUR:

Un test expérimental semble suggérer que la commande est importante. J'ai couru le même réseau deux fois avec seulement la norme de lot et l'inverse de la suppression. Lorsque le décrochage est avant la norme du lot, la perte de validation semble augmenter à mesure que la perte d'entraînement diminue. Ils tombent tous les deux dans l'autre cas. Mais dans mon cas, les mouvements sont lents, donc les choses peuvent changer après plus d'entraînement et ce n'est qu'un seul test. Une réponse plus définitive et informée serait toujours appréciée.

Golmschenk
la source

Réponses:

143

Dans le Ioffe et Szegedy 2015 , les auteurs déclarent que "nous voudrions nous assurer que pour toutes les valeurs de paramètre, le réseau produise toujours des activations avec la distribution souhaitée". Ainsi, le calque de normalisation par lots est en fait inséré juste après un calque de convection / un calque entièrement connecté, mais avant d'alimenter ReLu (ou tout autre type d'activation). Voir cette vidéo à environ 53 min pour plus de détails.

En ce qui concerne l'abandon, je pense que l'abandon est appliqué après la couche d'activation. Dans le papier de décrochage la figure 3b, la matrice facteur de décrochage / probabilité r (l) pour la couche cachée l est appliquée sur y (l), où y (l) est le résultat après l' application de la fonction d'activation f.

Donc, en résumé, l'ordre d'utilisation de la normalisation des lots et de l'abandon est:

-> CONV / FC -> BatchNorm -> ReLu (ou autre activation) -> Dropout -> CONV / FC ->

Zhongyu Kuang
la source
63
Il semble que même Christian Szegedy aime maintenant jouer BatchNorm après le ReLU (pas avant). Citation de F. Chollet, l'auteur de Keras: "Je ne suis pas retourné vérifier ce qu'ils suggèrent dans leur article original, mais je peux garantir que le code récent écrit par Christian s'applique relu avant BN. C'est encore parfois un sujet de débat, cependant. " source
pseudomarvin
3
Qu'en est-il de la mise en commun, cela se passerait-il entre batchnorm et l'activation?
wordsforthewise
5
En outre, il semble que la précision peut être plus élevée avec BN après l'activation: github.com/cvjena/cnn-models/issues/3
wordsforthewise
1
la vidéo est supprimée d'une manière ou d'une autre!
blitu12345
10
Cet article montre que normalement l'abandon avec BN conduit à de pires résultats à moins qu'un certain conditionnement ne soit fait pour éviter le risque de changements de variance.
Haramoz
37

Comme indiqué dans les commentaires, une ressource incroyable pour lire l'ordre des couches est ici . J'ai parcouru les commentaires et c'est la meilleure ressource sur le sujet que j'ai trouvée sur Internet

Mes 2 cents:

L'abandon est destiné à bloquer complètement les informations de certains neurones pour s'assurer que les neurones ne co-adaptent pas. Ainsi, la normalisation par lots doit être effectuée après la suppression, sinon vous transmettez des informations via les statistiques de normalisation.

Si vous y réfléchissez, dans les problèmes de ML typiques, c'est la raison pour laquelle nous ne calculons pas la moyenne et l'écart type sur des données entières, puis nous les divisons en ensembles d'entraînement, de test et de validation. Nous divisons puis calculons les statistiques sur l'ensemble de trains et les utilisons pour normaliser et centrer les ensembles de données de validation et de test

donc je suggère le schéma 1 (cela prend en considération le commentaire de pseudomarvin sur la réponse acceptée)

-> CONV / FC -> ReLu (ou autre activation) -> Dropout -> BatchNorm -> CONV / FC

par opposition au schéma 2

-> CONV / FC -> BatchNorm -> ReLu (ou autre activation) -> Dropout -> CONV / FC -> dans la réponse acceptée

Veuillez noter que cela signifie que le réseau sous le schéma 2 devrait montrer un sur-ajustement par rapport au réseau sous le schéma 1 mais OP a effectué certains tests comme mentionné en question et ils prennent en charge le schéma 2

MiloMinderbinder
la source
Discussion reddit pertinente sur le placement de BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g
3
Mais cela ne gâcherait-il pas vos statistiques de BN puisque vous les calculerez après l'application de l'abandon, ce qui ne sera pas le cas au moment du test?
ZakJ
@ZakJ je suppose que non. Puisque nous calculons BN par unité (pour chaque caractéristique interne) et de plus, il est mis à l'échelle pour compenser l'abandon.
zèle
@ZakJ a raison. Voir la réponse de Mohammed Adel et cet article ici: arxiv.org/pdf/1801.05134.pdf . En effet, les couches de normalisation par lots apprennent à contrecarrer le décalage de covariable dans les données qui n'existe plus lorsque la suppression est désactivée au moment du test.
skeller88
@ skeller88 Je n'ai pas lu le journal. En haut de ma tête, je pense que si vous avez BN avant le décrochage, cela fausse essentiellement l'intention de la couche BN puisque la fonction de BN est de fournir des données normalisées à la couche suivante.
MiloMinderbinder le
12

Habituellement, déposez simplement le Dropout(lorsque vous avez BN):

  • "Le BN élimine le besoin, Dropoutdans certains cas, de causer le BN fournit des avantages de régularisation similaires à ceux du décrochage intuitivement"
  • "Les architectures comme ResNet, DenseNet, etc. n'utilisent pas Dropout

Pour plus de détails, reportez-vous à cet article [ Comprendre la discordance entre l'abandon et la normalisation des lots par décalage de variance ] comme déjà mentionné par @Haramoz dans les commentaires.

xtluo
la source
qu'en est-il des MLP, est-il utile de les combiner.
DINA TAKLIT
1
@DINATAKLIT Quand vous n'avez vraiment pas assez de données d'entraînement, à mon avis, OUI.
xtluo
@xtulo voulez-vous dire ce travail une fois qu'il s'agit d'une petite date? comme si j'ai lu que la normalisation par lots fonctionne mieux avec de grands ensembles de données! Je suis un peu confus:!
DINA TAKLIT
1
@DINATAKLIT Dans votre commentaire précédent what about MLPs is it useful to combine them, vouliez-vous dire cela Is it useful to combine Dropout and BN when using MLPs? Mon sentiment à ce sujet est que cela dépend principalement de la taille de votre modèle et de la quantité de données d'entraînement dont vous disposez.
xtluo
@xtulo oui je veux dire est-il utile de combiner Droupout et BN, oui je suis d'accord avec votre dernière réponse.
DINA TAKLIT
6

J'ai trouvé un article qui explique la discordance entre Dropout et Batch Norm (BN). L'idée clé est ce qu'ils appellent le «changement de variance» . Cela est dû au fait que le décrochage a un comportement différent entre les phases de formation et de test, ce qui modifie les statistiques d'entrée que BN apprend. L'idée principale se trouve dans cette figure tirée de cet article . entrez la description de l'image ici

Une petite démo de cet effet peut être trouvée dans ce cahier .

Mohamed Adel
la source
3
Comment cela répond-il à la question?
nbubis
1
Le papier fournit 2 stratégies potentielles: - Appliquer le décrochage (uniquement) après toutes les couches de BN - Changer le décrochage en une forme plus stable à la variance
user3641187
@nbubis Je pense que cela répond indirectement. Il semble suggérer de ne pas les utiliser du tout ensemble ("explique le désaccord entre Dropout et Batch Norm (BN)").
NelsonGon le
3

Sur la base du document de recherche pour de meilleures performances, nous devrions utiliser BN avant d'appliquer Dropouts

Renu
la source
La réponse ne concerne pas la pile complète, posée dans la question.
salehinejad
2

L'ordre correct est: Conv> Normalisation> Activation> Abandon> Regroupement

Salehinejad
la source
2

Conv - Activation - DropOut - BatchNorm - Pool -> Test_loss: 0.04261355847120285

Conv - Activation - DropOut - Pool - BatchNorm -> Test_loss: 0.050065308809280396

Conv - Activation - BatchNorm - Pool - DropOut -> Test_loss: 0.04911309853196144

Conv - Activation - BatchNorm - DropOut - Pool -> Test_loss: 0.06809622049331665

Conv - BatchNorm - Activation - DropOut - Pool -> Test_loss: 0.038886815309524536

Conv - BatchNorm - Activation - Pool - DropOut -> Test_loss: 0.04126095026731491

Conv - BatchNorm - DropOut - Activation - Pool -> Test_loss: 0.05142546817660332

Conv - DropOut - Activation - BatchNorm - Pool -> Test_loss: 0.04827788099646568

Conv - DropOut - Activation - Pool - BatchNorm -> Test_loss: 0.04722036048769951

Conv - DropOut - BatchNorm - Activation - Pool -> Test_loss: 0.03238215297460556


Formé sur le jeu de données MNIST (20 époques) avec 2 modules convolutifs (voir ci-dessous), suivi à chaque fois avec

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

Les couches convolutives ont une taille de noyau de (3,3), remplissage par défaut, l'activation est elu. Le pooling est un MaxPooling de la piscine (2,2). La perte est categorical_crossentropyet l'optimiseur l'est adam.

La probabilité d'abandon correspondante est respectivement 0.2ou 0.3. La quantité de cartes d'entités est respectivement 32ou 64.

Edit: Lorsque j'ai abandonné Dropout, comme recommandé dans certaines réponses, il a convergé plus rapidement mais avait une capacité de généralisation pire que lorsque j'utilise BatchNorm et Dropout.

Lukas Nießen
la source
En raison de la nature stochastique des NN, il ne suffit pas de jouer avec un seul entraînement. Lorsque vous feriez environ 100 formations et que vous feriez une moyenne, les résultats seront plus précis.
GensaGames
0

ConV / FC - BN - Sigmoïde / tanh - abandon. Si la fonction d'activation est Relu ou autre, l'ordre de normalisation et de décrochage dépend de votre tâche

Cro Chan
la source
0

J'ai lu les articles recommandés dans la réponse et les commentaires de https://stackoverflow.com/a/40295999/8625228

Du point de vue de Ioffe et Szegedy (2015), n'utilisez que BN dans la structure du réseau. Li et coll. (2018) donnent les analyses statistiques et expérimentales, qu'il y a un changement de variance lorsque les praticiens utilisent Dropout avant BN. Ainsi, Li et al. (2018) recommandent d'appliquer Dropout après toutes les couches BN.

Du point de vue de Ioffe et Szegedy (2015), BN est situé à l' intérieur / avant la fonction d'activation. Cependant, Chen et al. (2019) utilisent une couche IC qui combine le décrochage et le BN, et Chen et al. (2019) recommande d'utiliser BN après ReLU.

En ce qui concerne la sécurité, j'utilise Dropout ou BN uniquement dans le réseau.

Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao et Shengyu Zhang. 2019. «Repenser l'utilisation de la normalisation par lots et de l'abandon dans la formation des réseaux de neurones profonds.» CoRR abs / 1905.05928. http://arxiv.org/abs/1905.05928 .

Ioffe, Sergey et Christian Szegedy. 2015. «Normalisation des lots: accélération de la formation en réseau profond en réduisant le décalage de covariable interne.» CoRR abs / 1502.03167. http://arxiv.org/abs/1502.03167 .

Li, Xiang, Shuo Chen, Xiaolin Hu et Jian Yang. 2018. «Comprendre le désaccord entre l'abandon et la normalisation des lots par décalage de variance.» CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .

Jiaxiang
la source