03 / 09 Fonctions d'activation
  1. ← Réseaux de neurones : fondations et mathématiques
  2. 00 Avant-propos
  3. 01 Le neurone artificiel
  4. 02 Algèbre linéaire essentielle
  5. 03 Fonctions d'activation
  6. 04 Le perceptron
  7. 05 Du neurone au réseau multi-couches
  8. 06 Forward pass et fonctions de coût
  9. 07 Dérivées et règle de la chaîne
  10. 08 La rétropropagation
Réseaux de neurones : fondations et mathématiques · 03 / 09

Fonctions d'activation

Identity, sigmoïde, ReLU, tanh : pourquoi elles existent, ce qu'elles donnent, et comment choisir.

Aux chapitres 1 et 2 tu as croisé la fonction d’activation ff dans la formule y=f(wx+b)y = f(\mathbf{w} \cdot \mathbf{x} + b) sans qu’on lui consacre vraiment de temps. C’est l’objet de ce chapitre. On va voir pourquoi elle est mathématiquement indispensable, comparer les quatre classiques (Identity, sigmoïde, ReLU, tanh) et apprendre à les choisir.

Pourquoi a-t-on besoin d’une fonction non-linéaire

La démonstration qui justifie tout le reste

Imaginons un réseau à deux couches sans fonction d’activation, donc avec ff remplacée par l’identité. La sortie de la première couche est :

h=W1x+b1\mathbf{h} = W_1 \mathbf{x} + \mathbf{b}_1

La sortie de la seconde couche, appliquée à h\mathbf{h}, donne :

y=W2h+b2=W2(W1x+b1)+b2=(W2W1)x+(W2b1+b2)\mathbf{y} = W_2 \mathbf{h} + \mathbf{b}_2 = W_2 (W_1 \mathbf{x} + \mathbf{b}_1) + \mathbf{b}_2 = (W_2 W_1) \mathbf{x} + (W_2 \mathbf{b}_1 + \mathbf{b}_2)

En posant W=W2W1W' = W_2 W_1 et b=W2b1+b2\mathbf{b}' = W_2 \mathbf{b}_1 + \mathbf{b}_2, on retrouve :

y=Wx+b\mathbf{y} = W' \mathbf{x} + \mathbf{b}'

C’est une simple couche affine. Ajouter des couches sans non-linéarité ne sert mathématiquement à rien : on peut toujours réduire le tout à une seule couche équivalente. C’est la raison d’être de la fonction d’activation.

Cet argument se reproduit à chaque transition entre couches. C’est pourquoi on insère ff après chaque couche cachée, et pas seulement à la sortie : si une seule paire de couches contiguës n’a pas de non-linéarité entre elles, ces deux couches collapsent en une seule, et la profondeur perd à nouveau de l’intérêt.

Ce qu’on demande à une fonction d’activation

Pour être utilisable en pratique, une fonction ff doit cocher plusieurs cases :

  1. Non-linéaire (pour la raison qu’on vient de voir).
  2. Dérivable presque partout, pour que la backpropagation puisse calculer un gradient (sujet du chapitre 8).
  3. Calculable rapidement, parce qu’on l’évalue des millions de fois par seconde en entraînement.
  4. Bornée (idéalement), pour éviter que la sortie ne diverge.
  5. De gradient non-nul sur un intervalle large, sinon l’apprentissage stagne.

Les quatre classiques qu’on va étudier cochent ces cases à des degrés différents.

Les quatre fonctions classiques

Identity

L’identité est la fonction qui ne fait rien. On l’inclut pour la complétude et parce qu’on l’utilise sur la couche de sortie des problèmes de régression.

f(x) = x
Identity

Équation : f(x)=xf(x) = x. Dérivée : f(x)=1f'(x) = 1.

Tu peux ignorer cette fonction tant qu’on est dans les couches cachées, mais elle réapparaîtra au chapitre 6 quand on parlera de fonctions de coût pour la régression.

Sigmoïde

