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
(paraCrossEntropy()
): distribuição posterior de probabilidade para pontuar contra a referência. Deve resumir até 1.z
(paraCrossEntropyWithSoftmax()
): 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 * 3600000
significa 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 1p
: probabilidade posterior de ser de classe1
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 únicaz
: 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 y
do 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)