Formation ML / Deep learning

Réseau de neurones from scratch

Intermédiaire 50 min 17 sections

Forward, perte, rétropropagation et descente de gradient écrits en NumPy pur, sans framework pour cacher le calcul.

Objectifs d'apprentissage

  • Comprendre l'architecture d'un réseau de neurones
  • Implémenter le forward pass (propagation avant)
  • Comprendre et coder la rétropropagation
  • Visualiser l'apprentissage du réseau
  • Maîtriser les fonctions d'activation (sigmoid, ReLU)

Prérequis

Notions de Python, algèbre linéaire de base (matrices, produit matriciel)

Théorie

Qu'est-ce qu'un réseau de neurones?

Un réseau de neurones artificiel est un modèle inspire du cerveau humain. Il est composé de neurones organises en couches.

Architecture basique:

  • Couche d'entrée: reçoit les données (ex: pixels d'une image, features)
  • Couches cachées: transforment les données (apprentissage des patterns)
  • Couche de sortie: produit la prédiction (ex: probabilité de classe)

Le neurone artificiel:

Chaque neurone effectue 3 opérations:

  1. Somme pondérée: $z = w_1 \cdot x_1 + w_2 \cdot x_2 + ... + b$
  2. Fonction d'activation: $a = f(z)$
  3. Transmet le résultat aux neurones suivants

L'apprentissage consiste à ajuster les poids (w) et biais (b) pour minimiser l'erreur.

Théorie

Schéma: Architecture d'un réseau de neurones

Architecture du réseau (2 entrées --> 4 neurones caches --> 1 sortie):

flowchart LR subgraph Input["COUCHE D'ENTRÉE"] x1((x1)) x2((x2)) end subgraph Hidden["COUCHE CACHÉE"] h1((h1)) h2((h2)) h3((h3)) h4((h4)) end subgraph Output["COUCHE DE SORTIE"] y((y)) end x1 --> h1 & h2 & h3 & h4 x2 --> h1 & h2 & h3 & h4 h1 & h2 & h3 & h4 --> y y --> P["Prédiction"]

Le neurone artificiel en détail:

flowchart LR subgraph Entrees ["Entrées"] x1[x1] x2[x2] x3[x3] end subgraph Poids w1[w1] w2[w2] w3[w3] b[biais b] end x1 --- w1 x2 --- w2 x3 --- w3 w1 & w2 & w3 & b --> S["z = Σ wi·xi + b"] S --> F["f(z)"] F --> A[a = sortie]

Exemple concret avec code couleur - Calcul d'un neurone:

