Recentemente estava tentando fazer o clássico modelo de rede neural para identificar a espécie de uma flor entre três opções (iris dataset) só para fazer um "Hello World" no Keras e dar o primeiro passo.
Entretanto, no meio do caminho tive alguns problemas que me levaram a pesquisar mais a fundo a diferença entre algumas funções de ativação e loss functions.
Dado o contexto, meu objetivo aqui é só registrar o que eu encontrei enquanto estudava. Não sou especialista nesse assunto então não tome o que for dito aqui como verdade absoluta. Se você for experiente e notar algum erro em algo que eu disse, correções são bem vindas.
Funções de ativação
A primeira coisa que eu notei é que no Keras e em bibliotecas de redes neurais em geral, fala-se bastante de uma função de ativação que eu ouvi muito pouco antes de mexer com ele, a softmax function.
Para entender melhor a diferença, vamos ver o que elas realmente são.
Sigmoid
Antes eu tinha uma visão um pouco distorcida e superficial dessa função como algo que "comprime o número entre 0 e 1", apenas.
Mas uma característica que eu não tinha reparado era que ela é boa para problemas de classificação binária (duas classes), ou problemas de multiclasse independente, onde você pode ter uma mesma entrada pertencendo a múltiplas classes.
Exemplo
Classificação binária: Paciente anêmico ou saudável. (Sim ou não)
Classificação multiclasse: Tem gato na foto, tem carro na foto, tem maçã na foto. (Pode ter um ou mais desses elementos na foto)
Eu não sei se é tecnicamente correto, mas o modelo mental que eu tenho para entender isso é que a função Sigmoid é boa para responder "Sim" ou "Não", seja em um problema que realmente é de "Sim" ou "Não", seja pra um problema de multiclasse que precisa de um conjunto de "Sims" e "Nãos".
Softmax
A Softmax tem uma característica interessante, a saída dela é uma distribuição de probabilidade que leva em consideração o quanto um valor representa em proporção com as outras saídas. Note que na fórmula ele representa como a divisão do valor pela somatória de toda a tupla, ou seja, ele diz o quanto aquele valor representa percentualmente em relação aos outros.
Se você entende esse conceito, fica claro que essa ativação lida melhor com uma classificação que espera uma única classe como saída, pois não avalia "sims" e "nãos" de forma individual, mas sim o quanto elas são "mais significativas" do que as outras.
Loss Functions
Binary Cross-Entropy (BCE)
A Binary Cross-Entropy, como o nome sugere, é uma loss function que funciona bem para situações de sim e não (duas classes), mesmo que múltiplos sims e nãos (múltiplas classes independentes).
Para problemas de "sim e não":
Para problemas de múltiplos "sims e nãos":
Nesse segundo caso, "C" é a quantidade de classes independentes.
Como você deve estar imaginando, ela funciona melhor com a Sigmoid do que com a Softmax por tratarem a saída "da mesma forma" (como uma probabilidade independente).
Categorical Cross-Entropy (CCE)
Em alguns casos, você tem 3 ou mais classes, mas só uma delas é a correta (que era meu caso no problema do dataset iris). Nessa situação, a chance de a entrada ser classificada como uma classe deveria interferir na chance de ela ser classificada como uma das outras classes.
Faz sentido, não? Afinal nesse caso apenas uma classe pode estar correta, e se a chance de uma classe é alta, esperamos que as outras sejam baixas.
Aqui tem um detalhe importante, especialmente quando estamos falando de código. Seu conjunto de resultados desejados deve estar de acordo com o que a loss function espera, e nesse caso você vai encontrar dois tipos diferentes, CategoricalCrossEntropy e SparceCategoricalCrossEntropy. A diferença principal é justamente o que ela espera como conjunto de saídas desejadas:
-
CategoricalCrossEntropy: Espera um conjunto de vetores "one-hot", que é tipo um vetor com um valor para cada classe, só que todos os valores são 0 exceto o valor da classe esperada. (Ex:[0, 0, 1]significa que espera-se que o resultado seja a terceira classe.) -
SparseCategoricalCrossEntropy: Espera um número contendo o índice que representa a classe desejada. Pelo que eu vi os datasets do scikit normalmente usam esse modelo, e o dataset "iris" também era assim. (Ex:2significa que espera-se que o resultado seja a terceira classe.)
E por agora é isso. Espero que isso tenha ajudado a esclarecer a diferença dessas duas funções de perda e de ativação. Qualquer dúvida ou correção, deixem nos comentários.

Top comments (0)