Pourquoi la précision de validation fluctue-t-elle?

31

J'ai un CNN à quatre couches pour prédire la réponse au cancer à l'aide de données IRM. J'utilise les activations ReLU pour introduire des non-linéarités. La précision et la perte du train augmentent et diminuent de façon monotone respectivement. Mais, ma précision de test commence à fluctuer énormément. J'ai essayé de changer le taux d'apprentissage, de réduire le nombre de couches. Mais cela n'arrête pas les fluctuations. J'ai même lu cette réponse et j'ai essayé de suivre les instructions de cette réponse, mais pas de chance à nouveau. Quelqu'un pourrait-il m'aider à comprendre où je me trompe?

Capture d'écran

Raghuram
la source
Oui, j'ai lu cette réponse. Mélanger les données de validation n'a pas aidé
Raghuram
4
Parce que vous n'avez pas partagé votre extrait de code, je ne peux donc pas dire grand-chose de ce qui ne va pas dans votre architecture. Mais dans votre capture d'écran, en voyant la précision de votre formation et de votre validation, il est clair que votre réseau est sur-adapté. Il serait préférable que vous partagiez votre extrait de code ici.
Nain
combien d'échantillons avez-vous? peut-être que la fluctuation n'est pas vraiment significative. En outre, la précision est une mesure horrible
rep_ho
Quelqu'un peut-il m'aider à vérifier si l'utilisation d'une approche d'ensemble est bonne lorsque la précision de validation fluctue? parce que j'ai pu gérer ma fluctuation validation_accuracy par ensemble à une bonne valeur.
Sri2110

Réponses:

27

Si je comprends bien la définition de la précision, la précision (% des points de données classés correctement) est moins cumulative que disons MSE (erreur quadratique moyenne). C'est pourquoi vous voyez que votre lossest en augmentation rapide, tandis que la précision fluctue.

Intuitivement, cela signifie essentiellement qu'une partie des exemples est classée au hasard , ce qui produit des fluctuations, car le nombre de suppositions aléatoires correctes fluctue toujours (imaginez la précision lorsque la pièce doit toujours renvoyer des "têtes"). Fondamentalement, la sensibilité au bruit (lorsque la classification produit un résultat aléatoire) est une définition courante du sur-ajustement (voir wikipedia):

Dans les statistiques et l'apprentissage automatique, l'une des tâches les plus courantes consiste à adapter un "modèle" à un ensemble de données de formation, afin de pouvoir faire des prévisions fiables sur des données générales non formées. En sur-ajustement, un modèle statistique décrit une erreur ou un bruit aléatoire au lieu de la relation sous-jacente

Une autre preuve de sur-ajustement est que votre perte augmente, la perte est mesurée plus précisément, elle est plus sensible à la prédiction bruyante si elle n'est pas écrasée par des sigmoides / seuils (ce qui semble être votre cas pour la perte elle-même). Intuitivement, vous pouvez imaginer une situation où le réseau est trop sûr de la sortie (quand c'est faux), donc il donne une valeur loin du seuil en cas de mauvaise classification aléatoire.

Concernant votre cas, votre modèle n'est pas correctement régularisé, raisons possibles:

  • pas assez de points de données, trop de capacité
  • commande
  • pas / mauvaise mise à l'échelle / normalisation des fonctionnalités
  • taux d'apprentissage: est trop grand, donc SGD saute trop loin et manque la zone proche des minima locaux. Ce serait un cas extrême de «sous-ajustement» (insensibilité aux données elles-mêmes), mais pourrait générer (une sorte de) bruit «basse fréquence» sur la sortie en brouillant les données de l'entrée - contrairement à l'intuition de surajustement, il serait comme toujours deviner des têtes pour prédire une pièce. Comme l'a souligné @JanKukacka, arriver dans la zone "trop ​​près de" un minimum peut entraîner un sur-ajustement, donc si est trop petit, il deviendrait sensible au bruit "haute fréquence" dans vos données. devrait être quelque part entre les deux.ααα

Solutions possibles:

  • obtenir plus de points de données (ou étendre artificiellement l'ensemble des points existants)
  • jouer avec les hyper-paramètres (augmenter / diminuer la capacité ou le terme de régularisation par exemple)
  • régularisation : essayez l'abandon, l'arrêt précoce, etc.
dk14
la source
Concernant: "La perte est mesurée plus précisément, elle est plus sensible à la prédiction bruyante car elle n'est pas écrasée par les sigmoides / seuils", je suis d'accord sans seuil, mais si vous utilisez par exemple l'entropie croisée binaire comme fonction de perte, le sigmoïde joue toujours un rôle.
Zhubarb
1
En ce qui concerne le taux d'apprentissage et le sgd manquant les minima: atteindre le minimum signifierait très probablement un surapprentissage (car c'est le minimum sur l'ensemble d'entraînement)
Jan Kukacka
@Berkmeister true, j'ai reformulé un peu (voir modifier). Ma pensée était que l'augmentation de la perte est un signe d'utilisation de la fonction non écrasée.
dk14
@JanKukacka tu veux dire des minima mondiaux? J'impliquais les minima locaux (en fait proches des minima locaux) - en ce sens que s'ils sont trop éloignés des minima, ils seraient alors insuffisants. Je devrais probablement le décrire plus attentivement (voir modifier), merci.
dk14
@ dk14 Je suppose que le minimum global ne peut pas être atteint dans la pratique, donc je veux dire des minima plutôt locaux. Si vous êtes trop loin, vous pourriez être sous-ajusté, mais si vous êtes trop près, vous êtes probablement en sur-ajustement. Il y a un travail intéressant de Moritz Hardt "S'entraîner plus vite, généraliser mieux: stabilité de la descente de gradient stochastique" ( arxiv.org/abs/1509.01240 ) établissant des limites sur la relation entre la formation et l'erreur de test lors de la formation avec SGD.
Jan Kukacka
6

