Réseaux de neurones: quelle fonction de coût utiliser?


49

J'utilise TensorFlow pour des expériences principalement avec des réseaux de neurones. Bien que j'aie fait pas mal d'expériences (XOR-Problem, MNIST, des trucs de régression, ...) maintenant, je ne parviens pas à choisir la fonction de coût "correcte" pour des problèmes spécifiques car, dans l'ensemble, je pourrais être considéré comme un débutant.

Avant de venir à TensorFlow, j'avais codé des réseaux MLP entièrement connectés et des réseaux récurrents avec Python et NumPy, mais la plupart du temps, j'avais des problèmes lorsqu'une simple erreur au carré et un simple gradient de gradient étaient suffisants.

Cependant, étant donné que TensorFlow propose lui-même un grand nombre de fonctions de coût ainsi que la création de fonctions de coût personnalisées, j'aimerais savoir s'il existe une sorte de didacticiel spécifiquement destiné aux fonctions de coût sur des réseaux de neurones? (J'ai déjà utilisé la moitié des didacticiels officiels de TensorFlow, mais ils n'expliquent pas vraiment pourquoi des fonctions de coût ou des apprenants spécifiques sont utilisés pour des problèmes spécifiques - du moins pas pour les débutants)

Pour donner quelques exemples:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Je suppose que cela applique la fonction softmax sur les deux entrées pour que la somme d'un vecteur soit égale à 1. Mais qu'est-ce exactement que l'entropie croisée avec les logits? Je pensais que cela résumait les valeurs et calculait l'entropie croisée ... donc une mesure métrique?! Ne serait-ce pas la même chose si je normalisais la sortie, la résumais et prenais l'erreur au carré? De plus, pourquoi est-ce utilisé par exemple pour MNIST (ou même pour des problèmes beaucoup plus difficiles)? Quand je veux classer comme 10 ou peut - être même 1000 des classes, ne pas additionner les valeurs détruire complètement toute information sur laquelle la classe était en fait la sortie?

cost = tf.nn.l2_loss(vector)

À quoi ça sert? Je pensais que la perte l2 était à peu près l’erreur carrée, mais l’API de TensorFlow indique que son entrée n’est qu’un tenseur. Ne pas avoir l'idée du tout?!

De plus, j'ai souvent vu ceci pour l' entropie croisée :

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... mais pourquoi est-ce utilisé? La perte d'entropie croisée mathématiquement n'est-elle pas la suivante:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Où se trouve la (1 - y_train) * log(1 - y_output)pièce dans la plupart des exemples TensorFlow? Est-ce qu'il ne manque pas?


Réponses: Je sais que cette question est assez ouverte, mais je ne m'attends pas à obtenir 10 pages avec chaque fonction de problème / coût énumérée en détail. J'ai juste besoin d'un bref résumé sur le moment d'utiliser la fonction de coût (en général ou dans TensorFlow, cela n'a pas beaucoup d'importance pour moi) et quelques explications sur ce sujet. Et / ou des sources pour débutants;)


1
Bonne question. Bienvenue sur le site :)
Dawny33

2
Habituellement, MSE est utilisé pour la régression et Cross-Entropie pour la classification. Classification Figure of Merit (CFM) a été introduite dans "Une nouvelle fonction objective pour améliorer la reconnaissance des phonèmes à l'aide de réseaux neuronaux à retardement" de Hampshire et Waibel. Si je me souviens bien, ils expliquent également pourquoi ils ont conçu CFM comme ils l'ont fait.
Martin Thoma

1
Je pense que reduction_sum (y_train * tf.log (y_output)) est beaucoup utilisé parce que c'est un exemple assez commun de "cas simple". Il exécutera la somme des erreurs de chaque lot, ce qui signifie que votre erreur double le coût (et l'ampleur du gradient) si votre batch_sizes double. Faire le simple changement de réduction du moyen rendra au moins le débogage et la lecture des paramètres plus compréhensibles à mon avis.
Neurone

Réponses:


35

