Question

J'utilise tensorflow pour des expériences principalement avec les réseaux de neurones. Bien que je l'ai fait tout à fait quelques expériences (XOR-problème, MNIST, des trucs de régression, ...) maintenant, je lutte avec le choix de la fonction de coût « correct » pour des problèmes spécifiques parce que je pouvais ensemble être considéré comme un débutant.

Avant de venir à tensorflow je codé quelques PLP entièrement connectés et des réseaux récurrents sur mon propre avec Python et NumPy mais surtout j'avais des problèmes où simple erreur quadratique et un simple gradient descient était suffisant.

Cependant, depuis tensorflow offre tout à fait beaucoup de fonctions de coût se ainsi que la construction de fonctions de coût personnalisé, je voudrais savoir s'il y a une sorte de tutoriel peut-être spécifiquement pour les fonctions de coûts sur les réseaux de neurones? (Je l'ai déjà fait, comme la moitié des tutoriels tensorflow officiels, mais ils ne sont pas vraiment expliquer pourquoi fonctions de coût spécifiques ou les apprenants 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 qu'il applique la fonction softmax sur les deux entrées de sorte que la somme d'un vecteur est égal à 1. Mais quelle est exactement l'entropie croisée avec logits? Je pensais que ce résume les valeurs et calcule l'entropie croisée ... donc une mesure métrique ?! Ne serait-ce pas très bien même si je normalise la sortie, somme et prélevez l'erreur au carré? De plus, pourquoi il est utilisé par exemple pour MNIST (ou même des problèmes beaucoup plus difficile)? Quand je veux classer comme 10 ou peut-être même 1000 cours, ne pas additionner les valeurs détruire complètement toutes les informations sur les qui classe était en fait la sortie?

cost = tf.nn.l2_loss(vector)

Qu'est-ce que cela? Je pensais que la perte est I2 à peu près l'erreur quadratique, mais l'API tensorflow indique que l'entrée de c'est juste un tenseur. Ne pas avoir l'idée du tout!

En plus j'ai vu cela pour entropie croisée assez souvent:

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

... mais pourquoi il est utilisé? N'est pas la perte d'entropie croisée mathématiquement ceci:

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

Où se trouve la partie (1 - y_train) * log(1 - y_output) dans la plupart des exemples de tensorflow? Est-il pas manque?


Réponses: Je sais que cette question est tout à fait ouverte, mais je ne pense pas avoir comme 10 pages avec chaque fonction problème / coût énuméré en détail. J'ai juste besoin d'un bref résumé quand utiliser quelle fonction des coûts (en général ou dans tensorflow, peu importe beaucoup pour moi) et quelques explications à ce sujet. Et / ou une source (s) pour les débutants;)

Était-ce utile?

La solution

Cette réponse est sur le général côté des fonctions de coût, non liées à tensorflow, et traitera surtout les « quelques explications à ce sujet » partie de votre question.

Dans la plupart des exemples / tutoriel j'ai suivi, la fonction de coût utilisé est quelque peu arbitraire. Le point a été plus d'introduire le lecteur à une méthode spécifique, et non à la fonction de coût spécifique. Il ne devrait pas vous empêcher de suivre le tutoriel pour se familiariser avec les outils, mais ma réponse devrait vous aider sur la façon de choisir la fonction de coût pour vos propres problèmes.

Si vous voulez des réponses concernant la Croix-Entropy, Logit, normes L2, ou quoi que ce soit spécifique, je vous conseille de poster plusieurs questions plus spécifiques. Cela augmentera la probabilité qu'une personne ayant une connaissance spécifique verra votre question.


Choisir la bonne fonction des coûts pour obtenir le résultat souhaité est un point critique des problèmes d'apprentissage de la machine. L'approche de base, si vous ne savez pas exactement ce que vous voulez de votre méthode, consiste à utiliser erreur quadratique moyenne (Wikipedia) pour les problèmes de régression et pourcentage d'erreur pour les problèmes de classification. Cependant, si vous voulez bon Résultats sur votre méthode, vous devez définissent bon , et définissent ainsi la fonction de coût adéquat. Cela provient à la fois la connaissance du domaine (ce sont vos données, ce que vous essayez d'atteindre), et la connaissance des outils à votre disposition.

Je ne crois pas que je peux vous guider à travers les fonctions de coûts déjà mises en œuvre dans tensorflow, comme je l'ai très peu de connaissances de l'outil, mais je peux vous donner un exemple sur la façon d'écrire et d'évaluer les différentes fonctions de coût.


Pour illustrer les diverses différences entre les fonctions de coûts, utilisons l'exemple du problème de classification binaire, où l'on veut, pour chaque échantillon $ x_n $ , la classe $ f (x_n) \ in \ {0,1 \} $ .

