Partager via


Fonctions de perte et métriques

CNTK contient un certain nombre de fonctions de perte prédéfinies courantes (ou critères d’entraînement, à optimiser pour l’entraînement) et des métriques (ou critères d’évaluation, pour le suivi des performances). En outre, les fonctions/métriques de perte personnalisées peuvent être définies en tant qu’expressions BrainScript.

CrossEntropy(), CrossEntropyWithSoftmax()

Calcule la perte d’entropie croisée catégorielle (ou simplement l’entropie croisée entre deux distributions de probabilité).

CrossEntropy (y, p)
CrossEntropyWithSoftmax (y, z)

Paramètres

  • y: étiquettes (à chaud) ou plus généralement, distribution de référence. Doit résumer jusqu’à 1.
  • p (pour CrossEntropy()) : distribution de probabilité postérieure à noter par rapport à la référence. Doit résumer jusqu’à 1.
  • z (pour CrossEntropyWithSoftmax()) : entrée dans une opération Softmax pour calculer la distribution de probabilité postérieure à noter par rapport à la référence

Valeur retournée

Cette opération calcule l’entropie croisée entre deux distributions de probabilité et yp, définie comme suit :

ce = E_y{-log p} = -sum_i y_i log p_i

avec i itération sur tous les éléments de y et p. Pour CrossEntropyWithSoftmax(), p est calculé à partir du paramètre z d’entrée en tant que

p = Softmax (z)

Description

Ces fonctions calculent l’entropie croisée de deux distributions de probabilités. L’entropie croisée catégorielle est le critère d’entraînement le plus courant (fonction de perte) pour la classification à classe unique, où y encode une étiquette catégorielle comme vecteur à chaud. Une autre utilisation est une fonction de perte pour la régression de distribution de probabilité, où y est une distribution cible qui p doit correspondre.

Lorsqu’il est utilisé comme fonction de perte, le processus SGD de CNTK additionne les valeurs d’entropie croisée de tous les échantillons individuels dans un minibatch et calcule la perte par époque en les agrégeant sur une époque entière. Il est ensuite signalé sous cette forme : L * SL est la perte moyenne par échantillon et S le nombre d’échantillons. Par exemple, -1.213 * 3600000signifie une perte moyenne d’entropie croisée de -1,213, moyenne sur une époque de 3 600 000 échantillons.

CrossEntropyWithSoftmax() est une optimisation pour le cas d’usage le plus courant d’entropie croisée catégorielle, qui tire parti de la forme spécifique de Softmax. Au lieu d’une probabilité normalisée, il accepte comme entrée l’argument de l’opération Softmax, qui est identique à une version non normalisée de log Softmax, également appelée « logit ». Il s’agit de la méthode recommandée dans CNTK pour calculer le critère d’entropie croisée catégorielle.

Notez que l’entropie croisée catégorielle n’est pas une fonction de perte appropriée pour les étiquettes multiclasses, où y contient plusieurs positions contenant un 1. Pour ce cas, envisagez d’utiliser Sigmoid() au lieu de Softmax, avec une Logistic() perte. Consultez également cet article.

Autre définition

CrossEntropyWithSoftmax()est actuellement une primitive CNTK qui présente des limitations. Une alternative plus flexible et recommandée consiste à la définir manuellement comme suit :

CrossEntropyWithSoftmax (y, z) = ReduceLogSum (z) - TransposeTimes (y, z)

Étiquettes éparses

Pour calculer l’entropie croisée avec des étiquettes éparses (par exemple, lire à l’aide Inputde (./Input#input)),{..., sparse=true} l’autre formulaire ci-dessus doit être utilisé.

Softmax sur les tenseurs avec rang>1

Pour calculer CrossEntropyWithSoftmax() au-dessus lorsqu’il est appliqué aux tenseurs du rang>1, par exemple, où la tâche consiste à déterminer un emplacement sur une grille 2D, une autre forme doit encore être utilisée :

CrossEntropyWithSoftmax (y, z, axis=None) = ReduceLogSum (z, axis=axis) - ReduceSum (y .* z, axis=axis)

Ce formulaire permet également d’appliquer l’opération Softmax le long d’un axe spécifique uniquement. Par exemple, si les entrées et les étiquettes ont la forme [10 x 20], et que Softmax doit être calculé sur chacune des 20 colonnes indépendamment, spécifiez axis=1.

Exemple

labels = Input {9000}
...
z = W * h + b
ce = CrossEntropyWithSoftmax (labels, z)
criterionNodes = (ce)

Identique avec les étiquettes éparses :

labels = Input {9000, sparse=true}
...
z = W * h + b
ce = ReduceLogSum (z) - TransposeTimes (labels, z)
criterionNodes = (ce)

Logistique{}, WeightedLogistic{}

Calcule la fonction de perte logistique.

Logistic (y, p)
WeightedLogistic (y, p, instanceWeight)

Paramètres

  • y: étiquette de vérité au sol, 0 ou 1
  • p: probabilité postérieure d’être de classe 1

Valeur retournée

Calcule la perte logistique (pondérée), définie comme suit :

ll = -sum_i { y_i * log(p_i) + (1-y_i)*log(1-p_i))} * weight 

(où pour Logistic(), le poids est 1).

Description

Cette fonction est la fonction de perte logistique.

Logistic (y, Softmax (z)) est identique à CrossEntropyWithSoftmax (y, z) celui des problèmes de deux classes, où l’une des deux étiquettes de vérité de base (complémentaires) est donnée à Logistic().

Consultez également cet article sur l’entraînement de classifieurs multiclasse.

Exemple

multiLabels = Input {1000}                     # 0 or 1 for each value
...
p = DenseLayer {1000, activation=Sigmoid} (h)  # element-wise predictor for 1000 values
ll = Logistic (multiLabels, p)
trainingCriterion = (ll)

ClassificationError{}

Calcule le taux d’erreur pour la prédiction d’étiquettes catégorielles. Pour les étiquettes binaires, vous pouvez utiliser la perte de hamming.

ClassificationError (y, z)

Paramètres

  • y: étiquettes catégorielles sous forme à chaud
  • z: vecteur des scores de prédiction, par exemple, probabilités de journal

Valeur retournée

1 si la valeur maximale est z à une position où y a un 1 ; 0 sinon ; additionné sur un minibatch entier.

Description

Cette fonction accepte un vecteur de probabilités postérieures, de logits ou d’autres scores correspondants, où chaque élément représente le score correspondant d’une classe ou d’une catégorie. La fonction détermine si la classe de scoring la plus élevée est égale à la classe indiquée par l’entrée yd’étiquette, en testant si la position de scoring la plus élevée contient un 1.

Lorsqu’il est utilisé comme critère d’évaluation, le processus SGD agrège toutes les valeurs sur une époque et signale la moyenne, c’est-à-dire le taux d’erreur.

ClassificationError() ne peut pas être utilisé avec des étiquettes éparses.

Remarque : Dans CNTK antérieure à la version 1.7, cette opération a été appelée ErrorPrediction(). Le nom peut toujours être utilisé, mais il est déconseillé.

Exemple

labels = Input {9000}
...
z = W * h + b
errs = ClassificationError (labels, z)
evaluationNodes = (errs)