Entrées: $\textcolor{#3498db}{x_1 = 0.5}$, $\textcolor{#e67e22}{x_2 = 0.8}$, $\textcolor{#27ae60}{x_3 = 0.2}$ Poids: $\textcolor{#3498db}{w_1 = 0.4}$, $\textcolor{#e67e22}{w_2 = 0.3}$, $\textcolor{#27ae60}{w_3 = 0.9}$, $\textcolor{#9B7AC4}{b = 0.1}$

Étape 1 - Somme pondérée z:

$z = \textcolor{#3498db}{w_1 \cdot x_1} + \textcolor{#e67e22}{w_2 \cdot x_2} + \textcolor{#27ae60}{w_3 \cdot x_3} + \textcolor{#9B7AC4}{b}$

$z = \textcolor{#3498db}{0.4 \times 0.5} + \textcolor{#e67e22}{0.3 \times 0.8} + \textcolor{#27ae60}{0.9 \times 0.2} + \textcolor{#9B7AC4}{0.1}$

$z = \textcolor{#3498db}{0.20} + \textcolor{#e67e22}{0.24} + \textcolor{#27ae60}{0.18} + \textcolor{#9B7AC4}{0.10} = \textcolor{#F7E64D}{\mathbf{0.72}}$

Étape 2 - Activation sigmoid:

$a = \sigma(\textcolor{#F7E64D}{0.72}) = \frac{1}{1 + e^{-\textcolor{#F7E64D}{0.72}}} = \textcolor{#e74c3c}{\mathbf{0.67}}$

Interprétation: Le neurone "s'active" à $\textcolor{#e74c3c}{67\%}$

Légende des couleurs:

  • $\textcolor{#3498db}{Bleu}$: Entrée 1 et son poids ($\textcolor{#3498db}{x_1, w_1}$)
  • $\textcolor{#e67e22}{Orange}$: Entrée 2 et son poids ($\textcolor{#e67e22}{x_2, w_2}$)
  • $\textcolor{#27ae60}{Vert}$: Entrée 3 et son poids ($\textcolor{#27ae60}{x_3, w_3}$)
  • $\textcolor{#9B7AC4}{Violet}$: Biais ($\textcolor{#9B7AC4}{b}$)
  • $\textcolor{#F7E64D}{Jaune}$: Somme pondérée z
  • $\textcolor{#e74c3c}{Rouge}$: Activation finale a

Forward Pass (propagation avant):

flowchart LR A["Données X"] --> B["Couche 1
z1=X·W1+b1
a1=relu(z1)"] B --> C["Couche 2
z2=a1·W2+b2
y=sigmoid(z2)"] C --> D["Prédiction y"] class A ml-node-secondary class D ml-node-accent-soft

Backpropagation (retropropagation du gradient):

flowchart RL E["Erreur
(y - ŷ)"] --> G2["Gradient W2
dL/dW2"] G2 --> G1["Gradient W1
dL/dW1"] G1 --> U["Mise à jour
W, b"] class E ml-node-brand class U ml-node-accent

Cycle d'apprentissage:

flowchart TD F["1. FORWARD
X → Couches → y_pred"] F --> L["2. LOSS
Erreur = diff(y_pred, y_vrai)"] L --> B["3. BACKWARD
dL/dW = contribution à l'erreur"] B --> U["4. UPDATE
W = W - lr × gradient"] U --> R{"Convergence?"} R -->|Non| F R -->|Oui| D["Modèle entraîné!"] class F ml-node-secondary class L ml-node-warning class B ml-node-brand class U ml-node-main class D ml-node-accent
Avancé Exercice manuel: À vous de calculer!

Objectif: Maîtriser les calculs d'un réseau de neurones à la main (forward pass, activation, gradient).

Prenez une feuille et un stylo. Résolvez chaque partie AVANT de regarder la solution !

CONTEXTE

Vous avez un réseau de neurones simple avec :

  • 2 entrées : $x_1$, $x_2$
  • 1 neurone cache avec activation sigmoid
  • 1 neurone de sortie avec activation sigmoid

Poids de la couche cachée :

  • $w_1 = 0.5$ (poids de $x_1$)
  • $w_2 = -0.3$ (poids de $x_2$)
  • $b_1 = 0.1$ (biais)

Poids de la couche de sortie :

  • $w_3 = 0.8$ (poids de la sortie du neurone cache)
  • $b_2 = -0.2$ (biais)

Fonction sigmoid : $\sigma(z) = \frac{1}{1 + e^{-z}}$

Valeurs utiles : $\sigma(0) = 0.5$, $\sigma(0.2) \approx 0.55$

Données d'entrée : $x_1 = 1.0$, $x_2 = 2.0$, Cible : $y_{vrai} = 1$

PARTIE 1 : Forward Pass - Couche cachée

1.1) Calculez $z_1 = w_1 \cdot x_1 + w_2 \cdot x_2 + b_1$ 1.2) Calculez $a_1 = \sigma(z_1)$

PARTIE 2 : Forward Pass - Couche de sortie

2.1) Calculez $z_2 = w_3 \cdot a_1 + b_2$ 2.2) Calculez $\hat{y} = \sigma(z_2)$

PARTIE 3 : Calcul de l'erreur

$L = (y_{vrai} - \hat{y})^2$

3.1) Calculez l'erreur $L$

PARTIE 4 : Gradient et mise à jour

$\frac{\partial L}{\partial w_3} = -2(y_{vrai} - \hat{y}) \cdot \hat{y}(1-\hat{y}) \cdot a_1$

Learning rate : $\eta = 0.1$

4.1) Calculez le gradient de $w_3$ 4.2) Calculez $w_3^{new} = w_3 - \eta \cdot gradient$

Avancé Solution de l'exercice manuel

SOLUTION DÉTAILLÉE

PARTIE 1 : Forward Pass - Couche cachée

1.1) $z_1 = 0.5 \times 1.0 + (-0.3) \times 2.0 + 0.1 = 0.5 - 0.6 + 0.1 = \textcolor{#F7E64D}{\mathbf{0.0}}$

1.2) $a_1 = \sigma(0) = \frac{1}{1+1} = \textcolor{#F7E64D}{\mathbf{0.5}}$

PARTIE 2 : Forward Pass - Couche de sortie

2.1) $z_2 = 0.8 \times 0.5 + (-0.2) = 0.4 - 0.2 = \textcolor{#F7E64D}{\mathbf{0.2}}$

2.2) $\hat{y} = \sigma(0.2) \approx \textcolor{#e74c3c}{\mathbf{0.55}}$

PARTIE 3 : Calcul de l'erreur

3.1) $L = (1 - 0.55)^2 = (0.45)^2 = \textcolor{#e74c3c}{\mathbf{0.2025}}$

PARTIE 4 : Gradient et mise à jour

4.1) Gradient :

$$\frac{\partial L}{\partial w_3} = -2(1 - 0.55) \times 0.55 \times 0.45 \times 0.5$$

$$= -2 \times 0.45 \times 0.2475 \times 0.5 = \textcolor{#e74c3c}{-0.111}$$

4.2) Nouveau poids :

$$w_3^{new} = 0.8 - 0.1 \times (-0.111) = 0.8 + 0.011 = \textcolor{#27ae60}{\mathbf{0.811}}$$

Le poids augmente car le modèle sous-estimait (0.55 < 1).

Légende : $\textcolor{#F7E64D}{Jaune}$: activations, $\textcolor{#e74c3c}{Rouge}$: erreur/gradients, $\textcolor{#27ae60}{Vert}$: nouveau poids

Code

Charger et visualiser les données

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Théorie

Les fonctions d'activation

Les fonctions d'activation introduisent la non-linéarité dans le réseau. Sans elles, même un réseau profond serait équivalent à une simple régression linéaire.

Sigmoid (pour couche de sortie binaire):

$$\sigma(z) = \frac{1}{1 + e^{-z}}$$

  • Sortie entre 0 et 1 (probabilité)
  • Utile pour classification binaire

ReLU (pour couches cachées):

$$\text{relu}(z) = \max(0, z)$$

  • Simple et efficace
  • Résout le problème du gradient qui disparaît

Dérivées (pour backpropagation):

  • $\sigma'(z) = \sigma(z) \cdot (1 - \sigma(z))$
  • $\text{relu}'(z) = 1$ si $z > 0$, sinon $0$
Code

Implémenter les fonctions d'activation

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Contenu verrouillé
7 / 17

Continuez votre apprentissage

Vous avez exploré 7 sections de ce module. Connectez-vous pour débloquer le reste du cours, incluant les exercices pratiques et les solutions.

Console Python

Raccourcis clavier
Ctrl/Cmd+Enter Exécuter
Ctrl/Cmd+Shift+/ Commenter
Tab Indenter
Shift+Tab Désindenter
Ctrl/Cmd+Z Annuler
Ctrl/Cmd+Y Rétablir
Ctrl+Entrée pour exécuter
Cliquez sur "Exécuter" pour voir le résultat