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?
machine-learning
python
deep-learning
Raghuram
la source
la source
Réponses:
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
loss
est 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):
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:
Solutions possibles:
la source
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).
la source
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:
la source
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.
la source
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.
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 .
la source
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
la source
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.
la source