Pourquoi le sur-ajustement ne détruit-il pas les réseaux de neurones pour la classification MNIST?

8

J'ai un réseau neuronal simple (NN) pour la classification MNIST. Il comprend 2 couches cachées, chacune avec 500 neurones. Les dimensions du NN sont donc: 784-500-500-10. ReLU est utilisé dans tous les neurones, softmax est utilisé en sortie et l'entropie croisée est la fonction de perte.

Ce qui m'intrigue, c'est pourquoi le sur-ajustement ne semble pas dévaster le NN?

Considérez le nombre de paramètres (poids) du NN. C'est approximativement

784×500+500×500+500×dix=647000.
Cependant, dans mon expérience, je n'ai utilisé que exemples (un dixième de l'ensemble de formation du MNIST) pour former le NN. (C'est juste pour garder le temps d'exécution court. L'erreur de formation et de test diminuerait considérablement si j'utilisais plus d'exemples de formation.) J'ai répété l'expérience 10 fois. Une descente en gradient stochastique simple est utilisée (pas d'hélice ou d'élan RMS); aucune régularisation / abandon / arrêt précoce n'a été utilisé. L'erreur de formation et l'erreur de test signalées étaient les suivantes:6000

Non.123456789dixEtrunejen(%)7.810,39.111,08.79.29.38.310,38.6Etest(%)11,713,913,214,112,113,213,311,913,412,7

Notez que dans les 10 expériences (chacune avec une initialisation aléatoire indépendante des paramètres), l'erreur de test ne différait de l'erreur d'apprentissage que d'env. 4%, même si j'ai utilisé des exemples 6K pour entraîner les paramètres 647K. La dimension VC du réseau neuronal est de l'ordre deO(|E|log(|E|))au moins, oùest le nombre d'arêtes (poids). Alors pourquoi l'erreur de test n'était-elle pas misérablement plus élevée (par exemple 30% ou 50%) que l'erreur de formation? J'apprécierais grandement que quelqu'un puisse indiquer où j'ai raté. Merci beaucoup!|E|

[EDITS 2017/6/30]

Pour clarifier les effets d'un arrêt précoce, j'ai refait les 10 expériences, chacune maintenant avec 20 époques d'entraînement. Les taux d'erreur sont indiqués dans la figure ci-dessous:

entrez la description de l'image ici

L'écart entre le test et l'erreur de formation a augmenté à mesure que davantage d'époques sont utilisées dans la formation. Cependant, la queue de l'erreur de test est restée presque plate après que l'erreur d'apprentissage a été ramenée à zéro. De plus, j'ai vu des tendances similaires pour d'autres tailles de l'ensemble d'entraînement. Le taux d'erreur moyen à la fin de 20 époques de formation est comparé à la taille de la formation définie ci-dessous:

entrez la description de l'image ici

Donc, le sur-ajustement se produit, mais cela ne semble pas dévaster le NN. Compte tenu du nombre de paramètres (647K) dont nous avons besoin pour le train et du nombre d'exemples de formation que nous avons (<60K), la question demeure: pourquoi le sur-ajustement ne rend-il pas facilement le NN inutile? De plus, est-ce vrai pour le ReLU NN pour toutes les tâches de classification avec sortie softmax et fonction objectif à entropie croisée? Quelqu'un a-t-il vu un contre-exemple?

syeh_106
la source
Je ne vois aucun commentaire sur le nombre d'époques utilisées. Avez-vous essayé de courir plus ou moins d'époques pour voir l'effet que cela a? Vous mentionnez ne pas utiliser l'arrêt précoce, mais vous décidez probablement d'arrêter d'une manière ou d'une autre? Courez-vous pour un grand nombre d'époques, de sorte que le réseau semble avoir convergé?
Neil Slater
@NeilSlater J'ai utilisé une seule époque dans l'expérience et j'ai mis fin au SGD après. (C'est pour garder le temps d'exécution court, car je le fais sur Matlab pour une meilleure contrôlabilité et visibilité). En regardant la valeur de la fonction de perte en SGD (taille de mini-lot = 1), cependant, elle semblait convergente, c'est-à-dire que la sortie max softmax planait près de 1. J'ai également essayé des exemples de 60K (1 époque), et j'ai vu une tendance similaire, c'est-à-dire erreur de formation ~ 3% et erreur de test ~ 4%.
syeh_106
Je pense que la réponse à la suite de vos expériences prolongées est une combinaison entre ma réponse et celle de Bashar. Cela peut être utile si vous pensez en termes de test de taux d'erreur: former - une erreur de formation de 0% avec une erreur de test de 7% n'est pas une bonne performance - c'est un sur-ajustement majeur. Même votre taux d'erreur de 2,5% sur les exemples de formation 60k est 10 fois pire que les taux d'erreur de pointe sur ce problème. Cependant, je suppose que votre question est "pourquoi le réseau n'a-t-il pas régressé à 50% ou même 90% de taux d'erreur"? Ce qui est couvert par la réponse de Bashar, bien que je me demande toujours si les erreurs de test augmenteraient avec encore plus d'époques
Neil Slater
1
@NeilSlater Sure, taille de pas SGD = 0,001. Les pondérations sont initialisées de façon aléatoire et uniforme sur [-0,2, +0,2] sur les 2 premières couches, [-1, + 1] sur la couche de sortie.
syeh_106
1
J'ai mis à jour ma réponse avec une enquête supplémentaire. Il est fondamentalement d'accord avec vos conclusions et offre un certain contexte et une explication en agitant la main
Neil Slater

Réponses:

7

J'ai reproduit vos résultats en utilisant Keras, et j'ai obtenu des chiffres très similaires, donc je ne pense pas que vous faites quelque chose de mal.

Par intérêt, j'ai couru pour bien d'autres époques pour voir ce qui allait se passer. La précision des résultats des tests et des trains est restée assez stable. Cependant, les valeurs de perte se sont éloignées au fil du temps. Après environ 10 époques, j'obtenais une précision de train de 100%, une précision de test de 94,3% - avec des valeurs de perte d'environ 0,01 et 0,22 respectivement. Après 20 000 époques, les précisions avaient à peine changé, mais j'avais une perte d'entraînement de 0,000005 et une perte de test de 0,36. Les pertes étaient également toujours divergentes, bien que très lentement. À mon avis, le réseau est clairement trop adapté.

Donc, la question pourrait être reformulée: pourquoi, malgré un ajustement excessif, un réseau de neurones formé à l'ensemble de données du MNIST se généralise-t-il encore raisonnablement bien en termes de précision?

Il vaut la peine de comparer cette précision de 94,3% avec ce qui est possible en utilisant des approches plus naïves.

Par exemple, une régression linéaire simple softmax (essentiellement le même réseau de neurones sans les couches cachées), donne une précision stable rapide de 95,1% de train et 90,7% de test. Cela montre que beaucoup de données se séparent linéairement - vous pouvez dessiner des hyperplans dans les dimensions 784 et 90% des images numériques se trouveront à l'intérieur de la "boîte" correcte sans aucun raffinement supplémentaire requis. De cela, vous pourriez vous attendre à ce qu'une solution non linéaire surajustée obtienne un résultat pire que 90%, mais peut-être pas pire que 80%, car formant intuitivement une frontière trop complexe autour, par exemple, d'un "5" trouvé à l'intérieur de la boîte pour "3" n'affectera qu'à tort une petite quantité de ce collecteur naïf 3. Mais nous sommes meilleurs que cette estimation inférieure de 80% du modèle linéaire.

Un autre modèle naïf possible est la correspondance de modèles ou le plus proche voisin. C'est une analogie raisonnable avec ce que fait le sur-ajustement - cela crée une zone locale proche de chaque exemple de formation où il prédira la même classe. Des problèmes de sur-ajustement se produisent dans l'espace intermédiaire où les valeurs d'activation suivront quoi que le réseau fasse "naturellement". Notez que le pire des cas, et ce que vous voyez souvent dans les diagrammes explicatifs, serait une surface presque chaotique très incurvée qui parcourt d'autres classifications. Mais en fait, il peut être plus naturel pour le réseau de neurones d'interpoler plus facilement entre les points - ce qu'il fait dépend en fait de la nature des courbes d'ordre supérieur que le réseau combine en approximations et de la façon dont celles-ci correspondent déjà aux données.

J'ai emprunté le code d'une solution KNN à ce blog sur MNIST avec K Nearest Neighbors . L'utilisation de k = 1 - c'est-à-dire le choix de l'étiquette la plus proche parmi les 6000 exemples d'apprentissage juste en faisant correspondre les valeurs des pixels, donne une précision de 91%. Les 3% supplémentaires que le réseau neuronal surentraîné réalise ne semblent pas tout à fait aussi impressionnants étant donné la simplicité du comptage de correspondance de pixels que fait KNN avec k = 1.

J'ai essayé quelques variantes de l'architecture réseau, différentes fonctions d'activation, différents nombres et tailles de couches - aucune n'utilisant la régularisation. Cependant, avec 6000 exemples d'entraînement, je n'ai pu obtenir aucun d'eux pour s'adapter à une manière où la précision du test a chuté de façon spectaculaire. Même réduire à seulement 600 exemples d'entraînement vient de réduire le plateau, avec une précision d'environ 86%.

Ma conclusion de base est que les exemples MNIST ont des transitions relativement douces entre les classes dans l'espace des caractéristiques, et que les réseaux de neurones peuvent s'adapter à ces derniers et interpoler entre les classes de manière "naturelle" compte tenu des blocs de construction NN pour l'approximation des fonctions - sans ajouter de composants haute fréquence à l'approximation qui pourrait provoquer des problèmes dans un scénario de sur-ajustement.

Ce pourrait être une expérience intéressante d'essayer avec un ensemble "MNIST bruyant" où une quantité de bruit aléatoire ou de distorsion est ajoutée à la fois aux exemples de formation et de test. On s'attendrait à ce que les modèles régularisés fonctionnent correctement sur cet ensemble de données, mais peut-être que dans ce scénario, le sur-ajustement causerait des problèmes de précision plus évidents.


C'est d'avant la mise à jour avec d'autres tests par OP.

D'après vos commentaires, vous dites que vos résultats de test sont tous pris après avoir exécuté une seule époque. Vous avez essentiellement utilisé un arrêt précoce, bien que vous n'ayez pas écrit, car vous avez arrêté la formation le plus tôt possible compte tenu de vos données de formation.

Je suggérerais de courir pour beaucoup plus d'époques si vous voulez voir comment le réseau converge vraiment. Commencez avec 10 époques, envisagez de monter à 100. Une époque n'est pas beaucoup pour ce problème, en particulier sur 6000 échantillons.

Bien que l'augmentation du nombre d'itérations ne soit pas garantie d'aggraver votre réseau comme il ne l'a déjà fait, vous ne lui avez pas vraiment donné beaucoup de chance, et vos résultats expérimentaux jusqu'à présent ne sont pas concluants.

En fait, je m'attendrais à moitié à ce que les résultats de vos données de test s'améliorent à la suite d'une 2e, 3e époque, avant de commencer à s'éloigner des mesures d'entraînement à mesure que le nombre d'époques augmente. Je m'attendrais également à ce que votre erreur de formation approche de 0% à mesure que le réseau approchait de la convergence.

Neil Slater
la source
Tu as raison. En exécutant seulement 1 époque, j'ai implémenté implicitement un arrêt précoce, par inadvertance. Je vais essayer votre suggestion et éventuellement mettre à jour ma question si nécessaire.
syeh_106
Votre réponse mise à jour et les résultats de votre enquête sont très utiles, apportant plus de lumière sur cette question. Je l'apprécie énormément. Les réseaux de neurones artificiels me paraissent beaux et fascinants. C'est juste que, quand j'ai essayé de comprendre pourquoi / comment / quand cela a fonctionné, l'analyse / théorie quantitative et rigoureuse ne semblait pas abonder.
syeh_106
3

En général, les gens pensent au surajustement en fonction de la complexité du modèle. Ce qui est génial, car la complexité du modèle est l'une des choses que vous pouvez contrôler. En réalité, il existe de nombreux autres facteurs liés au problème de surapprentissage: - nombre d'échantillons de formation - nombre d'itérations - la dimension de l'entrée (dans votre cas, je crois que c'est la raison pour laquelle vous n'êtes pas en surapprentissage) - le difficulté du problème: si vous avez un problème simple, séparable linéairement, alors ne vous inquiétez pas trop du sur-ajustement.

Il existe une démo visuelle fournie par google tensorflow qui vous permet de modifier tous ces paramètres. http://playground.tensorflow.org Vous pouvez changer votre problème d'entrée, le nombre d'échantillons, la dimension de votre entrée, le réseau, le nombre d'itérations.

J'aime penser au sur-ajustement comme sur-ajustement = grands modèles + fonctionnalités indépendantes

Bashar Haddad
la source