Cette réponse concerne l' aspect général des fonctions de coût et n'est pas liée à TensorFlow. Elle abordera principalement la partie de votre question intitulée "Quelques explications sur ce sujet".

Dans la plupart des exemples / tutoriels que j'ai suivis, la fonction de coût utilisée était quelque peu arbitraire. Il s’agissait plutôt de présenter au lecteur une méthode spécifique, et non la fonction de coût en particulier. Cela ne devrait pas vous empêcher de suivre le didacticiel pour vous familiariser avec les outils, mais ma réponse devrait vous aider à choisir la fonction de coût correspondant à vos propres problèmes.

Si vous souhaitez obtenir des réponses concernant l'entropie croisée, Logit, les normes L2 ou toute autre question spécifique, je vous conseille de poser plusieurs questions plus spécifiques. Cela augmentera la probabilité qu'une personne ayant des connaissances spécifiques verra votre question.


Le choix de la fonction de coût appropriée pour obtenir le résultat souhaité est un point critique des problèmes d’apprentissage automatique. L'approche de base, si vous ne savez pas exactement ce que vous voulez de votre méthode, consiste à utiliser l' erreur quadratique moyenne (Wikipedia) pour les problèmes de régression et le pourcentage d'erreur pour les problèmes de classification. Cependant, si vous voulez obtenir de bons résultats avec votre méthode, vous devez définir ce qui est bon , et donc définir la fonction de coût adéquate. Cela provient à la fois de la connaissance du domaine (quelles sont vos données, que tentez-vous d'atteindre) et de la connaissance des outils à votre disposition.

Je ne pense pas pouvoir vous guider à travers les fonctions de coût déjà mises en œuvre dans TensorFlow, car je connais très peu l'outil, mais je peux vous donner un exemple sur la manière d'écrire et d'évaluer différentes fonctions de coût.


xnf(xn){0,1}

Nf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn)

p(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn)

p(yn=1|xn)=0.5

p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0, la fonction suivante ne présente pas le problème décrit dans le paragraphe précédent:

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn)

Cela devrait illustrer le fait que pour optimiser la même chose , le pourcentage d'erreur, différentes définitions peuvent donner des résultats différents s'il est plus facile de les comprendre, en termes de calcul.

ABAB


Voyons maintenant comment différentes fonctions des coûts peuvent mesurer différents concepts. Dans le contexte de la recherche d'informations, comme dans la recherche Google (si nous ignorons le classement), nous voulons que les résultats renvoyés soient:

  • avoir une haute précision , ne pas renvoyer d'informations non pertinentes
  • avoir un rappel élevé , retourner autant de résultats pertinents que possible
  • Précision et rappel (Wikipedia)

Notez que si votre algorithme retourne tout , il retournera tous les résultats pertinents possibles et aura donc un rappel élevé, mais sa précision sera très faible. D'autre part, si elle ne retourne que l' un élément, celui qui est le plus sûr est pertinent, il aura une grande précision mais faible rappel.

FF1Fββ

  • β>1
  • β<1

Dans un tel scénario, choisir la fonction de coût consiste à choisir le compromis que votre algorithme devrait faire .

Un autre exemple qui est souvent évoqué est le cas du diagnostic médical. Vous pouvez choisir une fonction de coût qui punit davantage de faux négatifs ou de faux positifs en fonction de ce qui est préférable:

  • Plus de personnes en bonne santé sont classées comme malades (mais nous pourrions aussi traiter les personnes en bonne santé, ce qui est coûteux et pourrait leur faire du mal si elles ne le sont pas)
  • Plus de personnes malades sont classées comme étant en bonne santé (mais alors, elles pourraient mourir sans traitement)

En conclusion, définir la fonction de coût, c'est définir l'objectif de votre algorithme. L'algorithme définit comment y arriver.


Note secondaire: Certaines fonctions de coût disposent de bons algorithmes pour atteindre leurs objectifs. Par exemple, il existe un bon moyen de réduire au minimum la perte de charnière (Wikipedia) , en résolvant le double problème de SVM (Wikipedia)


10