La sigmoïde Sigmoïde Fonction d'activation en forme de S qui prend n'importe quel nombre réel et le compresse dans l'intervalle ]0, 1[. Sa formule est σ(x) = 1 / (1 + e⁻ˣ). Historiquement la plus utilisée, elle est aujourd'hui souvent remplacée par ReLU dans les couches cachées. a dominé les réseaux de neurones entre 1986 et 2010. Sa forme en S compresse n’importe quel réel dans l’intervalle ouvert ]0,1[]0, 1[, ce qui permet d’interpréter sa sortie comme une probabilité.

σ(x) = 1 / (1 + e⁻ˣ)
Sigmoïde

Équation : σ(x)=11+ex\sigma(x) = \dfrac{1}{1 + e^{-x}}. Dérivée : σ(x)=σ(x)(1σ(x))\sigma'(x) = \sigma(x)(1 - \sigma(x)), propriété élégante qui simplifie la backpropagation.

Allure : courbe en S, σ(0)=0,5\sigma(0) = 0{,}5, σ()0\sigma(-\infty) \to 0, σ(+)1\sigma(+\infty) \to 1.

Usage moderne : couche de sortie des classifications binaires (où la sortie probabilité a un sens). Plus utilisée pour les couches cachées profondes à cause du vanishing gradient (on y revient juste après).

ReLU

La ReLU ReLU Fonction d'activation définie par ReLU(x) = max(0, x). Linéaire pour les valeurs positives, nulle pour les négatives. Simple, rapide à calculer, et résout en grande partie le problème du gradient qui disparaît. Standard de fait dans les couches cachées des réseaux profonds depuis 2012. Source : Nair et Hinton, 2010 est aujourd’hui le choix par défaut pour les couches cachées. Sa simplicité brutale est précisément ce qui la rend efficace.

ReLU(x) = max(0, x)
ReLU

Équation : ReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x). Dérivée : ReLU(x)=1[x>0]\text{ReLU}'(x) = \mathbb{1}[x > 0], soit 11 si x>0x > 0 et 00 sinon. Indéfinie strictement en x=0x = 0, mais on convient d’y mettre 00 ou 11 sans conséquence pratique.

Allure : nulle pour les négatifs, identité pour les positifs. Pas bornée vers le haut.

Usage moderne : depuis son introduction pour les RBM par Nair et Hinton (2010), ReLU et ses variantes (Leaky ReLU, ELU, GELU) sont devenues le choix dominant pour les couches cachées des réseaux profonds. Elle calcule en une seule opération, son gradient est exact (1 ou 0), et elle ne sature pas vers le haut. Inconvénient : si l’entrée d’un neurone est constamment négative, son gradient est nul et la backpropagation (chapitre 8) ne peut plus mettre à jour ses poids. Le neurone se fige. C’est le problème du dying ReLU, qu’on contourne avec les variantes.

Voir un neurone mourir

Le composant ci-dessous est un neurone ReLU à une entrée. Sa sortie est ReLU(wx+b)\text{ReLU}(w \cdot x + b), tracée en orange. Douze points d’un dataset uniforme sont marqués sur cette courbe : vert si le neurone s’active sur eux, rouge sinon. Pousse le biais vers les valeurs très négatives : tu verras tous les points basculer en rouge. À ce stade, le neurone n’apprendra plus, parce que son gradient est partout nul.

xReLU
7 / 12 actifs 5 inactifs
Sélectif

Diminue le biais pour pousser le neurone vers la mort. Si la sortie ReLU est nulle sur tout le dataset, son gradient l'est aussi et il n'apprendra plus.

Trois choses à essayer :

  • Place le biais à 2-2 avec un poids positif modéré. Le neurone meurt complètement sur tout le dataset.
  • Remets le biais à 00 et inverse le signe du poids. Tu vois que la frontière d’activation pivote autour de l’origine.
  • Cherche une configuration où exactement la moitié des points sont actifs. C’est typiquement un bon point de départ pour l’apprentissage.

Tanh

