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:ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- Função de distribuição:∑mP(ym)=1
- Função de partição: estima o número de etiquetasZ
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
Loss(P,Q)=∑x|P(x)−Q(x)|⋅∣∣∣logP(x)Q(x)∣∣∣=∑x∣∣∣(P(x)−Q(x))⋅logP(x)Q(x)∣∣∣
Onde é a pseudo-distribuição alvo e é a pseudo-distribuição prevista (mas a função é realmente simétrica, portanto, na verdade não importa)
P(x)Q(x)
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
def abs_KL_div(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), None)
y_pred = K.clip(y_pred, K.epsilon(), None)
return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)