Compartilhar via


Funções e métricas de perda

CNTK contém uma série de funções de perda predefinidas comuns (ou critérios de treinamento, para otimizar no treinamento) e métricas (ou critérios de avaliação, para acompanhamento de desempenho). Além disso, funções/métricas de perda personalizadas podem ser definidas como expressões BrainScript.

CrossEntropy(), CrossEntropyWithSoftmax()

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

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

Parâmetros

  • y: rótulos (um-hot) ou, em geral, distribuição de referência. Deve somar até 1.
  • p (para CrossEntropy()): distribuição de probabilidade posterior a ser pontuada em relação à referência. Deve somar até 1.
  • z (para CrossEntropyWithSoftmax()): entrada em uma operação Softmax para calcular a distribuição de probabilidade posterior para pontuar em relação à referência

Valor retornado

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

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

com i iteração sobre todos os elementos de y e p. For CrossEntropyWithSoftmax(), p é computado a partir do parâmetro z de entrada como

p = Softmax (z)

Descrição

Essas funções calculam a entropia cruzada de duas distribuições de probabilidade. A entropia cruzada categórica é o critério de treinamento mais comum (função de perda) para classificação de classe única, em y que codifica um rótulo categórico como um vetor único. Outro uso é como uma função de perda para regressão de distribuição de probabilidade, onde y está uma distribuição de destino que p deve corresponder.

Quando usado como uma função de perda, o processo de SGD do CNTK somará os valores de entropia cruzada de todas as amostras individuais em uma minibatch e calculará a perda por época agregando-os em uma época inteira. Em seguida, isso é relatado nessa forma: 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 entre entropias de -1,213, média em uma época de 3.600.000 amostras.

CrossEntropyWithSoftmax() é uma otimização para o caso de uso mais comum de entropia cruzada categórica, que aproveita a forma específica do Softmax. Em vez de uma probabilidade normalizada, ela aceita como entrada o argumento para a operação Softmax, que é a mesma que uma versão não normalizada do log Softmax, também conhecida como "logit". Essa é a maneira recomendada em CNTK calcular o critério categórico entre entropias.

Observe que a entropia cruzada categórica não é uma função de perda adequada para rótulos de várias classes, onde y contém mais de uma posição contendo uma 1. Para esse caso, considere usar Sigmoid() em vez do Softmax, com uma Logistic() perda. Veja também este artigo.

Definição alternativa

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

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

Rótulos esparsos

Para calcular a entropia cruzada com rótulos esparsos (por exemplo, leitura usando Input(./Inputs#input){..., sparse=true}), o formulário alternativo acima deve ser usado.

Softmax sobre tensores com a classificação>1

Para calcular CrossEntropyWithSoftmax() quando aplicado a tensores da classificação>1, por exemplo, onde a tarefa é determinar um local em uma grade 2D, outra forma alternativa deve ser usada:

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

Esse formulário também permite aplicar a operação Softmax somente em um eixo específico. Por exemplo, se as entradas e rótulos tiverem a forma [10 x 20], e o Softmax deverá ser calculado em 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 esparsos:

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

Logística{}, WeightedLogistic{}

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 retornado

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

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

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

Descrição

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

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

Consulte também este artigo sobre classificadores de várias classes de treinamento.

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)

ClassificationError{}

Calcula a taxa de erro para previsão de rótulos categóricos. Para rótulos binários, você pode usar a perda de rede.

ClassificationError (y, z)

Parâmetros

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

Valor retornado

1 se o valor máximo estiver z em uma posição em que y tenha um 1; caso contrário, 0; resumido em uma minibatch inteira.

Descrição

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

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

ClassificationError() não pode ser usado com rótulos esparsos.

Observação: em CNTK anterior à versão 1.7, essa operação foi chamadaErrorPrediction(). O nome ainda pode ser usado, mas está preterido.

Exemplo

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