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 Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(16, input_dim=20, activation='relu')) # Camada oculta
model.add(Dense(1, activation='sigmoid')) # Camada de saída para classificação binária
model.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:
xxxxxxxxxx
model = Sequential()
model.add(Dense(16, input_dim=20, activation='relu')) # Camada oculta
model.add(Dense(10, activation='softmax')) # Camada de saída para 10 classes
model.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:
xxxxxxxxxx
model = Sequential()
model.add(Dense(16, input_dim=20, activation='relu')) # Camada oculta
model.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:
xxxxxxxxxx
import tensorflow as tf
model = Sequential()
model.add(Dense(16, input_dim=20, activation='relu')) # Camada oculta
model.add(Dense(1)) # Camada de saída para regressão
model.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:
xxxxxxxxxx
model = Sequential()
model.add(Dense(16, input_dim=20, activation='relu')) # Camada oculta
model.add(Dense(1, activation='tanh')) # Camada de saída para classificação binária
model.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:
xxxxxxxxxx
model = Sequential()
model.add(Dense(16, input_dim=20, activation='relu')) # Camada oculta
model.add(Dense(1, activation='exponential')) # Camada de saída para contagem
model.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:
xxxxxxxxxx
model = Sequential()
model.add(Dense(16, input_dim=20, activation='relu')) # Camada oculta
model.add(Dense(1)) # Camada de saída para similaridade
model.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