A partir de propriétés de calcul ; comment deux fonctions de mesure de la « même chose » pourrait conduire à des résultats différents. Prenez ce qui suit, simple fonction des coûts; le pourcentage d'erreur. Si vous avez $ N $ échantillons, $ f (y_n) $ est la classe prédite et $ y_n $ la vraie classe, vous voulez minimiser

  • $ \ frac {1} {N} \ sum_n \ left \ { \ Begin {array} {} ll 1 & \ text {if} f (x_n) \ not = \\ y_n 0 & \ texte {} sinon \\ \ End {array} \ right. = \ Sum_n y_n [1-f (xn)] + [1-y_n] f (xn) $ .

Cette fonction de coût a l'avantage d'être facilement interprétable. Cependant, il est pas lisse; si vous avez seulement deux échantillons, la fonction « sauts » de 0 à 0,5, à 1. Cela conduira à des incohérences si vous essayez d'utiliser une descente de gradient sur cette fonction. Une façon de l'éviter est de changer la fonction de coût pour les probabilités d'utilisation de la cession; $ p (y_n = 1 | x_n) $ . La fonction devient

  • $ \ frac {1} {N} \ sum_n y_n p (y_n = 0 | x_n) + (1 - y_n) p (y_n = 1 | x_n) $ .

Cette fonction est plus lisse, et fonctionnera mieux avec une approche de descente de gradient. Vous obtiendrez un modèle « plus fine ». Cependant, il a un autre problème; si vous avez un échantillon qui est ambigu, disons que vous n'avez pas assez d'informations pour dire quoi que ce soit mieux que $ p (y_n = 1 | x_n) = 0,5 $ . Puis, en utilisant une descente de gradient sur cette fonction de coût conduira à un modèle qui augmente cette probabilité, autant que possible, et donc, peut-être, surajustement.

Un autre problème de cette fonction est que si $ p (y_n = 1 | x_n) = 1 $ en $ y_n = 0 $ , vous êtes certain d'avoir raison, mais vous avez tort. Pour avoid cette question, vous pouvez prendre le journal de la probabilité, $ \ log p (y_n | x_n) $ . Comme $ \ log (0) = \ infty $ et $ \ log (1) = 0 $ , la fonction suivante n'a pas le problème décrit dans le paragraphe précédent:

  • $ \ frac {1} {N} \ sum_n y_n \ log p (y_n = 0 | x_n) + (1 - y_n) \ log p (y_n = 1 | x_n ) $ .

Cela devrait illustrer le fait que, afin d'optimiser le même chose , le pourcentage d'erreur, des définitions différentes pourrait donner des résultats différents si elles sont plus faciles à donner un sens, informatiquement.

Il est possible pour les fonctions de coût $ A $ et $ B $ pour mesurer la même concept , mais $ A $ pourrait conduire votre méthode pour de meilleurs résultats que $ B $ .


Maintenant, nous allons voir comment les différents coûts fonction peut mesurer différents concepts. Dans le contexte de la recherche d'information, à la recherche de Google (si nous négligeons le classement), nous voulons que les résultats retournés à

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

Pour juger de tels algorithmes, la fonction de coût commun est le F-1 $ $ -Score, ce qui donne un poids égal à la précision et le rappel, mais le cas général, il la $ F_ de la bêta $ -Score, et vous pouvez modifier $ \ beta $ pour obtenir

  • rappel supérieur, si vous utilisez $ \ beta> $ 1
  • Plus grande précision, si vous utilisez $ \ beta <$ 1 .

Dans un tel scénario, choisir la fonction de coût est de choisir ce Compromis votre algorithme devrait faire .

Un autre exemple qui est souvent élevé est le cas de diagnostic médical, vous pouvez choisir une fonction de coût qui punit plus négatifs faux ou faux positifs selon ce qui est préférable:

  • les gens plus sains sont classés comme malades (Mais alors, nous pourrions traiter les gens en bonne santé, ce qui est coûteux et peut leur faire du mal si elles ne sont pas réellement malade)
  • Plus les gens malades sont classés en bonne santé (Mais alors, ils pourraient mourir sans traitement)

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


Note Side: Certaines fonctions de coût ont de belles façons de l'algorithme pour arriver à leurs objectifs. Par exemple, une belle façon au minimum du charnière perte (Wikipedia) existe, par résolution le double problème SVM (Wikipedia)

Autres conseils

Pour répondre à votre question sur l'entropie de la Croix, vous remarquerez que les deux de ce que vous avez mentionné sont la même chose.

$ - \ frac {1} {n} \ sum (y \ _train * \ log (y \ _output) + (1 - y \ _train) \ cdot \ log (1 - y \ _output)) $

que vous avez mentionné est que la perte d'entropie croisée binaire, où l'on suppose que $ y \ _train $ est un 0/1 scalaire et que $ y \ _output $ est à nouveau un scalaire indiquant la probabilité de la sortie étant 1.

L'autre équation que vous avez mentionné 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

$ - \ sum_n le train \ _prob \ cdot \ log (out \ _prob) $

où la somme est sur les multiples classes et les probabilités sont pour chaque classe. Il est clair que dans le cas binaire est la chose exacte même que ce qui a été mentionné précédemment. Le $ n $ terme est omis car elle ne contribue en aucune façon à la minimisation de la perte car il est une constante.

BLUF: itératif d'essais et d'erreurs de sous-ensemble de données et matplotlib

.

Réponse longue:

Mon équipe a été aux prises avec cette même question pas si longtemps. Toutes les réponses ici sont grandes, mais je voulais partager avec vous ma « réponse du débutant » pour le contexte et comme point de départ pour les gens qui sont nouveaux à l'apprentissage de la machine.

Vous voulez viser une fonction de coût qui est lisse et convexe pour votre choix spécifique de l'algorithme et ensemble de données. C'est parce que vous voulez que votre algorithme pour pouvoir en toute confiance et d'ajuster efficacement les poids pour atteindre finalement le minimum global de cette fonction de coût. Si votre fonction de coût est « houleuses » avec de max locaux et min, et / ou n'a pas minimum global, votre algorithme pourrait avoir une convergence mal; ses poids pourraient simplement sauter dans tous les sens, à défaut, finalement, pour vous donner des prévisions 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 leur taille (nombre réel, en pouces) et âge (nombre réel, en années), le coût d'erreur quadratique moyenne fonction doit être agréable, lisse, courbe convexe. Votre algorithme aura pas de problèmes convergents.

Mais dites plutôt que vous utilisez un algorithme de régression logistique pour un problème de classification binaire, comme prédire le sexe d'une personne selon que la personne a acheté des couches au cours des 30 derniers jours et si la personne a acheté la bière dans les 30 derniers jours. Dans ce cas, l'erreur quadratique moyenne pourrait ne pas vous donner une surface convexe lisse, ce qui pourrait être mauvais pour la formation. Et vous dire que par l'expérimentation.

Vous pouvez commencer par l'exécution d'un essai avec l'utilisation de MSE et un petit échantillon et simple de vos données ou avec des données fausses que vous avez généré pour cette expérience. Visualisez ce qui se passe avec matplotlib (ou autre solution de traçage que vous préférez). La courbe d'erreur résultant lisse et convexe? Essayez à nouveau avec une variable d'entrée supplémentaire ... est la surface résultante encore lisse et convexe? Grâce à cette expérience, vous pouvez constater que tout MSE ne correspond pas à votre problème / solution, entropie croisée vous donne une forme lisse convexe mieux adaptée à vos besoins. Ainsi, vous pouvez essayer avec un plus grand échantillon ensemble de données et de voir si l'hypothèse tient toujours. Et si elle le fait, alors vous pouvez essayer avec votre formation ensemble complet quelques fois et voir comment il fonctionne et si elle offre toujours des modèles similaires. Si elle ne le fait pas, alors choisir une autre fonction de coût et répétez le processus.

Ce type de processus d'essais et d'erreurs très itérative travaille assez bien pour moi et mon équipe de scientifiques de données débutant, et nous permet de vous concentrer sur la recherche de solutions à nos questions sans avoir à plonger profondément dans la théorie mathématique derrière coût sélection de la fonction et l'optimisation du modèle.

Bien sûr, beaucoup de ce procès et l'erreur a déjà été fait par d'autres personnes, donc nous misons également sur la connaissance du public pour nous aider à filtrer nos choix de ce qui pourrait être de bonnes fonctions de coût au début du processus. Par exemple, l'entropie croisée est généralement un bon choix pour les problèmes de classification, que ce soit la classification binaire avec la régression logistique comme l'exemple ci-dessus ou une classification multi-étiquettes plus compliquée d'une couche softmax comme la sortie. Alors que MSE est un bon premier choix pour des problèmes de régression linéaire où vous cherchez une prédiction scalaire au lieu de la probabilité d'appartenance à une catégorie connue d'un ensemble connu de catégories possibles, auquel cas au lieu d'une couche softmax que votre sortie vous » d pourrait simplement avoir une somme pondérée des entrées comprises sans biais d'une fonction d'activation.

Hope cette réponse aide les autres débutants là-bas sans être trop simpliste et évident.

Reclassement votre question

Où se trouve la partie - - (y_output 1) dans la plupart (1 y_train) * log exemples tensorflow? Est-il pas manque?

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 de mauvais car ils seront automatiquement réduits lorsque vous augmentez la probabilité de droite

Par exemple:

avant l'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]

observer ici que même si nous venons d'augmenter troisième terme, tous les autres termes automatiquement réduits

Licencié sous: CC-BY-SA avec attribution
scroll top