Utilisation de la fonction d'activation Softmax pour la classification multi-classes
Dans la dernière couche de `` CNN '', il est courant d'utiliser des fonctions d'activation softmax pour la classification multi-classes.J'aimerais savoir s'il est nécessaire d'utiliser une fonction d'activation softmax lors de la création d'un CNN pour la tâche de classification d'images, et n'a-t-il rien à voir avec l'optimiseur utilisé pour former le modèle?
Réponses
Softmax génère un vecteur de probabilité. Cela signifie que
- les éléments sont non négatifs et
- la somme des éléments est de 1.
Pour entraîner un modèle de classification avec $m \ge 3$classes, l'approche standard consiste à utiliser softmax comme activation finale avec perte d'entropie croisée multinomiale. Pour une seule instance, la perte est
$$ \begin{align} \mathcal{L} &= -\sum_{j=1}^m y_j \log(p_j) \end{align} $$
où $y$ est un vecteur avec une valeur de 1 et le reste zéro et $p_j$sont nos probabilités prédites à partir du softmax. Si la valeur unique de 1 dans$y$ est à l'index $k$, alors la perte atteint une valeur minimale de 0 lorsque $p_k = 1$. Lorsque$p_k=1$, cela implique que le reste du $p_{j\neq k}$ sont tous à 0 (parce que $p$ est un vecteur de probabilités, donc le total est 1).
Dans un commentaire, OP propose d'utiliser ReLU au lieu de softmax. Cependant, cette proposition pose certains problèmes.
Vous pouvez toujours rencontrer $\log(0)$, car ReLU peut renvoyer des zéros. (Mais ce n'est pas fatal, car on peut le "patcher"; une activation ReLU strictement positive comme$\text{ReLU}(x)+\epsilon$ pour certains petits $\epsilon>0$ évite cela.)
Pour les ReLU, la somme de $p$peut être n'importe quelle valeur non négative. Ce n'est pas une probabilité. Parce que$-\log(p_k)$ diminue sans limite comme $p_k$augmente, le modèle n'arrêtera jamais de s'entraîner. (Mais ce n'est pas fatal; pénaliser les poids et les biais ou les contraindre autrement les empêchera de dériver vers$\pm\infty$.) Par contre, pour softmax, le plus grand $p_k$ peut jamais être égal à 1, donc la perte minimale est égale à 0.
ReLU ne force pas un compromis entre les unités, contrairement à softmax. Cela signifie que si vous utilisez softmax, vous souhaitez augmenter la valeur de$p_k$tu dois diminuer $\sum_{i\neq k} p_i$. La perte sera élevée chaque fois$p$ et $y$sont différents. En revanche, le modèle ReLU peut simplement renvoyer un vecteur de constantes et avoir la même perte, quelle que soit l'étiquette. Considérons le cas à trois classes où la prédiction correcte est la deuxième classe, nous avons$$\mathcal{L}=-0\times \log(c)-1\times\log(c)-0\times\log(c)=-\log(c).$$ De même, cette même perte de est obtenue pour le même $p$et tout vecteur d'étiquette$y$.
De toute évidence, (3) est fatal car le modèle ne dispose d'aucune information utile sur la classe la plus probable. Un modèle qui peut toujours réduire la perte en ignorant entièrement l'entrée est un modèle bidon.
Le détail clé de softmax est qu'il force un compromis entre les valeurs de $p$, car attribuer une probabilité à la classe incorrecte est pénalisé. Le seul modèle softmax qui a 0 perte d'entropie croisée multinomiale est le modèle qui attribue une probabilité de 1 à la classe correcte pour toutes les instances.
Softmax n'est pas la seule fonction que vous pouvez utiliser. Une fonction comme
$$ f(z)_i = \frac{\text{softplus}(z_i)}{\sum_i \text{softplus}(z_i)} $$ où se trouve la fonction softplus
$$ \text{softplus}(x)=\log(1+\exp(x)) $$ pourrait également fonctionner pour un modèle de classification multi-classes car $f$ est
- positif (évite de diviser par zéro),
- non négatif et somme à 1 (est une probabilité), et
- croissant monotone.
Nous nous soucions de la monotonie parce que nous voulons que la propriété soit aussi grande $z_i$impliquent de grandes probabilités. Une fonction non monotone comme la mise au carré ou la valeur absolue signifie que nous prédisons une certaine classe pour des valeurs très grandes ou très petites. Voir: Pourquoi la fonction softmax est-elle utilisée pour calculer les probabilités alors que nous pouvons diviser chaque valeur par la somme du vecteur?