Pilier 8

Réseau à 2 couches (Multi-Layer Perceptron)

Idée

On empile deux blocs : une couche cachée qui prend les entrées brutes, leur applique une transformation linéaire suivie d'une saturation, et produit un nouvel ensemble de mesures intermediaires ; une couche de sortie qui rejoue le même tour.

Pourquoi

On empile deux blocs : une couche cachée qui prend les entrées brutes, leur applique une transformation linéaire suivie d'une saturation, et produit un nouvel ensemble de mesures intermediaires ; une couche de sortie qui rejoue exactement le même tour sur ces mesures intermediaires pour produire la sortie finale. La superposition transformee-saturation-transformee-saturation permet de tracer des frontières courbes (non-linéaires), donc d'apprendre XOR. Composition de fonctions affines avec saturations intercalées, exactement comme on composé deux applications $\mathbb{R}^n \to \mathbb{R}^p \to \mathbb{R}^q$ en algèbre linéaire de spé (mais ici la composition n'est plus linéaire a cause des saturations). Le piège : empiler deux couches sans activation entre elles, c'est revenir à une seule couche linéaire. La non-linéarité au milieu fait tout le travail.

Outil

Composition de deux applications $\mathbb{R}^n \to \mathbb{R}^p \to \mathbb{R}^q$ en algèbre linéaire de spé, mais avec saturation intercalée (donc composition non linéaire).

Formule

$Z_1 = W_1 X + b_1$, $A_1 = \sigma(Z_1)$, $Z_2 = W_2 A_1 + b_2$, $\hat{Y} = \sigma(Z_2)$ ; shapes : $X \in \mathbb{R}^{n_0 \times m}$, $W_\ell \in \mathbb{R}^{n_\ell \times n_{\ell-1}}$.

Piège

Tentation : écrire $W_1$ de forme $(n_0, n_1)$ par analogie avec scikit-learn ($X W$). Avec la convention « colonne = exemple » de ce notebook ($X \in \mathbb{R}^{n_0 \times m}$), c'est l'inverse : $W_1$ a la forme $(n_1, n_0)$ et le produit s'écrit $W_1 X$, pas $X W_1$ — sinon les shapes ne se referment pas et l'erreur n'apparaît qu'à la première multiplication.

Diagramme

graph LR
  x((entree x)) --> W1[couche cachee W1 b1]
  W1 --> sig1[sigma]
  sig1 --> h((mesures h))
  h --> W2[couche sortie W2 b2]
  W2 --> sig2[sigma]
  sig2 --> y((sortie y))