Funções de Custo $\times$ Funções de AtivaçãoIntro 1. Classificação Binária2. Classificação Multiclasse3. Regressão4. Problemas com Outliers (Regressão)5. Classificação com Margem Máxima (SVM-like)6. Problemas de Contagem (Distribuição de Poisson)7. Comparação de SimilaridadeResumo das Combinações RecomendadasDicas Gerais
A escolha da função de custo e da função de ativação em uma rede neural multicamadas é crucial para garantir uma convergência eficiente e estável durante o treinamento. A combinação adequada entre função de custo e função de ativação depende do tipo de problema (classificação, regressão, etc.) e da arquitetura da rede. Abaixo, segue lista das Funções de Custo mais comuns e eficientes para certo tipo de Função de Ativação.
Função de Custo: BinaryCrossentropy
Função de Ativação (camada de saída): Sigmoid
Justificativa:
Sigmoid mapeia a saída para um valor entre 0 e 1, representando a probabilidade de pertencer à classe positiva.BinaryCrossentropy é projetada para problemas de classificação binária, onde a saída é uma probabilidade.Exemplo:
xfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Densemodel = Sequential()model.add(Dense(16, input_dim=20, activation='relu')) # Camada ocultamodel.add(Dense(1, activation='sigmoid')) # Camada de saída para classificação bináriamodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])Função de Custo: CategoricalCrossentropy (rótulos one-hot) ou SparseCategoricalCrossentropy (rótulos inteiros)
Função de Ativação (camada de saída): Softmax
Justificativa:
Softmax normaliza as saídas para que representem uma distribuição de probabilidade sobre as classes.CategoricalCrossentropy é adequada para problemas com múltiplas classes, onde cada classe é representada por um vetor one-hot.Exemplo:
xxxxxxxxxxmodel = Sequential()model.add(Dense(16, input_dim=20, activation='relu')) # Camada ocultamodel.add(Dense(10, activation='softmax')) # Camada de saída para 10 classesmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])Função de Custo: MeanSquaredError (MSE) ou MeanAbsoluteError (MAE)
Função de Ativação (camada de saída): Nenhuma (saída linear) ou ReLU (se os valores forem positivos)
Justificativa:
Exemplo:
xxxxxxxxxxmodel = Sequential()model.add(Dense(16, input_dim=20, activation='relu')) # Camada ocultamodel.add(Dense(1)) # Camada de saída para regressão (sem ativação)model.compile(optimizer='adam', loss='mean_squared_error')Função de Custo: Huber ou LogCosh
Função de Ativação (camada de saída): Nenhuma (saída linear)
Justificativa:
Huber combina as vantagens do MSE e do MAE, sendo menos sensível a outliers.LogCosh é suave e menos sensível a grandes erros.Exemplo:
xxxxxxxxxximport tensorflow as tfmodel = Sequential()model.add(Dense(16, input_dim=20, activation='relu')) # Camada ocultamodel.add(Dense(1)) # Camada de saída para regressãomodel.compile(optimizer='adam', loss=tf.keras.losses.Huber(delta=1.0))Função de Custo: Hinge
Função de Ativação (camada de saída): Tanh ou Linear
Justificativa:
Hinge é usada em problemas de classificação binária onde se deseja maximizar a margem entre as classes, semelhante a uma SVM (Support Vector Machine).Exemplo:
xxxxxxxxxxmodel = Sequential()model.add(Dense(16, input_dim=20, activation='relu')) # Camada ocultamodel.add(Dense(1, activation='tanh')) # Camada de saída para classificação bináriamodel.compile(optimizer='adam', loss='hinge', metrics=['accuracy'])Função de Custo: Poisson
Função de Ativação (camada de saída): Exponential ou Softplus
Justificativa:
Poisson é adequada para problemas onde a saída representa contagens ou eventos raros, seguindo uma distribuição de Poisson.Exemplo:
xxxxxxxxxxmodel = Sequential()model.add(Dense(16, input_dim=20, activation='relu')) # Camada ocultamodel.add(Dense(1, activation='exponential')) # Camada de saída para contagemmodel.compile(optimizer='adam', loss='poisson')Função de Custo: CosineSimilarity
Função de Ativação (camada de saída): Nenhuma (saída linear)
Justificativa:
CosineSimilarity mede a similaridade entre dois vetores, sendo útil em problemas como embedding ou recomendação.Exemplo:
xxxxxxxxxxmodel = Sequential()model.add(Dense(16, input_dim=20, activation='relu')) # Camada ocultamodel.add(Dense(1)) # Camada de saída para similaridademodel.compile(optimizer='adam', loss='cosine_similarity')| Tipo de Problema | Função de Custo | Função de Ativação (Saída) |
|---|---|---|
| Classificação Binária | BinaryCrossentropy | Sigmoid |
| Classificação Multiclasse | CategoricalCrossentropy | Softmax |
| Regressão | MeanSquaredError (MSE) | Nenhuma (Linear) |
| Regressão com Outliers | Huber ou LogCosh | Nenhuma (Linear) |
| Classificação com Margem Máxima | Hinge | Tanh ou Linear |
| Problemas de Contagem | Poisson | Exponential ou Softplus |
| Similaridade | CosineSimilarity | Nenhuma (Linear) |
HeNormal ou GlorotUniform) para evitar problemas de vanishing/exploding gradients.accuracy para classificação ou mean_absolute_error para regressão para monitorar o desempenho.Essas combinações são amplamente utilizadas e comprovadas na prática, mas a escolha final pode depender das características específicas do seu problema e dos dados.
20/03/2025