Comment choisir une fonction d'activation pour le Deep Learning
Les fonctions d'activation constituent un élément essentiel de la conception d'un réseau neuronal.
Le choix de la fonction d'activation dans la couche cachée contrôlera dans quelle mesure le modèle de réseau apprend l'ensemble de données de formation. Le choix de la fonction d'activation dans la couche de sortie définira le type de prédictions que le modèle peut faire.
En tant que tel, un choix judicieux de la fonction d’activation doit être fait pour chaque projet de réseau neuronal d’apprentissage profond.
Dans ce tutoriel, vous découvrirez comment choisir les fonctions d'activation pour les modèles de réseaux de neurones.
Après avoir terminé ce tutoriel, vous saurez :
- Les fonctions d'activation sont un élément clé de la conception des réseaux neuronaux.
- La fonction d'activation par défaut moderne pour les couches cachées est la fonction ReLU.
- La fonction d'activation des couches de sortie dépend du type de problème de prédiction.
Commençons.
Présentation du didacticiel
Ce didacticiel est divisé en trois parties : ils sont:
- Fonctions d'activation
- Activation des calques masqués
- Activation pour les couches de sortie
Fonctions d'activation
Une fonction d'activation dans un réseau neuronal définit comment la somme pondérée de l'entrée est transformée en sortie d'un ou plusieurs nœuds d'une couche du réseau.
Parfois, la fonction d'activation est appelée « fonction de transfert ». Si la plage de sortie de la fonction d'activation est limitée, elle peut alors être appelée « fonction d'écrasement ». De nombreuses fonctions d'activation sont non linéaires et peuvent être appelées « non-linéarité » dans la couche ou dans la conception du réseau.
Le choix de la fonction d'activation a un impact important sur la capacité et les performances du réseau neuronal, et différentes fonctions d'activation peuvent être utilisées dans différentes parties du modèle.
Techniquement, la fonction d'activation est utilisée pendant ou après le traitement interne de chaque nœud du réseau, bien que les réseaux soient conçus pour utiliser la même fonction d'activation pour tous les nœuds d'une couche.
Un réseau peut avoir trois types de couches : des couches d'entrée qui récupèrent les entrées brutes du domaine, des couches cachées qui récupèrent les entrées d'une autre couche et transmettent la sortie à une autre couche, et des couches de sortie . qui font une prédiction.
Toutes les couches masquées utilisent généralement la même fonction d'activation. La couche de sortie utilisera généralement une fonction d'activation différente de celle des couches cachées et dépend du type de prédiction requis par le modèle.
Les fonctions d'activation sont également généralement différentiables, ce qui signifie que la dérivée du premier ordre peut être calculée pour une valeur d'entrée donnée. Cela est nécessaire étant donné que les réseaux de neurones sont généralement formés à l'aide de l'algorithme de rétropropagation d'erreur qui nécessite la dérivée de l'erreur de prédiction afin de mettre à jour les poids du modèle.
Il existe de nombreux types différents de fonctions d'activation utilisées dans les réseaux de neurones, même si peut-être seulement un petit nombre de fonctions sont utilisées en pratique pour les couches cachées et de sortie.
Jetons un coup d'œil aux fonctions d'activation utilisées tour à tour pour chaque type de couche.
Activation des calques masqués
Une couche cachée dans un réseau neuronal est une couche qui reçoit les entrées d'une autre couche (telle qu'une autre couche cachée ou une couche d'entrée) et fournit une sortie à une autre couche (telle qu'une autre couche cachée ou une couche de sortie).
Une couche cachée ne contacte pas directement les données d'entrée ni ne produit de sorties pour un modèle, du moins en général.
Un réseau de neurones peut avoir zéro ou plusieurs couches cachées.
Généralement, une fonction d'activation non linéaire différentiable est utilisée dans les couches cachées d'un réseau neuronal. Cela permet au modèle d'apprendre des fonctions plus complexes qu'un réseau formé à l'aide d'une fonction d'activation linéaire.
Afin d'accéder à un espace d'hypothèses beaucoup plus riche qui bénéficierait de représentations profondes, vous avez besoin d'une fonction de non-linéarité ou d'activation.
— Page 72, Deep Learning avec Python, 2017.
Il existe peut-être trois fonctions d'activation que vous souhaiterez peut-être envisager d'utiliser dans les couches cachées : ils sont:
- Activation Linéaire Rectifiée (ReLU)
- Logistique (Sigmoïde)
- Tangente hyperbolique (Tanh)
Il ne s'agit pas d'une liste exhaustive des fonctions d'activation utilisées pour les couches cachées, mais ce sont les plus couramment utilisées.
Examinons-les de plus près tour à tour.
Fonction d'activation de la couche cachée ReLU
La fonction d'activation linéaire rectifiée, ou fonction d'activation ReLU, est peut-être la fonction la plus couramment utilisée pour les couches cachées.
Cette méthode est courante car elle est à la fois simple à mettre en œuvre et efficace pour surmonter les limitations d’autres fonctions d’activation auparavant populaires, telles que Sigmoid et Tanh. Plus précisément, il est moins sensible aux gradients de disparition qui empêchent l'entraînement des modèles profonds, bien qu'il puisse souffrir d'autres problèmes comme des unités saturées ou « mortes ».
La fonction ReLU est calculée comme suit :
- maximum(0,0, x)
Cela signifie que si la valeur d'entrée (x) est négative, alors une valeur 0,0 est renvoyée, sinon la valeur est renvoyée.
Vous pouvez en savoir plus sur les détails de la fonction d'activation ReLU dans ce tutoriel :
- Une introduction douce à l'unité linéaire rectifiée (ReLU)
Nous pouvons avoir une intuition de la forme de cette fonction avec l’exemple concret ci-dessous.
# example plot for the relu activation function
from matplotlib import pyplot
# rectified linear function
def rectified(x):
return max(0.0, x)
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [rectified(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
L’exécution de l’exemple calcule les sorties pour une plage de valeurs et crée un graphique des entrées par rapport aux sorties.
Nous pouvons voir la forme familière de la fonction d’activation ReLU.
Lorsque vous utilisez la fonction ReLU pour les couches cachées, il est recommandé d'utiliser une initialisation de poids « He Normal » ou « He Uniform » et de mettre à l'échelle les données d'entrée dans la plage 0. -1 (normaliser) avant l'entraînement.
Fonction d'activation de la couche cachée sigmoïde
La fonction d’activation sigmoïde est également appelée fonction logistique.
Il s'agit de la même fonction utilisée dans l'algorithme de classification par régression logistique.
La fonction prend n'importe quelle valeur réelle en entrée et génère des valeurs comprises entre 0 et 1. Plus l'entrée est grande (plus positive), plus la valeur de sortie sera proche de 1,0, tandis que plus l'entrée est petite (plus négative), plus la valeur est proche. la sortie sera à 0,0.
La fonction d'activation sigmoïde est calculée comme suit :
- 1,0/(1,0 + e^-x)
Où e est une constante mathématique, qui est la base du logarithme népérien.
Nous pouvons avoir une intuition de la forme de cette fonction avec l’exemple concret ci-dessous.
# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot
# sigmoid activation function
def sigmoid(x):
return 1.0 / (1.0 + exp(-x))
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [sigmoid(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
L’exécution de l’exemple calcule les sorties pour une plage de valeurs et crée un graphique des entrées par rapport aux sorties.
Nous pouvons voir la forme familière en S de la fonction d’activation sigmoïde.
Lorsque vous utilisez la fonction Sigmoïde pour les couches cachées, il est recommandé d'utiliser une initialisation de poids « Xavier Normal » ou « Xavier Uniform » (également appelée initialisation Glorot, nommée pour Xavier Glorot) et mettre à l'échelle les données d'entrée dans la plage 0-1 (par exemple la plage de la fonction d'activation) avant l'entraînement.
Fonction d'activation de la couche cachée Tanh
La fonction d'activation de la tangente hyperbolique est également appelée simplement fonction Tanh (également « tanh » et « TanH »).
Elle est très similaire à la fonction d’activation sigmoïde et a même la même forme en S.
La fonction prend n'importe quelle valeur réelle comme entrée et génère des valeurs comprises entre -1 et 1. Plus l'entrée est grande (plus positive), plus la valeur de sortie sera proche de 1,0, tandis que plus l'entrée est petite (plus négative), plus la valeur de sortie est proche de 1,0. la sortie sera à -1,0.
La fonction d'activation Tanh est calculée comme suit :
- (e^x – e^-x)/(e^x + e^-x)
Où e est une constante mathématique qui constitue la base du logarithme népérien.
Nous pouvons avoir une intuition de la forme de cette fonction avec l’exemple concret ci-dessous.
# example plot for the tanh activation function
from math import exp
from matplotlib import pyplot
# tanh activation function
def tanh(x):
return (exp(x) - exp(-x)) / (exp(x) + exp(-x))
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [tanh(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
L’exécution de l’exemple calcule les sorties pour une plage de valeurs et crée un graphique des entrées par rapport aux sorties.
Nous pouvons voir la forme familière en S de la fonction d’activation Tanh.
Lorsque vous utilisez la fonction TanH pour les couches cachées, il est recommandé d'utiliser une initialisation de poids « Xavier Normal » ou « Xavier Uniform » (également appelée initialisation Glorot, nommée pour Xavier Glorot) et mettre à l'échelle les données d'entrée dans la plage -1 à 1 (par exemple la plage de la fonction d'activation) avant l'entraînement.
Comment choisir une fonction d'activation de couche cachée
Un réseau de neurones aura presque toujours la même fonction d’activation dans toutes les couches cachées.
Il est très inhabituel de faire varier la fonction d'activation via un modèle de réseau.
Traditionnellement, la fonction d’activation sigmoïde était la fonction d’activation par défaut dans les années 1990. Peut-être du milieu à la fin des années 1990 jusqu’aux années 2010, la fonction Tanh était la fonction d’activation par défaut pour les couches cachées.
… la fonction d’activation tangente hyperbolique fonctionne généralement mieux que la sigmoïde logistique.
— Page 195, Apprentissage profond, 2016.
Les fonctions sigmoïde et Tanh peuvent rendre le modèle plus sensible aux problèmes lors de l'entraînement, via ce que l'on appelle le problème des gradients de disparition.
Vous pouvez en savoir plus sur ce problème dans ce tutoriel :
- Une introduction douce à l'unité linéaire rectifiée (ReLU)
La fonction d'activation utilisée dans les couches cachées est généralement choisie en fonction du type d'architecture de réseau neuronal.
Les modèles de réseaux neuronaux modernes avec des architectures communes, telles que MLP et CNN, utiliseront la fonction d'activation ou les extensions ReLU.
Dans les réseaux de neurones modernes, la recommandation par défaut est d’utiliser l’unité linéaire rectifiée ou ReLU…
— Page 174, Apprentissage profond, 2016.
Les réseaux récurrents utilisent encore couramment les fonctions d'activation Tanh ou sigmoïde, voire les deux. Par exemple, le LSTM utilise couramment l'activation Sigmoïde pour les connexions récurrentes et l'activation Tanh pour la sortie.
- Multilayer Perceptron (MLP) : fonction d'activation ReLU.
- Convolutional Neural Network (CNN) : fonction d'activation ReLU.
- Réseau neuronal récurrent : fonction d'activation Tanh et/ou Sigmoïde.
Si vous ne savez pas quelle fonction d'activation utiliser pour votre réseau, essayez-en quelques-unes et comparez les résultats.
La figure ci-dessous résume comment choisir une fonction d'activation pour les couches cachées de votre modèle de réseau neuronal.
Activation pour les couches de sortie
La couche de sortie est la couche d'un modèle de réseau neuronal qui génère directement une prédiction.
Tous les modèles de réseaux neuronaux à action directe ont une couche de sortie.
Il existe peut-être trois fonctions d'activation que vous souhaiterez peut-être envisager d'utiliser dans la couche de sortie : ils sont:
- Linéaire
- Logistique (Sigmoïde)
- Softmax
Il ne s’agit pas d’une liste exhaustive des fonctions d’activation utilisées pour les couches de sortie, mais ce sont les plus couramment utilisées.
Examinons-les de plus près tour à tour.
Fonction d'activation de sortie linéaire
La fonction d'activation linéaire est également appelée « identité » (multipliée par 1,0) ou « pas d'activation ».
En effet, la fonction d'activation linéaire ne modifie en aucun cas la somme pondérée de l'entrée et renvoie directement la valeur.
Nous pouvons avoir une intuition de la forme de cette fonction avec l’exemple concret ci-dessous.
# example plot for the linear activation function
from matplotlib import pyplot
# linear activation function
def linear(x):
return x
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [linear(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
L’exécution de l’exemple calcule les sorties pour une plage de valeurs et crée un graphique des entrées par rapport aux sorties.
Nous pouvons voir une forme de ligne diagonale où les entrées sont tracées par rapport aux sorties identiques.
Les valeurs cibles utilisées pour entraîner un modèle avec une fonction d'activation linéaire dans la couche de sortie sont généralement mises à l'échelle avant la modélisation à l'aide de transformations de normalisation ou de standardisation.
Fonction d'activation de la sortie sigmoïde
La fonction d'activation sigmoïde de la logistique a été décrite dans la section précédente.
Néanmoins, pour ajouter un peu de symétrie, nous pouvons revoir la forme de cette fonction avec l'exemple concret ci-dessous.
# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot
# sigmoid activation function
def sigmoid(x):
return 1.0 / (1.0 + exp(-x))
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [sigmoid(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
L’exécution de l’exemple calcule les sorties pour une plage de valeurs et crée un graphique des entrées par rapport aux sorties.
Nous pouvons voir la forme familière en S de la fonction d’activation sigmoïde.
Les étiquettes cibles utilisées pour entraîner un modèle avec une fonction d'activation sigmoïde dans la couche de sortie auront les valeurs 0 ou 1.
Fonction d'activation de sortie Softmax
La fonction softmax génère un vecteur de valeurs dont la somme est égale à 1,0 qui peut être interprétée comme des probabilités d'appartenance à une classe.
Il est lié à la fonction argmax qui génère un 0 pour toutes les options et un 1 pour l'option choisie. Softmax est une version « plus douce » d'argmax qui permet une sortie de type probabilité d'une fonction gagnant-gagnant.
En tant que tel, l'entrée de la fonction est un vecteur de valeurs réelles et la sortie est un vecteur de même longueur avec des valeurs dont la somme est égale à 1,0 comme des probabilités.
La fonction softmax est calculée comme suit :
- e^x/somme(e^x)
Où x est un vecteur de sorties et e est une constante mathématique qui est la base du logarithme népérien.
Vous pouvez en savoir plus sur les détails de la fonction Softmax dans ce tutoriel :
- Fonction d'activation Softmax avec Python
Nous ne pouvons pas tracer la fonction softmax, mais nous pouvons donner un exemple de calcul en Python.
from numpy import exp
# softmax activation function
def softmax(x):
return exp(x) / exp(x).sum()
# define input data
inputs = [1.0, 3.0, 2.0]
# calculate outputs
outputs = softmax(inputs)
# report the probabilities
print(outputs)
# report the sum of the probabilities
print(outputs.sum())
L'exécution de l'exemple calcule la sortie softmax pour le vecteur d'entrée.
Nous confirmons alors que la somme des sorties du softmax correspond bien à la valeur 1,0.
[0.09003057 0.66524096 0.24472847]
1.0
Les étiquettes cibles utilisées pour entraîner un modèle avec la fonction d'activation softmax dans la couche de sortie seront des vecteurs avec 1 pour la classe cible et 0 pour toutes les autres classes.
Comment choisir une fonction d'activation de sortie
Vous devez choisir la fonction d'activation pour votre couche de sortie en fonction du type de problème de prédiction que vous résolvez.
Plus précisément, le type de variable prédite.
Par exemple, vous pouvez diviser les problèmes de prédiction en deux groupes principaux : prédire une variable catégorielle (classification) et prédire une variable numérique (régression).
Si votre problème est un problème de régression, vous devez utiliser une fonction d'activation linéaire.
- Régression : un nœud, activation linéaire.
Si votre problème est un problème de classification, il existe trois principaux types de problèmes de classification et chacun peut utiliser une fonction d'activation différente.
Prédire une probabilité n’est pas un problème de régression ; c'est le classement. Dans tous les cas de classification, votre modèle prédira la probabilité d'appartenance à une classe (par exemple, la probabilité qu'un exemple appartienne à chaque classe) que vous pourrez convertir en une étiquette de classe nette en arrondissant (pour sigmoïde) ou en argmax (pour softmax).
S'il existe deux classes mutuellement exclusives (classification binaire), alors votre couche de sortie aura un nœud et une fonction d'activation sigmoïde devra être utilisée. S'il existe plus de deux classes mutuellement exclusives (classification multiclasse), alors votre couche de sortie aura un nœud par classe et une activation softmax devra être utilisée. S'il existe deux ou plusieurs classes mutuellement inclusives (classification multi-étiquettes), votre couche de sortie aura un nœud pour chaque classe et une fonction d'activation sigmoïde est utilisée.
- Classification binaire : un nœud, activation sigmoïde.
- Classification multiclasse : un nœud par classe, activation softmax.
- Classification multilabel : un nœud par classe, activation sigmoïde.
La figure ci-dessous résume comment choisir une fonction d'activation pour la couche de sortie de votre modèle de réseau neuronal.
Lectures complémentaires
Cette section fournit plus de ressources sur le sujet si vous souhaitez approfondir.
Tutoriels
- Une introduction douce à l'unité linéaire rectifiée (ReLU)
- Fonction d'activation Softmax avec Python
- 4 types de tâches de classification dans l'apprentissage automatique
- Comment résoudre le problème des dégradés qui disparaissent à l'aide de ReLU
Livres
- Apprentissage profond, 2016.
- Neural Smithing : apprentissage supervisé dans les réseaux de neurones artificiels Feedforward, 1999.
- Réseaux de neurones pour la reconnaissance de formes, 1996.
- Apprentissage profond avec Python, 2017.
Articles
- Fonction d'activation, Wikipédia.
Résumé
Dans ce didacticiel, vous avez découvert comment choisir les fonctions d'activation pour les modèles de réseaux neuronaux.
Concrètement, vous avez appris :
- Les fonctions d'activation sont un élément clé de la conception des réseaux neuronaux.
- La fonction d'activation par défaut moderne pour les couches cachées est la fonction ReLU.
- La fonction d'activation des couches de sortie dépend du type de problème de prédiction.
Avez-vous des questions ?
Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.