Pour répondre à votre question sur l'entropie croisée, vous remarquerez que les deux choses que vous avez mentionnées sont la même chose.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

y_trainy_output

L’autre équation que vous avez mentionnée est une variante plus générique de cette extension à plusieurs classes

-tf.reduce_sum(y_train * tf.log(y_output)) est la même chose que l'écriture

ntrain_problog(out_prob)

n


4

BLUF: essais et erreurs itératifs avec un sous-ensemble de données et matplotlib.

Longue réponse:

Mon équipe était aux prises avec cette même question il n'y a pas si longtemps. Toutes les réponses ici sont excellentes, mais je voulais partager avec vous ma "réponse du débutant" comme contexte et comme point de départ pour les débutants en apprentissage automatique.

Vous souhaitez viser une fonction de coût lisse et convexe pour votre choix spécifique d'algorithme et de jeu de données. En effet, vous souhaitez que votre algorithme puisse ajuster les poids de manière sûre et efficace pour atteindre le minimum global de cette fonction de coût. Si votre fonction de coût est "cahoteuse" avec les valeurs maximales et minimales locales et / ou n'a pas de minimum global, alors votre algorithme risque d'avoir du mal à converger; ses poids pourraient tout simplement sauter partout, en fin de compte ne pas vous donner de prédictions précises et / ou cohérentes.

Par exemple, si vous utilisez une régression linéaire pour prédire le poids d'une personne (nombre réel, en livres) en fonction de sa taille (nombre réel, en pouces) et de son âge (nombre réel, en années), la fonction de coût d'erreur quadratique moyenne doit alors être: une belle courbe lisse et convexe. Votre algorithme n'aura aucun problème à converger.

Mais disons plutôt que vous utilisez un algorithme de régression logistique pour un problème de classification binaire, comme par exemple pour prédire le sexe d'une personne en fonction du fait que la personne a acheté des couches au cours des 30 derniers jours et de la bière au cours des 30 derniers jours. Dans ce cas, une erreur quadratique moyenne pourrait ne pas vous donner une surface convexe lisse, ce qui pourrait être mauvais pour l'entraînement. Et vous diriez cela par expérimentation.

Vous pouvez commencer par exécuter un essai avec MSE et un échantillon petit et simple de vos données ou avec des données fictives que vous avez générées pour cette expérience. Visualisez ce qui se passe avec matplotlib (ou la solution de traçage que vous préférez). La courbe d'erreur résultante est-elle lisse et convexe? Réessayez avec une variable d'entrée supplémentaire ... la surface résultante est-elle toujours lisse et convexe? Grâce à cette expérience, vous constaterez que si MSE ne correspond pas à votre problème / solution, l'entropie croisée vous donne une forme lisse et convexe qui répond mieux à vos besoins. Vous pouvez donc essayer cela avec un plus grand échantillon de données et voir si l'hypothèse est toujours valable. Et si tel est le cas, vous pouvez l’essayer plusieurs fois avec votre kit d’entraînement complet et voir comment il se comporte et s'il propose systématiquement des modèles similaires. Si ce n'est pas le cas, choisissez une autre fonction de coût et répétez le processus.

Ce type de processus très itératif d’essais et d’erreurs fonctionne assez bien pour moi et mon équipe de scientifiques débutants. Il nous permet de nous concentrer sur la recherche de solutions à nos questions sans avoir à plonger dans la théorie mathématique qui sous-tend la sélection de la fonction de coût. optimisation du modèle.

Bien sûr, beaucoup d'essais et d'erreurs ont déjà été commis par d'autres personnes. Par conséquent, nous nous appuyons également sur les connaissances du public pour nous aider à filtrer nos choix de ce qui pourrait être de bonnes fonctions de coût dès le début du processus. Par exemple, l'entropie croisée est généralement un bon choix pour les problèmes de classification, qu'il s'agisse d'une classification binaire avec une régression logistique comme dans l'exemple ci-dessus ou d'une classification plus complexe à étiquettes multiples avec une couche softmax en sortie. Considérant que MSE est un bon premier choix pour les problèmes de régression linéaire lorsque vous recherchez une prédiction scalaire au lieu de la probabilité d'appartenir à une catégorie connue parmi un ensemble connu de catégories possibles, auquel cas, au lieu d'une couche softmax comme résultat, vous ' d pourrait simplement avoir une somme pondérée des entrées plus le biais sans fonction d'activation.

