web-dev-qa-db-fra.com

Commande de normalisation et d'abandon de lot?

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 avec contrib.layers), dois-je m'inquiéter de la commande?

Il semble possible que si j'utilise un abandon suivi immédiatement par une normalisation par lots, des problèmes se posent. Par exemple, si le décalage de la normalisation par lots entraîne l'entraînement des numéros d'échelle supérieurs 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 les tests, alors le décalage peut être désactivé. Est-ce que la couche de normalisation par lots TensorFlow compense automatiquement cela? Ou est-ce que cela ne se produit pas pour une raison qui me manque?

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

Merci beaucoup!

METTRE À JOUR:

Un test expérimental semble suggère que l'ordre fait importe. J'ai couru le même réseau deux fois avec uniquement la norme de lot et l'inverse du décrochage. Lorsque le décrochage survient avant la norme du lot, la perte de validation semble augmenter à mesure que la perte de formation diminue. Ils sont tous les deux en baisse dans l'autre cas. Mais dans mon cas, les mouvements sont lents, donc les choses peuvent changer après plus d'entraînement et il ne s'agit que d'un seul test. Une réponse plus définitive et plus éclairée serait tout de même appréciée.

51
golmschenk

Dans le Ioffe and Szegedy 2015 , les auteurs déclarent qu '"nous souhaitons nous assurer que pour toutes les valeurs de paramètre, le réseau produit toujours des activations avec la distribution souhaitée". Ainsi, la couche de normalisation par lots est réellement insérée juste après une couche de connexion/couche entièrement connectée, mais avant l’alimentation dans l’activation de ReLu (ou de tout autre type d’activation). Voir cette vidéo aux alentours de 53 min pour plus de détails.

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

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

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

63
Zhongyu Kuang

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

Mes 2 centimes:

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

Si vous y réfléchissez, dans les problèmes de ML types, c’est la raison pour laquelle nous ne calculons pas la moyenne et l’écart-type sur des données entières, puis les divisons en ensembles train, test et validation. Nous divisons puis calculons les statistiques sur le train et nous les utilisons pour normaliser et centrer les ensembles de données de validation et de test.

donc je suggère Schéma 1 (Cela prend pseudomarvin commentaire sur la réponse acceptée en considération)

-> 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 du schéma 2 devrait afficher un sur-ajustement par rapport au réseau du schéma 1, mais OP a effectué certains tests comme indiqué ci-dessus et prend en charge le schéma 2.

14
MiloMinderbinder

Habituellement, il suffit de laisser tomber la Dropout (lorsque vous avez BN):

  • "BN élimine le besoin de Dropout dans certains cas car BN fournit des avantages de régularisation similaires à ceux de l'abandon intuitif"
  • "Architectures telles que ResNet, DenseNet, etc. n'utilisant pas Dropout 

Pour plus de détails, voir le présent document [ Comprendre le désaccord entre abandon et normalisation par lot par décalage de variance ], comme déjà mentionné par @Haramoz dans les commentaires.

3
xtluo

Sur la base du research paper pour de meilleures performances, nous devrions utiliser le BN avant d’appliquer Dropouts.

1
Renu

L'ordre correct est le suivant: Conv> Normalisation> Activation> Abandon> Pooling

0
salehinejad