2. Perceptron multicouche
Un perceptron est une unité, \(a = g(w^T x + b)\). Empilez plusieurs unités qui lisent la même entrée et vous obtenez une couche, empilez des couches et vous obtenez un perceptron multicouche (MLP). Ce module construit le MLP à partir d'unités, écrit la propagation avant pour un exemple et pour un mini-lot, suit les dimensions et le nombre de paramètres, et énonce le théorème d'approximation universelle.
Objectifs
- Construire une couche comme un empilement d'unités de type perceptron lisant une entrée partagée.
- Écrire la propagation avant pour un exemple avec des poids et un biais explicites par couche.
- Vectoriser la passe avant sur un mini-lot avec un biais diffusé.
- Suivre la dimension de chaque \(W^{[l]}\) et \(b^{[l]}\) et compter les paramètres.
- Énoncer le théorème d'approximation universelle et opposer la largeur à la profondeur.
2.1 D'une unité à une couche
2.1.1 Une seule unité
Une unité prend un vecteur d'entrée \(x \in \mathbb{R}^{n_0}\), forme une somme pondérée avec un vecteur de poids \(w\) et un biais scalaire \(b\), puis applique une activation non linéaire \(g\) :
\[\boxed{ a = g\left(w^T x + b\right) }\]C'est le perceptron du cours précédent, sauf que le seuil dur est maintenant une activation lisse comme la sigmoïde ou la ReLU. L'activation est nommée ici et définie complètement dans la leçon suivante.
2.1.2 Une couche d'unités
Placez maintenant \(n_1\) unités côte à côte, lisant toutes la même entrée \(x\). L'unité \(i\) possède son propre vecteur de poids \(w_i\) et son biais \(b_i\), produisant \(a_i = g(w_i^T x + b_i)\). Rassemblez les vecteurs de poids comme les lignes d'une matrice \(W^{[1]}\) et les biais dans un vecteur \(b^{[1]}\) :
\[\boxed{ W^{[1]} = \begin{bmatrix} w_1^{T} \\ \vdots \\ w_{n_1}^{T} \end{bmatrix}, \quad b^{[1]} = \begin{bmatrix} b_1 \\ \vdots \\ b_{n_1} \end{bmatrix} }\]La couche entière calcule alors un vecteur de pré-activation et un vecteur d'activation en une seule expression matricielle, \(z^{[1]} = W^{[1]} x + b^{[1]}\) et \(a^{[1]} = g^{[1]}(z^{[1]})\), où \(g^{[1]}\) est appliquée élément par élément.
Remarque : les lignes de \(W^{[1]}\) sont exactement les vecteurs de poids des unités individuelles, donc une couche n'est que de nombreuses unités regroupées dans une seule matrice. Le biais reste explicite ici : contrairement au cours de Machine Learning, qui intégrait l'ordonnée à l'origine dans \(\theta\) via l'entrée augmentée \(x_0 = 1\), ce cours conserve \(b^{[l]}\) comme son propre vecteur.
2.2 Propagation avant
L'empilement de \(L\) telles couches donne le MLP. La couche \(l\) lit l'activation de la couche inférieure, \(a^{[l-1]}\), et produit \(a^{[l]}\). L'entrée est \(a^{[0]} = x\) et la prédiction est la sortie de la dernière couche.
2.2.1 Un exemple
Pour \(l = 1, \dots, L\) :
\[\boxed{ a^{[0]} = x, \quad z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}, \quad a^{[l]} = g^{[l]}\!\left(z^{[l]}\right), \quad \hat{y} = a^{[L]} }\]Chaque couche peut utiliser sa propre activation \(g^{[l]}\) : les couches cachées utilisent typiquement la ReLU, tandis que la couche de sortie utilise la sigmoïde ou le softmax pour la classification et l'identité pour la régression.
Remarque : la composition \(\hat{y} = g^{[L]}(W^{[L]} g^{[L-1]}(\cdots g^{[1]}(W^{[1]} x + b^{[1]}) \cdots) + b^{[L]})\) est ce qui rend le réseau expressif. Sans les \(g^{[l]}\) non linéaires, l'empilement entier s'effondrerait en une seule application linéaire \(W x + b\).
2.2.2 Vectorisation sur un mini-lot
L'entraînement s'exécute sur des lots, pas sur des exemples isolés. Placez \(m\) exemples comme les colonnes d'une matrice, de sorte que \(A^{[0]} = X \in \mathbb{R}^{n_0 \times m}\), et la passe avant devient un produit matriciel avec le biais diffusé sur toutes les colonnes :
\[\boxed{ Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]}, \quad A^{[l]} = g^{[l]}\!\left(Z^{[l]}\right) }\]Ici \(Z^{[l]}\) et \(A^{[l]}\) ont pour dimension \(n_l \times m\), une colonne par exemple. Le biais \(b^{[l]} \in \mathbb{R}^{n_l}\) est ajouté à chaque colonne, une opération connue sous le nom de diffusion (broadcasting).
Remarque : le seul changement par rapport à la forme à un exemple est que le vecteur \(a^{[l-1]}\) devient la matrice \(A^{[l-1]}\). Traiter un lot en une seule multiplication matricielle est ce qui permet à un GPU d'exécuter la passe efficacement.
2.3 Dimensions et nombre de paramètres
Les dimensions découlent d'une seule règle : pour calculer \(z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}\), la matrice \(W^{[l]}\) doit envoyer un vecteur de dimension \(n_{l-1}\) vers un vecteur de dimension \(n_l\).
\[\boxed{ W^{[l]} \in \mathbb{R}^{n_l \times n_{l-1}}, \quad b^{[l]} \in \mathbb{R}^{n_l} }\]La couche \(l\) contient donc \(n_l \, n_{l-1}\) poids plus \(n_l\) biais. Considérons un petit réseau avec \(n_0 = 4\) entrées, deux couches cachées de \(5\) et \(3\) unités, et une seule unité de sortie.
| Couche \(l\) | Dimension de \(W^{[l]}\) | Dimension de \(b^{[l]}\) | Paramètres |
|---|---|---|---|
| 1 | \(5 \times 4\) | \(5\) | \(25\) |
| 2 | \(3 \times 5\) | \(3\) | \(18\) |
| 3 | \(1 \times 3\) | \(1\) | \(4\) |
| Total | \(47\) |
Remarque : la couche d'entrée ne contient aucun paramètre, elle n'est que les données \(a^{[0]} = x\). Quand on compte les couches, on compte celles qui portent des poids, donc ce réseau a \(L = 3\).
2.4 Un réseau multicouche
Le diagramme ci-dessous montre le même réseau \(4\)-\(5\)-\(3\)-\(1\) sous forme d'un flux d'activations. Chaque groupe de flèches est une matrice de poids complète, et chaque boîte applique son activation à la pré-activation.
Un perceptron multicouche : chaque couche calcule z = W a + b puis a = g(z), composant l'entrée a0 en la prédiction aL.
L'information circule strictement de gauche à droite pendant la passe avant, c'est pourquoi il s'agit d'un réseau à propagation avant (feedforward). Rien ne boucle en arrière. La direction inverse, utilisée pour calculer les gradients, fait l'objet d'une leçon ultérieure.
2.5 Approximation universelle
Quelle est l'expressivité d'un MLP ? Le théorème d'approximation universelle apporte une réponse forte. Soit \(f\) une fonction continue quelconque sur un compact \(K \subset \mathbb{R}^{n_0}\), et soit \(\varepsilon > 0\). Alors il existe un réseau avec une seule couche cachée de largeur finie, utilisant une activation non linéaire appropriée, dont la sortie \(F\) vérifie :
\[\boxed{ \sup_{x \in K} \left| F(x) - f(x) \right| < \varepsilon }\]
Autrement dit, une seule couche cachée avec suffisamment d'unités peut approcher n'importe quelle fonction continue sur une région bornée avec la précision souhaitée \(\varepsilon\). C'est un résultat d'existence, pas une recette : il garantit que de tels poids existent, mais ne dit rien sur le nombre d'unités nécessaires ni sur la manière de les trouver.
Remarque : le piège est la largeur. Atteindre une cible avec une précision \(\varepsilon\) avec une seule couche cachée peut exiger un nombre énorme d'unités, croissant rapidement à mesure que \(\varepsilon\) diminue. La profondeur est généralement bien plus efficace en paramètres : empiler plusieurs couches étroites peut représenter des fonctions qu'une seule couche nécessiterait un nombre exponentiel d'unités pour égaler. Cette efficacité de la profondeur sur la largeur est la raison pratique pour laquelle le domaine s'appelle l'apprentissage profond (deep learning).

Un réseau avec une seule couche cachée approche une fonction cible en sommant de nombreuses unités activées simples.
Le réseau n'est défini qu'une fois les activations \(g^{[l]}\) fixées. La leçon suivante les définit, sigmoïde, tanh, ReLU et ses variantes, et explique comment chacune façonne l'apprentissage.
Suivant : Fonctions d'activation · Vue d'ensemble du cours
