Estou treinando uma rede neural para classificar um conjunto de objetos em n-classes. Cada objeto pode pertencer a várias classes ao mesmo tempo (multi-classe, multi-rótulo).
Li que, para problemas com várias classes, geralmente é recomendável usar softmax e entropia cruzada categórica como a função de perda em vez de mse e entendo mais ou menos o porquê.
Para o meu problema de etiqueta múltipla, não faria sentido usar o softmax, é claro, pois cada probabilidade de classe deve ser independente da outra. Portanto, minha camada final são apenas unidades sigmóides que comprimem suas entradas em um intervalo de probabilidade de 0 a 1 para cada classe.
Agora não tenho certeza de qual função de perda devo usar para isso. Olhando para a definição de entropia cruzada categórica, acredito que não se aplicaria bem a esse problema, pois levará em conta apenas a saída de neurônios que deveria ser 1 e ignora os outros.
Parece que a entropia cruzada binária se encaixaria melhor, mas só a vejo mencionada para problemas de classificação binária com um único neurônio de saída.
Estou usando python e keras para treinamento, caso isso importe.
Respostas:
Se você estiver usando o keras, basta colocar sigmoids em sua camada de saída e binary_crossentropy em sua função de custo.
Se você estiver usando o tensorflow, poderá usar sigmoid_cross_entropy_with_logits . Mas, no meu caso, essa função de perda direta não estava convergindo. Então, acabei usando perda de entropia cruzada sigmóide explícita . Você pode fazer o seu próprio neste exemplo(y⋅ln(sigmoid(logits))+(1−y)⋅ln(1−sigmoid(logits)))
Sigmoide, diferentemente do softmax, não fornece distribuição de probabilidade em torno de como saída, mas probabilidades independentes.nclasses
Se em média qualquer linha tiver menos rótulos atribuídos, você poderá usar softmax_cross_entropy_with_logits porque, com essa perda enquanto as classes são mutuamente exclusivas, suas probabilidades não precisam ser. Tudo o que é necessário é que cada linha de rótulos seja uma distribuição de probabilidade válida. Caso contrário, o cálculo do gradiente estará incorreto.
fonte
ATUALIZAÇÃO (18/04/18): A resposta antiga ainda se mostrou útil no meu modelo. O truque é modelar a função de partição e a distribuição separadamente, explorando assim o poder do softmax.
Considere o seu vetor de observação para conter rótulos. (1 se a amostra i contiver o rótulo m, 0 caso contrário). Portanto, o objetivo seria modelar a matriz por amostra. Portanto, o modelo avalia . Considere expandir para obter duas propriedades:y m yim=δim F(yi,xi)=−logP(yi|xi) yim=Z⋅P(ym)
Então é uma questão de modelar os dois separadamente. A função de distribuição é melhor modelada com uma camada softmax , e a função de partição pode ser modelada com uma unidade linear (na prática, eu a recortei como . Modelagem mais sofisticada como a unidade de Poisson provavelmente funcionaria melhor). Em seguida, você pode optar por aplicar a perda distribuída (KL na distribuição e MSE na partição) ou pode tentar a seguinte perda no produto.max(0.01,output)
Na prática, a escolha do otimizador também faz uma enorme diferença. Minha experiência com a abordagem de fatoração é que ela funciona melhor em Adadelta (o Adagrad não funciona para mim, ainda não experimentou o RMSprop, o desempenho do SGD está sujeito a parâmetros).
Comentário lateral sobre sigmóide : Eu certamente tentei sigmóide + crossentropia e não deu certo. O modelo inclinou-se a prever apenas o e não conseguiu capturar a variação na função de distribuição. (ou seja, é de alguma forma bastante útil para modelar a partição e pode haver motivos matemáticos por trás dela)Z
ATUALIZAÇÃO : (Pensamento aleatório) Parece que o uso do processo Dirichlet permitiria a incorporação de alguns itens anteriores no número de etiquetas?
ATUALIZAÇÃO : Por experimento, a divergência KL modificada ainda está inclinada a fornecer saída de classe múltipla em vez de saída de etiqueta múltipla.
(Resposta antiga)
Minha experiência com entropia sigmóide não foi muito agradável. No momento, estou usando uma divergência KL modificada. Toma a forma
Eles são chamados de pseudo-distribuições por não serem normalizados. Portanto, você pode ter se tiver 2 rótulos para uma amostra específica.∑xP(x)=2
Keras impelmentation
fonte
adam
foi muito melhor do quermsprop
Ainda não usei keras. Tomando caffe, por exemplo, você pode usar
SigmoidCrossEntropyLossLayer
para problemas com vários rótulos.fonte
Na verdade, no tensor-fluxo, você ainda pode usar a
sigmoid_cross_entropy_mean
função de cálculo de perda no rótulo múltiplo.fonte
Eu sou um novato aqui, mas vou tentar tentar com esta pergunta. Eu estava pesquisando a mesma coisa que você e, finalmente, encontrei um ótimo tutorial de classificação multi-classe keras em http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .
O autor desse tutorial usa a função de perda de entropia cruzada categórica e há outro encadeamento que pode ajudá-lo a encontrar a solução @ aqui .
fonte