Métricas y funciones de pérdida
CNTK contiene una serie de funciones comunes de pérdida predefinidas (o criterios de entrenamiento, para optimizar en el entrenamiento) y métricas (o criterios de evaluación, para el seguimiento del rendimiento). Además, las funciones o métricas de pérdida personalizadas se pueden definir como expresiones BrainScript.
CrossEntropy(), CrossEntropyWithSoftmax()
Calcula la pérdida de entropía cruzada categórica (o simplemente la entropía cruzada entre dos distribuciones de probabilidad).
CrossEntropy (y, p)
CrossEntropyWithSoftmax (y, z)
Parámetros
y
: etiquetas (one-hot), o más generalmente, distribución de referencia. Debe sumar hasta 1.p
(paraCrossEntropy()
): distribución posterior de probabilidad para puntuar con respecto a la referencia. Debe sumar hasta 1.z
(paraCrossEntropyWithSoftmax()
): entrada en una operación Softmax para calcular la distribución posterior de probabilidad para puntuar en la referencia
Valor devuelto
Esta operación calcula la entropía cruzada entre dos distribuciones y
de probabilidad y p
, definidas como:
ce = E_y{-log p} = -sum_i y_i log p_i
con i
iteración en todos los elementos de y
y p
. Para CrossEntropyWithSoftmax()
, p
se calcula a partir del parámetro z
de entrada como
p = Softmax (z)
Descripción
Estas funciones calculan la entropía cruzada de dos distribuciones de probabilidad. La entropía cruzada categórica es el criterio de entrenamiento más común (función de pérdida) para la clasificación de una sola clase, donde y
codifica una etiqueta de categoría como un vector de un solo uso.
Otro uso es como una función de pérdida para la regresión de distribución de probabilidad, donde y
es una distribución de destino que p
coincidirá.
Cuando se usa como función de pérdida, CNTK proceso SGD sumará los valores de entropía cruzada de todas las muestras individuales en un minibatch y calculará la pérdida por época agregándolas en toda una época.
Esto se notifica en este formato: L * S
donde L
es la pérdida media por muestra y S
el número de muestras. Por ejemplo, -1.213 * 3600000
, significa una pérdida media de entropía cruzada de -1,213, promediada durante una época de 3.600.000 muestras.
CrossEntropyWithSoftmax()
es una optimización para el caso de uso más común de la entropía cruzada categórica, que aprovecha la forma específica de Softmax.
En lugar de una probabilidad normalizada, acepta como entrada el argumento para la operación Softmax, que es la misma que una versión no normalizada de log Softmax, también conocida como "logit".
Esta es la manera recomendada de CNTK calcular el criterio de entropía cruzada categórica.
Tenga en cuenta que la entropía cruzada categórica no es una función de pérdida adecuada para las etiquetas de varias clases, donde y
contiene más de una posición que contiene 1.
En este caso, considere la posibilidad de usar Sigmoid()
en lugar de Softmax, con una Logistic()
pérdida.
Consulte también este artículo.
Definición alternativa
CrossEntropyWithSoftmax()
es actualmente una primitiva CNTK que tiene limitaciones.
Una alternativa más flexible y recomendada es definirla manualmente como:
CrossEntropyWithSoftmax (y, z) = ReduceLogSum (z) - TransposeTimes (y, z)
Etiquetas dispersas
Para calcular la entropía cruzada con etiquetas dispersas (por ejemplo, leer mediante Input
(./Inputs#input){..., sparse=true}
), se debe usar el formulario alternativo anterior.
Softmax sobre tensores con rango>1
Para calcular CrossEntropyWithSoftmax()
cuando se aplica a tensores de rango>1, por ejemplo, donde la tarea es determinar una ubicación en una cuadrícula 2D, se debe usar otra forma alternativa:
CrossEntropyWithSoftmax (y, z, axis=None) = ReduceLogSum (z, axis=axis) - ReduceSum (y .* z, axis=axis)
Este formulario también permite aplicar la operación Softmax solo a lo largo de un eje específico.
Por ejemplo, si las entradas y las etiquetas tienen la forma [10 x 20]
, y Softmax debe calcularse en cada una de las 20 columnas de forma independiente, especifique axis=1
.
Ejemplo
labels = Input {9000}
...
z = W * h + b
ce = CrossEntropyWithSoftmax (labels, z)
criterionNodes = (ce)
Igual que con las etiquetas dispersas:
labels = Input {9000, sparse=true}
...
z = W * h + b
ce = ReduceLogSum (z) - TransposeTimes (labels, z)
criterionNodes = (ce)
Logística{}, WeightedLogistic{}
Calcula la función de pérdida logística.
Logistic (y, p)
WeightedLogistic (y, p, instanceWeight)
Parámetros
y
: etiqueta de verdad básica, 0 o 1p
: probabilidad posterior de ser de clase1
Valor devuelto
Calcula la pérdida logística (ponderada), definida como:
ll = -sum_i { y_i * log(p_i) + (1-y_i)*log(1-p_i))} * weight
(donde para Logistic()
, el peso es 1).
Descripción
Esta función es la función de pérdida logística.
Logistic (y, Softmax (z))
es idéntico a CrossEntropyWithSoftmax (y, z)
para los problemas de dos clases, donde solo se asigna una de las dos etiquetas de verdad básica (complementarias) a Logistic()
.
Consulte también este artículo sobre el entrenamiento de clasificadores de varias clases.
Ejemplo
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{}
Calcula la tasa de errores para la predicción de etiquetas de categorías. En el caso de las etiquetas binarias, puede usar pérdida de hamming.
ClassificationError (y, z)
Parámetros
y
: etiquetas de categorías en forma de un solo accesoz
: vector de puntuaciones de predicción, por ejemplo, probabilidades de registro.
Valor devuelto
1 si el valor máximo de z
está en una posición donde y
tiene 1; de lo contrario, 0; se suma en un minibatch completo.
Descripción
Esta función acepta un vector de probabilidades posteriores, logits u otras puntuaciones coincidentes, donde cada elemento representa la puntuación coincidente de una clase o categoría.
La función determina si la clase de puntuación más alta es igual a la clase indicada por la entrada y
de etiqueta , probando si la posición de puntuación más alta contiene un 1.
Cuando se usa como criterio de evaluación, el proceso SGD agregará todos los valores en una época e informará del promedio, es decir, la tasa de errores.
ClassificationError()
no se puede usar con etiquetas dispersas.
Nota: En CNTK anteriores a la versión 1.7, esta operación se denominaba ErrorPrediction()
.
El nombre todavía se puede usar, pero está en desuso.
Ejemplo
labels = Input {9000}
...
z = W * h + b
errs = ClassificationError (labels, z)
evaluationNodes = (errs)