Si j'ai bien compris la signification de la fonction de perte pour le modèle, elle dirige le modèle à entraîner en fonction de la minimisation de la valeur de la perte. Ainsi, par exemple, si je veux que mon modèle soit formé afin d'avoir la moindre erreur absolue moyenne, je devrais utiliser MAE comme fonction de perte. Pourquoi, par exemple, vous voyez parfois quelqu'un qui souhaite obtenir la meilleure précision possible, mais qui construit le modèle pour minimiser une autre fonction complètement différente? Par exemple:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
Comment se fait-il que le modèle ci-dessus soit formé pour nous donner le meilleur accès, car pendant son entraînement, il essaiera de minimiser une autre fonction (MSE). Je sais que, une fois déjà formé, la métrique du modèle nous donnera le meilleur acc trouvé lors de la formation.
Mon doute est le suivant: le modèle ne devrait-il pas se concentrer pendant son entraînement sur maximiser acc (ou minimiser 1 / acc) au lieu de minimiser MSE? Si cela est fait de cette manière, le modèle ne nous donnerait-il pas une précision encore plus élevée, car il sait qu'il doit la maximiser pendant son entraînement?
3 Réponses :
si j'ai bien compris, vous vous demandez pourquoi optimiser la "perte" alors que nous pouvons optimiser la "précision".
Bien sûr que vous pouvez !! (si ce sera bon pour la convergence est un autre problème). Vous voyez, la perte (MSE dans votre cas) et la précision sont essentiellement des fonctions habituelles ou pour être des équations précises et vous pouvez choisir n'importe quelle équation comme fonction objective .
peut-être que cette confusion est due à l'utilisation de choses comme: "mse" et encore plus déroutante: "acc"
.
vérifiez ce fichier pour obtenir une image plus claire de ce qui se passe lorsque vous écrivez "mse"
"acc"
est un petit peu plus déroutant. Vous voyez, lorsque vous écrivez "acc", cela a plusieurs significations pour Keras. Par conséquent, en fonction de la fonction de perte que vous utilisez, Keras décide alors de la meilleure fonction "acc" pour vous. Consultez ce fichier pour voir ce que se produit lorsque vous écrivez "acc"
Enfin, pour répondre à votre question: ne devrait-il pas se concentrer sur le modèle pendant son entraînement pour maximiser acc (ou minimiser 1 / acc) au lieu de minimiser MSE?
Eh bien, pour keras, MSE
et acc
ne sont que des fonctions. Keras optimise votre modèle en fonction des retours de la fonction définie à:
model.compile (loss =
)
pour attribut: perte
passez une fonction. Si vous ne souhaitez pas le faire, écrivez simplement "mse"
et keras passera la fonction requise pour vous.
pour attribute: metrics
transmettez une liste de fonction (s). Si vous êtes paresseux comme moi, demandez simplement à keras de le faire en écrivant "acc"
Quelle fonction / équation devez-vous utiliser comme fonction objectif?
c'est pour un autre jour :)
Pour commencer, l'extrait de code que vous avez utilisé comme exemple:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['mse','mae'])
est en fait invalide (bien que Keras ne produise aucune erreur ou avertissement) pour un raison très simple et élémentaire: MSE est une perte valide pour les problèmes de régression , pour lesquels la précision des problèmes n'a pas de sens (elle n'a de sens que pour les problèmes de classification , où MSE n'est pas un fonction de perte). Pour plus de détails (y compris un exemple de code), voir sa propre réponse dans Quelle fonction définit la précision dans Keras lorsque la perte est l'erreur quadratique moyenne (MSE)? ; pour une situation similaire dans scikit-learn, voir sa propre réponse dans ce fil de discussion .
Poursuivant votre question générale: dans les paramètres de régression , nous n'avons généralement pas besoin d'une statistique de performances distincte, et nous utilisons normalement uniquement la fonction de perte elle-même à cette fin, c'est-à-dire que le code correct pour l'exemple que vous avez utilisé serait simplement
model.compile(loss='mean_squared_error', optimizer='sgd')
sans aucune métrique
spécifié. Nous pourrions bien sûr utiliser metrics = 'mse'
, mais c'est redondant et pas vraiment nécessaire. Parfois, les gens utilisent quelque chose comme
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
i.e. optimiser le modèle en fonction de la perte MSE, mais montrer également ses performances dans l'erreur absolue moyenne (MAE) en plus de MSE.
Maintenant, votre question:
Le modèle ne devrait-il pas se concentrer pendant son apprentissage sur maximiser acc (ou minimiser 1 / acc) au lieu de minimiser MSE?
est en effet valable, du moins en principe (sauf pour la référence à MSE), mais uniquement pour les problèmes de classification , où, grosso modo, la situation est la suivante: on ne peut pas utiliser le vaste arsenal de méthodes d'optimisation convexe afin de maximiser directement la précision, car la précision n'est pas une fonction différentiable; donc, nous avons besoin d'une fonction différentiable proxy à utiliser comme perte. L'exemple le plus courant d'une telle fonction de perte adaptée aux problèmes de classification est le entropie croisée .
Sans surprise, votre question surgit de temps en temps, bien que dans de légères variations de contexte; voir par exemple ses propres réponses dans
Pour l'interaction entre la perte et la précision dans le cas particulier de la classification binaire, vous pouvez trouver mes réponses utiles dans les fils suivants:
La précision n'est pas différenciable. Cela ne peut donc pas être une fonction de perte. Cela ne peut fonctionner que comme une métrique.
Cela a déjà été souligné dans la réponse (acceptée) ci-dessus. Veuillez ne pas publier de réponses redondantes.
La
précision
de la métrique peut être considérée commenumber_correct / total
. Ceci est ce qui vous tient à cœur. En fin de compte, vous souhaitez obtenir une précision élevée. Mais comment y arriver? Vous ne pouvez pas rétro-propager les valeurs pour l'exactitude et la mise à jour. Cependant, vous pouvez utiliser une fonction de perte pour minimiser. En minimisant la perte, vous augmentez également la précision. Pensez à ce que faitsgd
. Dans quelle direction va-t-il? Qu'est ce que ça fait? Aide à trouver le minimum. Comment? Il y a une raison pour laquelle les fonctions de perte sont conçues pour être faciles à prendre la dérivée. Vous voudrez peut-être d'abord mieux comprendre le fonctionnement des RNA.