Estou experimentando um pouco de auto-codificadores e, com o tensorflow, criei um modelo que tenta reconstruir o conjunto de dados MNIST.
Minha rede é muito simples: X, e1, e2, d1, Y, onde e1 e e2 são camadas de codificação, d2 e Y são camadas de decodificação (e Y é a saída reconstruída).
X tem 784 unidades, e1 tem 100, e2 tem 50, d1 tem 100 novamente e Y 784 novamente.
Estou usando sigmoides como funções de ativação para as camadas e1, e2, d1 e Y. As entradas estão em [0,1] e, portanto, devem ser as saídas.
Bem, tentei usar a entropia cruzada como função de perda, mas a saída sempre foi um blob e notei que os pesos de X a e1 sempre convergiam para uma matriz de valor zero.
Por outro lado, o uso de erros quadráticos médios como função de perda produziria um resultado decente, e agora sou capaz de reconstruir as entradas.
Por que? Eu pensei que poderia interpretar os valores como probabilidades e, portanto, usar entropia cruzada, mas obviamente estou fazendo algo errado.
fonte
Respostas:
Penso que a melhor resposta para isso é que a função de perda de entropia cruzada não é adequada para essa tarefa em particular.
Ao adotar essa abordagem, você está basicamente dizendo que os dados MNIST verdadeiros são binários e suas intensidades de pixel representam a probabilidade de que cada pixel esteja 'ligado'. Mas sabemos que esse não é realmente o caso. O erro dessa suposição implícita está causando problemas.
Podemos ver que a perda de entropia cruzada é assimétrica. Por que queremos isso? É realmente pior prever 0,9 para este pixel 0,8 do que prever 0,7? Eu diria que talvez seja melhor, se alguma coisa.
Provavelmente, poderíamos entrar em mais detalhes e descobrir por que isso leva aos blobs específicos que você está vendo. Eu arriscaria um palpite de que é porque as intensidades de pixel estão acima de 0,5, em média, na região em que você está vendo o blob. Mas, em geral, este é um caso das suposições implícitas de modelagem que você fez como inadequadas para os dados.
Espero que ajude!
fonte