La tangente hyperbolique est la cousine centrée de la sigmoïde. Même allure en S, mais compresse dans ]1,1[]-1, 1[ au lieu de ]0,1[]0, 1[.

tanh(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)
Tanh

Équation : tanh(x)=exexex+ex\tanh(x) = \dfrac{e^x - e^{-x}}{e^x + e^{-x}}. Dérivée : tanh(x)=1tanh2(x)\tanh'(x) = 1 - \tanh^2(x).

Allure : courbe en S, tanh(0)=0\tanh(0) = 0, tanh()1\tanh(-\infty) \to -1, tanh(+)+1\tanh(+\infty) \to +1.

Usage moderne : prisée quand on veut une sortie centrée sur zéro (statistiquement préférable pour l’apprentissage). Souvent utilisée dans les RNN classiques (LSTM, GRU) et dans certaines couches d’attention.

Tableau récapitulatif

Une seule vue d’ensemble pour mémoriser les quatre fonctions classiques : forme, dérivée, plage de sortie, coût de calcul.

FonctionDéfinitionDérivéePlageCoût relatif
Identityf(x)=xf(x) = xf(x)=1f'(x) = 1R\mathbb{R}1× (référence)
Sigmoïdeσ(x)=11+ex\sigma(x) = \dfrac{1}{1 + e^{-x}}σ(x)=σ(x)(1σ(x))\sigma'(x) = \sigma(x)(1 - \sigma(x))(0,1)(0, 1)~10× (une exp)
Tanhtanh(x)=exexex+ex\tanh(x) = \dfrac{e^x - e^{-x}}{e^x + e^{-x}}tanh(x)=1tanh2(x)\tanh'(x) = 1 - \tanh^2(x)(1,1)(-1, 1)~10× (une exp en pratique)
ReLUReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x)ReLU(x)=1[x>0]\text{ReLU}'(x) = \mathbb{1}[x > 0][0,+)[0, +\infty)1× (un test)

Trois observations à garder en tête : (1) seules ReLU et Identity ont un coût aussi faible que le produit scalaire qui les précède ; (2) seules Sigmoïde et Tanh saturent et donc déclenchent le vanishing gradient ; (3) seule ReLU peut mourir, ce que les variantes modernes ci-dessous corrigent.

Les coûts relatifs sont des ordres de grandeur : la valeur exacte dépend du hardware (CPU vs GPU, FP32 vs FP16, présence d’instructions vectorielles ou de tables de lookup pour l’exponentielle). Sur un CPU sans optimisation matérielle de l’exponentielle, on est dans la zone indiquée ; sur un GPU moderne en FP16, l’écart entre ReLU et sigmoïde se resserre significativement. Note pratique : on calcule tanh comme tanh(x)=12/(e2x+1)\tanh(x) = 1 - 2 / (e^{2x} + 1), ce qui ne demande qu’une seule exponentielle malgré la formule définitionnelle qui en suggère deux.

La famille ReLU moderne

ReLU est le choix par défaut depuis 2012, mais les architectures de pointe (transformers, modèles de fondation, diffusion) ont adopté des variantes plus douces qui résolvent le dying ReLU tout en gardant l’essentiel des avantages.

Leaky ReLU

LeakyReLU(x) = max(α x, x)
Leaky ReLU

Équation : LeakyReLU(x)=max(αx,x)\text{LeakyReLU}(x) = \max(\alpha x, x), avec un petit coefficient α\alpha typiquement fixé à 0,010{,}01. Dérivée : α\alpha sur la partie négative, 11 sur la partie positive.

Au lieu de plaquer la sortie à zéro pour les entrées négatives, on laisse passer une petite pente α\alpha. Le neurone garde un gradient non nul de chaque côté et ne peut donc plus mourir. Introduite par Maas, Hannun et Ng (2013) pour la reconnaissance vocale.

GELU

GELU(x) = x · Φ(x)
GELU

