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
(paraCrossEntropy()
): distribuição de probabilidade posterior a ser pontuada em relação à referência. Deve somar até 1.z
(paraCrossEntropyWithSoftmax()
): 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 * 3600000
significa 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 1p
: probabilidade posterior de ser de classe1
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 únicoz
: 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 y
do 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)