J'espère que cette réponse aidera les débutants sans être trop simpliste et trop évidente.


3

Regrading votre question

Où se trouve la partie (1 - y_train) * log (1 - y_output) dans la plupart des exemples TensorFlow? Est-ce qu'il ne manque pas?

La réponse est que la plupart des fonctions de sortie sont softmax. Cela signifie que vous n'avez pas nécessairement besoin de réduire toutes les probabilités dans les cas erronés car elles seront automatiquement réduites lorsque vous augmentez la probabilité du cas correct.

Par exemple:

avant optimisation

y_output = [0.2, 0.2, 0.6] et y_train = [0, 0, 1]

après optimisation

y_output = [0.15, 0.15, 0.7] et y_train = [0, 0, 1]

observons ici que même si nous venons d’augmenter le troisième terme, tous les autres termes sont automatiquement réduits


0

Une fonction de perte est un guide pour que le modèle décide de son chemin à l'aide de l'optimiseur. Donc, il essaiera d’apporter un nombre qui doit refléter correctement l’écart par rapport à la valeur réelle et aussi (sans toutefois s’y limiter) -

Comprendre les valeurs aberrantes, comprendre l'objectif du modèle, l'approche du modèle, comprendre le type de prédiction, c.-à-d. Le nombre, l'étiquette binaire, etc.

Je conviens que cette question est trop vaste pour y répondre dans un texte court, mais je voudrais quand même essayer d’énumérer un résumé de l’utilisation qui a été suggéré par la plupart des auteurs.

Cela peut vous aider à démarrer votre modèle mais doit être accompagné de recherches individuelles basées sur des scénarios et des données.

Cela pourrait également déclencher plusieurs WHY et HOW. Poser une nouvelle question Ou utilisez les questions déjà répondues (il y en a beaucoup)

mean_squared_error Valeur par défaut pour la régression

mean_absolute_error Régression lorsque vous avez des valeurs aberrantes

mean_squared_logarithmic_error Régression. Réduire davantage l'erreur. Utilisez lorsque vous vous attendez à de grandes valeurs dans votre prédiction

huber_loss A mi-chemin entre MSE et MAE. Cette fonction est quadratique pour les petites valeurs et linéaire pour les grandes valeurs

logcosh Encore une fois, le moyen d'obtenir les avantages à la fois de MSE et de MAE log (cosh (x)) est approximativement égal à (x ** 2) / 2 pour les petits x et à abs (x) - log (2) pour les grands X. Cela signifie que "logcosh" fonctionne principalement comme une erreur quadratique moyenne, mais ne sera pas aussi fortement affecté par les prédictions extrêmement erronées occasionnelles.

mean_absolute_percentage_error Quand on s'intéresse à la mesure en%, pas aux valeurs. Par exemple, tout en tenant compte des données d'échelle de la population d'un pays,% serait plus important qu'un grand nombre ~ 10 000

charnière SVM. Il s’occupe de la marge autour du vecteur support.

categorical_crossentropy Multiclass Classification - nous avons une probabilité cible par classe pour chaque instance (par exemple, des vecteurs à action unique, par exemple [0., 0., 0., 1., 0., 0., 0., 0., 0. , 0.] pour représenter la classe 3

sparse_categorical_crossentropy Multiclass Classification - nous avons des étiquettes éparses (c’est-à-dire que, pour chaque instance, il n’existe qu’un index de classe cible, compris entre 0 et 9 dans ce cas) et que les classes sont exclusives.

binary_crossentropy Utilisez-le pour une classification binaire simple

Notes :: Ce sont les "pertes" de la bibliothèque Keras. Le concept serait identique, mais d’autres bibliothèques pourraient utiliser une autre variante de texte pour les nommer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.