Équation : GELU(x)=xΦ(x)\text{GELU}(x) = x \cdot \Phi(x), où Φ\Phi est la fonction de répartition de la loi normale standard. C’est l’activation des transformers de la fin des années 2010 (BERT, GPT-2, GPT-3) et elle reste très utilisée dans la plupart des transformers contemporains. Les architectures propriétaires plus récentes (GPT-4, Claude) ne publient pas leur choix d’activation. Dérivée : Φ(x)+xϕ(x)\Phi(x) + x \cdot \phi(x)ϕ\phi est la densité gaussienne.

Géométriquement, GELU se comporte presque comme ReLU loin de zéro, mais elle est lisse partout (donc dérivable partout, contrairement à ReLU). Introduite par Hendrycks et Gimpel (2016).

SiLU (Swish)

SiLU(x) = x · σ(x)
SiLU / Swish

Équation : SiLU(x)=xσ(x)\text{SiLU}(x) = x \cdot \sigma(x), où σ\sigma est la sigmoïde. C’est la même chose que la fonction « Swish » de Ramachandran et al. (2017), simplement renommée. Elle est la composante d’activation interne de SwiGLU, le bloc utilisé dans Llama (toutes générations), Mistral, Mixtral, PaLM et la plupart des LLMs ouverts récents. Elle apparaît aussi telle quelle dans EfficientNet. Dérivée : σ(x)+xσ(x)(1σ(x))\sigma(x) + x \cdot \sigma(x)(1 - \sigma(x)).

Forme très proche de GELU, légèrement moins chère à calculer (pas de fonction d’erreur, juste une sigmoïde). Décrite indépendamment par Elfwing, Uchibe et Doya (2018) sous le nom SiLU.

ELU

ELU(x) = x si x ≥ 0, sinon α(eˣ - 1)
ELU

Équation : ELU(x)=x\text{ELU}(x) = x si x0x \geq 0, sinon α(ex1)\alpha (e^x - 1), avec α\alpha typiquement à 11. Forme lisse sur la partie négative qui asymptote vers α-\alpha. Dérivée : 11 sur la partie positive, αex\alpha e^x sur la partie négative.

Plus chère que ReLU (une exponentielle sur la branche négative seulement) mais centre la sortie autour de zéro, ce qui aide la convergence. Introduite par Clevert, Unterthiner et Hochreiter (2015).

En 2026, le triplet ReLU / GELU / SiLU couvre l’écrasante majorité des architectures déployées en production. La règle pratique : ReLU pour la simplicité et la vitesse pure, GELU pour les transformers, SiLU pour les architectures denses récentes.

Joue avec les fonctions