Cette question est ancienne mais la publie car elle n'a pas encore été signalée:

Possibilité 1 : vous appliquez une sorte de prétraitement (signification nulle, normalisation, etc.) à votre ensemble de formation ou à votre ensemble de validation, mais pas à l'autre .

Possibilité 2 : si vous avez créé des couches qui fonctionnent différemment pendant l'entraînement et l'inférence à partir de zéro, votre modèle peut être incorrectement implémenté (par exemple, la moyenne mobile et l'écart-type mobile pour la normalisation par lots sont-ils mis à jour pendant la formation? Si vous utilisez le décrochage, les poids sont-ils mis à l'échelle correctement pendant inférence?). Cela pourrait être le cas si votre code implémente ces éléments à partir de zéro et n'utilise pas les fonctions intégrées de Tensorflow / Pytorch.

Possibilité 3: Sur-ajustement, comme tout le monde l'a souligné. Je trouve que les deux autres options sont plus probables dans votre situation spécifique car votre précision de validation est bloquée à 50% de l'époque 3. En général, je serais plus préoccupé par le sur-ajustement si cela se produisait à un stade ultérieur (sauf si vous avez un problème très spécifique à portée de main).

Soroush
la source
J'ai un problème qui est un peu similaire mais pas complètement, plus de détails ici: stackoverflow.com/questions/55348052/… Dans mon cas, j'ai effectivement une grande précision cohérente avec les données de test et pendant la formation, la validation "précision "(pas de perte) est supérieur à la précision d'entraînement. Mais le fait qu'il ne converge et n'oscille jamais me fait penser à un sur-ajustement, alors que certains suggèrent que ce n'est pas le cas, alors je me demande si c'est le cas et quelle est la justification si ce n'est pas le cas.
dusa
1
C'est de loin l'explication la plus plausible des réponses données. Notez qu'une dynamique de normalisation de lot élevée (par exemple 0,999, ou même la valeur par défaut de Keras 0,99) en combinaison avec un taux d'apprentissage élevé peut également produire un comportement très différent dans la formation et l'évaluation car les statistiques de couche sont très en retard. Dans ce cas, réduire l'élan à quelque chose comme 0,9 devrait faire l'affaire. J'ai eu un problème similaire à OP et cela a fait l'affaire.
kristjan
5

Ajout à la réponse par @ dk14. Si vous voyez toujours des fluctuations après avoir correctement régularisé votre modèle, cela pourrait être les raisons possibles:

  • Utiliser un échantillon aléatoire de votre ensemble de validation: cela signifie que votre ensemble de validation à chaque étape d'évaluation est différent, tout comme votre perte de validation.
  • Utilisation d'une fonction de perte pondérée (qui est utilisée en cas de problèmes de classe fortement déséquilibrés). À l'étape du train, vous pesez votre fonction de perte en fonction des poids de classe, tandis qu'à l'étape de développement, vous calculez simplement la perte non pondérée. Dans un tel cas, bien que votre réseau progresse vers la convergence, vous pouvez voir beaucoup de fluctuations dans la perte de validation après chaque étape du train. Mais si vous attendez une image plus grande, vous pouvez voir que votre réseau converge réellement vers des minima avec des fluctuations qui s'usent (voir les images jointes pour un exemple).entrez la description de l'image icientrez la description de l'image ici
bitsperseconde
la source
2

Certainement sur-ajusté. L'écart entre la précision des données d'entraînement et les données de test montre que vous vous êtes trop adapté à l'entraînement. Peut-être que la régularisation peut aider.

keramat
la source
1

Votre précision de validation sur un problème de classification binaire (je suppose) "fluctue" autour de 50%, ce qui signifie que votre modèle donne des prédictions complètement aléatoires (parfois il devine correctement quelques échantillons de plus, parfois quelques échantillons de moins). Généralement, votre modèle ne vaut pas mieux que de lancer une pièce.

{0;1}

Quoi qu'il en soit, comme d'autres l'ont déjà souligné, votre modèle connaît un sur-ajustement sévère. Je suppose que votre problème est trop compliqué , c'est-à-dire qu'il est très difficile d'extraire les informations souhaitées de vos données, et que ce simple réseau de conversion à 4 couches formé par end2end n'a aucune chance de l'apprendre .

Jan Kukacka
la source
0

Il y a peu de façons d'essayer dans votre situation. Tout d'abord, essayez d'augmenter la taille du lot, ce qui aide le mini-lot SGD à moins errer sauvagement. Deuxièmement, régler le taux d'apprentissage, probablement le réduire. Troisièmement, essayez différents optimiseurs, par exemple Adam ou RMSProp qui sont capables d'adapter les taux d'apprentissage pour les fonctionnalités wrt. Si possible, essayez d'augmenter vos données. Enfin, essayez les réseaux de neurones bayésiens via l'approximation des abandons, un travail très intéressant de Yarin Gal https://arxiv.org/abs/1506.02158

pateheo
la source
0

Avez-vous essayé un réseau plus petit? Étant donné que la précision de votre formation peut atteindre> .99, votre réseau semble avoir suffisamment de connexions pour modéliser entièrement vos données, mais vous pouvez avoir des connexions étrangères qui apprennent de manière aléatoire (c'est-à-dire un sur-ajustement).

D'après mon expérience, j'ai obtenu la précision de validation de maintien pour se stabiliser avec un réseau plus petit en essayant divers réseaux tels que ResNet, VGG et des réseaux encore plus simples.

teter123f
la source