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.
la source
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
la source
Habituellement, déposez simplement le
Dropout
(lorsque vous avezBN
):Dropout
dans certains cas, de causer le BN fournit des avantages de régularisation similaires à ceux du décrochage intuitivement"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.
la source
what about MLPs is it useful to combine them
, vouliez-vous dire celaIs 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.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 .
Une petite démo de cet effet peut être trouvée dans ce cahier .
la source
Sur la base du document de recherche pour de meilleures performances, nous devrions utiliser BN avant d'appliquer Dropouts
la source
L'ordre correct est: Conv> Normalisation> Activation> Abandon> Regroupement
la source
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
Les couches convolutives ont une taille de noyau de
(3,3)
, remplissage par défaut, l'activation estelu
. Le pooling est un MaxPooling de la piscine(2,2)
. La perte estcategorical_crossentropy
et l'optimiseur l'estadam
.La probabilité d'abandon correspondante est respectivement
0.2
ou0.3
. La quantité de cartes d'entités est respectivement32
ou64
.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.
la source
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
la source
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 .
la source