L’idée d’une fonction d’activation se voit mieux qu’elle ne se raconte. Le composant ci-dessous est un atelier complet : tu peux activer ou désactiver chaque fonction individuellement (cliquer sur son label), afficher les dérivées en pointillés, activer un curseur qui place une ligne verticale et fait apparaître la tangente locale au point survolé pour chaque courbe (la pente de cette tangente, c’est exactement f(x)f'(x)). Un panneau dépliable en bas te permet aussi d’ajuster le domaine de xx si tu veux zoomer ou dézoomer.

Domaine de x
Fonctionf(x)f'(x)
Identity0.0001.000
Sigmoid0.5000.250
ReLU0.0000.000
Tanh0.0001.000

Les segments en pointillés autour de chaque point sont les tangentes locales. Une tangente plate signifie un gradient faible (apprentissage lent) ; une tangente raide signifie un gradient fort.

Cinq expériences à tenter :

  • À x=0x = 0, vérifie que σ(0)=0,5\sigma(0) = 0{,}5 et σ(0)=0,25\sigma'(0) = 0{,}25. La tangente de la sigmoïde est nette.
  • À x=2x = 2, observe que σ(2)\sigma'(2) est déjà tombée vers 0,10{,}1. La sigmoïde sature très vite, sa tangente est presque plate.
  • À x=3x = -3, ReLU et sa dérivée sont strictement à zéro. Sur cette branche, aucun gradient ne remonte.
  • Désactive Identity et Tanh pour comparer seulement sigmoïde et ReLU : on voit le contraste entre saturation et linéarité par morceaux.
  • Compare au centre la pente de la tangente de la sigmoïde (au max 0,250{,}25) avec celle de ReLU pour x>0x > 0 (toujours exactement 11). C’est la racine du vanishing gradient.

Le problème du vanishing gradient

Quand on dérive la sigmoïde, on voit que σ(x)=σ(x)(1σ(x))\sigma'(x) = \sigma(x)(1 - \sigma(x)). Le maximum est atteint pour x=0x = 0 et vaut 0,250{,}25. Donc, à chaque couche traversée, le gradient est multiplié par un facteur au plus égal à 0,250{,}25.

Pour un réseau de 10 couches utilisant sigmoïde, le gradient à la première couche est multiplié au maximum par 0,25109,5×1070{,}25^{10} \approx 9{,}5 \times 10^{-7}. C’est extrêmement faible : la première couche n’apprend plus. C’est le problème du vanishing gradient, observé pour la première fois par Hochreiter dans sa thèse (1991), analysé pour les réseaux récurrents par Bengio, Simard et Frasconi (1994), puis quantifié et corrigé pour les réseaux feedforward profonds par Glorot et Bengio (2010).

ReLU résout en grande partie ce problème : sur sa partie active, le gradient vaut exactement 11. Une multiplication par 11 ne réduit pas le gradient. C’est l’une des deux raisons (avec sa vitesse de calcul) de sa domination moderne.

Voir le gradient s’écraser

Le composant ci-dessous simule un réseau profond. Bouge le nombre de couches et change la fonction d’activation. Chaque barre représente le gradient effectif à une couche donnée, en partant de la sortie en haut vers l’entrée en bas. Sur sigmoïde tu vois les barres rétrécir à vue d’œil à mesure que la profondeur monte. Sur ReLU elles gardent leur longueur.

Couche 08
1.000
Couche 07
0.250
Couche 06
0.063
Couche 05
0.016
Couche 04
3.91e-3
Couche 03
9.77e-4
Couche 02
2.44e-4
Couche 01
6.10e-5
Gradient effectif à la première couche : 6.10e-5

La couche de sortie reçoit un gradient de référence de 1. Chaque couche traversée vers l'entrée le multiplie par la dérivée maximale de la fonction choisie : sigmoïde 0,25, tanh 1, ReLU 1.

L’expérience clé : passe à 1515 couches avec sigmoïde et regarde le gradient à la première couche. C’est de l’ordre de 10910^{-9}, totalement insuffisant pour ajuster un poids. Bascule maintenant sur ReLU et observe que les barres se remettent à toutes mesurer la même chose. C’est exactement la raison technique pour laquelle on a abandonné sigmoïde dans les couches cachées au profit de ReLU à partir de 2012.

Comment choisir en pratique

Une heuristique simple qui marche dans 95 % des cas :

CoucheChoix par défautVariantes
Couches cachéesReLULeaky ReLU, ELU, GELU pour les cas de dying ReLU
Sortie de classification binaireSigmoïde(aucune)
Sortie de classification multi-classeSoftmax (chapitre 6)(aucune)
Sortie de régressionIdentity(aucune)
Couches récurrentes (RNN, LSTM, GRU)Tanh + sigmoïde sur les portes(aucune)

Cette table est une heuristique, pas un dogme. Sur des architectures spécifiques (transformers, GANs, diffusion models), d’autres fonctions sont utilisées (GELU, Swish, Mish). Mais pour un réseau standard, ReLU partout sauf en sortie est un excellent point de départ.

En une phrase

La fonction d’activation est ce qui empêche un réseau profond de se réduire à une régression linéaire. Sigmoïde et tanh ont régné jusqu’à 2010, puis ReLU s’est imposée sur les couches cachées à partir de 2012. Le choix dépend du contexte mais reste rarement délicat en pratique.

Vers le chapitre 4

Tu as maintenant tous les ingrédients pour comprendre la machine qui apprend : entrées vectorielles (chap. 2), somme pondérée, biais et fonction d’activation (ce chapitre). Le chapitre 4 te présente le perceptron, le premier neurone qui ajuste ses poids tout seul à partir d’exemples. C’est la naissance de l’apprentissage automatique tel qu’on le connaît.

Subtilité que tu vas explorer : ce chapitre vient pourtant d’établir qu’une fonction d’activation doit être dérivable pour pouvoir calculer un gradient. Or le perceptron utilise la fonction de Heaviside, presque partout dérivable de dérivée nulle. Comment fait-il pour apprendre alors, sans gradient ? C’est précisément la question qui ouvre le chapitre suivant.

Exercices

Exercice 1 : dériver la sigmoïde

À partir de la définition σ(x)=11+ex\sigma(x) = \dfrac{1}{1 + e^{-x}}, démontrer que σ(x)=σ(x)(1σ(x))\sigma'(x) = \sigma(x)(1 - \sigma(x)).

Exercice 2 : calculer une dérivée à une valeur précise

Calculer σ(0)\sigma'(0), puis σ(2)\sigma'(2). Comparer ces deux valeurs. Que peux-tu en déduire sur le comportement du gradient pour des entrées éloignées de zéro ?

Exercice 3 : comparer la vitesse

Soit un neurone qui prend en entrée 1000 valeurs. Combien d’opérations arithmétiques élémentaires (additions, multiplications, exponentielles) sont nécessaires pour calculer la sortie d’un neurone avec activation ReLU ? Avec activation sigmoïde ? La différence te paraît-elle marginale ou significative quand tu multiplies par des millions d’évaluations ?

Sources

  • Nair, V. & Hinton, G. E. (2010). « Rectified Linear Units Improve Restricted Boltzmann Machines. » ICML 27. Lien ICML
  • Glorot, X. & Bengio, Y. (2010). « Understanding the difficulty of training deep feedforward neural networks. » AISTATS 9, 249-256. Lien AISTATS
  • Cox, D. R. (1958). « The Regression Analysis of Binary Sequences. » Journal of the Royal Statistical Society 20(2), 215-242. (Origine historique de la fonction logistique). DOI 10.1111/j.2517-6161.1958.tb00292.x

Pour aller plus loin

  • Goodfellow, I., Bengio, Y. & Courville, A. (2016). Deep Learning. MIT Press. Section 6.3 sur les fonctions d’activation et leurs variantes. deeplearningbook.org
  • Maas, A. L., Hannun, A. Y. & Ng, A. Y. (2013). « Rectifier Nonlinearities Improve Neural Network Acoustic Models. » ICML 30, Workshop on Deep Learning for Audio, Speech and Language Processing. (Introduction de la Leaky ReLU). Lien Stanford
  • Hendrycks, D. & Gimpel, K. (2016). « Gaussian Error Linear Units (GELUs). » arXiv. arXiv 1606.08415
  • Ramachandran, P., Zoph, B. & Le, Q. V. (2017). « Searching for Activation Functions. » arXiv. (Recherche automatisée d’activations, introduit la famille Swish, équivalente à SiLU). arXiv 1710.05941
  • Elfwing, S., Uchibe, E. & Doya, K. (2018). « Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning. » Neural Networks 107, 3-11. (Description originale de SiLU). arXiv 1702.03118
  • Clevert, D.-A., Unterthiner, T. & Hochreiter, S. (2015). « Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs). » arXiv. arXiv 1511.07289
Quiz
  1. 1. Pourquoi une fonction d'activation non-linéaire est-elle indispensable dans un réseau profond ?

  2. 2. Quelle est la dérivée de la sigmoïde σ(x) ?

  3. 3. Pourquoi ReLU domine-t-elle les couches cachées des réseaux profonds depuis 2012 ?

  4. 4. Sur une classification binaire, quelle fonction d'activation utilise-t-on typiquement en sortie ?

  5. 5. Pour un réseau profond de 10 couches utilisant la sigmoïde partout, que peut-il arriver lors de l'entraînement ?