Formation ML / Deep Learning

Reseau de Neurones from Scratch

Intermediaire 50 min 17 sections

Implementez un reseau de neurones de A a Z avec NumPy. Comprenez chaque etape: forward pass, fonctions d'activation, backpropagation et descente de gradient.

Objectifs d'apprentissage

  • Comprendre l'architecture d'un reseau de neurones
  • Implementer le forward pass (propagation avant)
  • Comprendre et coder le backpropagation (retropropagation)
  • Visualiser l'apprentissage du reseau
  • Maitriser les fonctions d'activation (sigmoid, ReLU)

Prerequis

Notions de Python, algebre lineaire de base (matrices, produit matriciel)

Theorie

Qu'est-ce qu'un reseau de neurones?

Un reseau de neurones artificiel est un modele inspire du cerveau humain. Il est compose de neurones organises en couches.

Architecture basique:

  • Couche d'entree: recoit les donnees (ex: pixels d'une image, features)
  • Couches cachees: transforment les donnees (apprentissage des patterns)
  • Couche de sortie: produit la prediction (ex: probabilite de classe)

Le neurone artificiel:

Chaque neurone effectue 3 operations:

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

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

Theorie

Schema: Architecture d'un reseau de neurones

Architecture du reseau (2 entrees --> 4 neurones caches --> 1 sortie):

flowchart LR subgraph Input["COUCHE D'ENTREE"] x1((x1)) x2((x2)) end subgraph Hidden["COUCHE CACHEE"] 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[Prediction]

Le neurone artificiel en detail:

flowchart LR subgraph Entrees 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:

Entrees: $\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}$

Etape 1 - Somme ponderee 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}}$

Etape 2 - Activation sigmoid:

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

Interpretation: Le neurone "s'active" a $\textcolor{#e74c3c}{67\%}$

Legende des couleurs:

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

Forward Pass (propagation avant):

flowchart LR A["Donnees X"] --> B["Couche 1
z1=X·W1+b1
a1=relu(z1)"] B --> C["Couche 2
z2=a1·W2+b2
y=sigmoid(z2)"] C --> D["Prediction y"] style A fill:#E5D7F5,color:#1A1A1A style D fill:#FFF9D9,color:#1A1A1A

Backpropagation (retropropagation du gradient):

flowchart RL E["Erreur
(y - ŷ)"] --> G2["Gradient W2
dL/dW2"] G2 --> G1["Gradient W1
dL/dW1"] G1 --> U["Mise a jour
W, b"] style E fill:#C09CF0,color:#1A1A1A style U fill:#F7E64D,color:#1A1A1A

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 a l'erreur"] B --> U["4. UPDATE
W = W - lr × gradient"] U --> R{"Convergence?"} R -->|Non| F R -->|Oui| D["Modele entraine!"] style F fill:#E5D7F5,color:#1A1A1A style L fill:#FFF9D9,color:#1A1A1A style B fill:#C09CF0,color:#1A1A1A style U fill:#F7E64D,color:#1A1A1A style D fill:#F7E64D,color:#1A1A1A
Avance Exercice manuel: A vous de calculer!

Objectif: Maitriser les calculs d'un reseau de neurones a la main (forward pass, activation, gradient).

Prenez une feuille et un stylo. Resolvez chaque partie AVANT de regarder la solution !

CONTEXTE

Vous avez un reseau de neurones simple avec :

  • 2 entrees : $x_1$, $x_2$
  • 1 neurone cache avec activation sigmoid
  • 1 neurone de sortie avec activation sigmoid

Poids de la couche cachee :

  • $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$

Donnees d'entree : $x_1 = 1.0$, $x_2 = 2.0$, Cible : $y_{vrai} = 1$

PARTIE 1 : Forward Pass - Couche cachee

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 a 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$

Avance Solution de l'exercice manuel

SOLUTION DETAILLEE

PARTIE 1 : Forward Pass - Couche cachee

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 a 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 modele sous-estimait (0.55 < 1).

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

Code

Charger et visualiser les donnees

Cliquez sur "Executer" pour voir le resultat
Theorie

Les fonctions d'activation

Les fonctions d'activation introduisent la non-linearite dans le reseau. Sans elles, meme un reseau profond serait equivalent a une simple regression lineaire.

Sigmoid (pour couche de sortie binaire):

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

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

ReLU (pour couches cachees):

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

  • Simple et efficace
  • Resout le probleme du gradient qui disparait

Derivees (pour backpropagation):

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

Implementer les fonctions d'activation

Cliquez sur "Executer" pour voir le resultat
Contenu verrouille section restante
7 / 17

Continuez votre apprentissage

Vous avez explore 7 sections de ce module. Connectez-vous pour debloquer le reste du cours, incluant les exercices pratiques et les solutions.

Console Python

Raccourcis clavier
Ctrl/Cmd+Enter Executer
Ctrl/Cmd+Shift+/ Commenter
Tab Indenter
Shift+Tab Desindenter
Ctrl/Cmd+Z Annuler
Ctrl/Cmd+Y Retablir
Ctrl+Enter pour executer
Cliquez sur "Executer" pour voir le resultat