Partilhar via


Funções e métricas de perda

CNTK contém uma série de funções comuns de perda predefinida (ou critérios de formação, para otimizar em formação), e métricas (ou critérios de avaliação, para rastreio de desempenho). Além disso, as funções/métricas de perda personalizada podem ser definidas como expressões BrainScript.

CrossEntropy() CrossEntropyWithSoftmax()

Calcula a perda categórica de entropia cruzada (ou apenas a entropia cruzada entre duas distribuições de probabilidade).

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

Parâmetros

  • y: etiquetas (uma a quente), ou, mais genericamente, distribuição de referência. Deve resumir até 1.
  • p (para CrossEntropy()): distribuição posterior de probabilidade para pontuar contra a referência. Deve resumir até 1.
  • z (para CrossEntropyWithSoftmax()): entrada para uma operação Softmax para calcular a distribuição posterior de probabilidade para pontuar contra a referência

Valor devolvido

Esta operação calcula a entropia cruzada entre duas distribuições de probabilidades y e p, definida como:

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

com i iterando sobre todos os elementos de y e p. Para CrossEntropyWithSoftmax(), p é calculado a partir do parâmetro z de entrada como

p = Softmax (z)

Description

Estas funções calculam a entropia cruzada de duas distribuições de probabilidades. A entropia cruzada categórica é o critério de treino mais comum (função de perda) para a classificação de uma classe única, onde y codifica um rótulo categórico como um vetor de uma só vez. Outra utilização é como uma função de perda para a regressão da distribuição de probabilidades, onde y é uma distribuição de alvo que p deve coincidir.

Quando usado como uma função de perda, o processo SGD da CNTK irá resumir os valores de entropia cruzada de todas as amostras individuais numa minibatch, e calcular a perda por época agregando-as ao longo de uma época inteira. Isto é então relatado neste formulário: L * S onde L está a perda média por amostra, e S o número de amostras. Por exemplo, -1.213 * 3600000significa uma perda média de -entropia de -1.213, média numa época de 3.600.000 amostras.

CrossEntropyWithSoftmax() é uma otimização para o caso de uso mais comum de cruzadas categóricas, que tira partido da forma específica de Softmax. Em vez de uma probabilidade normalizada, aceita como seu contributo o argumento para a operação Softmax, que é o mesmo que uma versão não normalizada do log Softmax, também conhecido como "logit". Esta é a forma recomendada de CNTK calcular o critério de entropia cruzada categórica.

Note que a entropia cruzada categórica não é uma função de perda adequada para etiquetas multi-classes, onde y contém mais de uma posição contendo uma 1. Para este caso, considere usar Sigmoid() em vez de Softmax, com uma Logistic() perda. Veja também este artigo.

Definição alternativa

CrossEntropyWithSoftmax()é atualmente um CNTK primitivo que tem limitações. Uma alternativa mais flexível e recomendada é defini-la manualmente como:

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

Etiquetas escassas

Para calcular a entropia cruzada com etiquetas escassas (por exemplo, ler usando Input(./Inputs#input){..., sparse=true}), deve utilizar-se o formulário alternativo acima.

Softmax sobre tensores com classificação>1

Para calcular CrossEntropyWithSoftmax() quando aplicado aos tensores da categoria>1, por exemplo, quando a tarefa é determinar uma localização numa grelha 2D, deve ser utilizada outra forma alternativa:

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

Este formulário também permite aplicar a operação Softmax apenas ao longo de um eixo específico. Por exemplo, se as entradas e etiquetas tiverem a forma [10 x 20], e o Softmax deve ser calculado sobre cada uma das 20 colunas de forma independente, especifique axis=1.

Exemplo

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

O mesmo com rótulos escassos:

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

Logística{}, PonderadoLogistic{}

Calcula a função de perda logística.

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

Parâmetros

  • y: rótulo de verdade básica, 0 ou 1
  • p: probabilidade posterior de ser de classe 1

Valor devolvido

Calcula a perda logística (ponderada), definida como:

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

(onde para Logistic(), o peso é 1).

Description

Esta função é a função de perda logística.

Logistic (y, Softmax (z)) é idêntico ao CrossEntropyWithSoftmax (y, z) dos problemas de duas classes, em que apenas um dos dois rótulos (complementares) da verdade terrestre é dado a Logistic().

Consulte também este artigo sobre os classificadores de formação multi-classes.

Exemplo

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)

Classificadoror{}

Calcula a taxa de erro para a previsão de rótulos categóricos. Para etiquetas binárias, pode utilizar a perda de hamming.

ClassificationError (y, z)

Parâmetros

  • y: rótulos categóricos em forma única
  • z: vetor de pontuações de previsão, por exemplo.log probabilidades

Valor devolvido

1 se o valor máximo de z se encontra numa posição em que y tenha um 1; 0 de outra forma; resumido sobre uma minibatch inteira.

Description

Esta função aceita um vetor de probabilidades posteriores, logits ou outras pontuações correspondentes, onde cada elemento representa a pontuação correspondente de uma classe ou categoria. A função determina se a classe de pontuação mais alta é igual à classe denotada pela entrada ydo rótulo, testando se a posição de pontuação mais alta contém um 1.

Quando usado como critério de avaliação, o processo SGD agregará todos os valores numa época e reportará a média, ou seja, a taxa de erro.

ClassificationError() não pode ser utilizado com etiquetas escassas.

Nota: Em CNTK antes da versão 1.7, esta operação foi chamada ErrorPrediction(). O nome ainda pode ser usado, mas é depreciado.

Exemplo

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