0 XP
?
Introduction à l'IA/Réseaux de neurones
Avancé80 min55 XP

Objectifs de cette leçon

  • Comprendre l'architecture d'un réseau de neurones
  • Implémenter un réseau avec TensorFlow/PyTorch
  • Comprendre la rétropropagation

Réseaux de neurones 🧠

Un réseau de neurones, c'est comme un cerveau simplifié : des milliers de petits "neurones" artificiels connectés entre eux qui apprennent à reconnaître des patterns.


1. Inspiré du cerveau humain 🧠

pseudo ' Un neurone artificiel = une petite usine de calcul : ' 1. Il reçoit des ENTRÉES (x₁, x₂, x₃...) ' 2. Chaque entrée a un POIDS (importance) ' 3. Il fait la somme : (x₁ × poids₁ + x₂ × poids₂ + ...) + biais ' 4. Il applique une FONCTION D'ACTIVATION ' 5. Il produit une SORTIE

' Exemple : décider si on sort au cinéma 🎬 ' x₁ = j'ai de l'argent ? (1=oui, 0=non) → poids = 0.8 ' x₂ = il fait beau ? (1=oui, 0=non) → poids = 0.5 ' x₃ = j'ai fini mes devoirs ? (1=oui, 0=non) → poids = 0.9 ' ' Si somme > 1.5 → SORTIE = 1 (je sors !) 🎉 ' Sinon → SORTIE = 0 (je reste) 😴 ``'

import numpy as np

def sigmoide(x):
    return 1 / (1 + np.exp(-x))

class Neurone:
    def __init__(self, n_entrees):
        self.poids = np.random.randn(n_entrees) * 0.01
        self.biais = 0

    def forward(self, entrees):
        z = np.dot(entrees, self.poids) + self.biais
        return sigmoide(z)
``'

---

## 3. Perceptron multicouche (MLP) 🏗️

python
import numpy as np

class ReseauNeurones:
    def __init__(self, couches):
        """couches = [784, 128, 64, 10]"""
        self.couches = couches
        self.poids = []
        self.biais = []

        for i in range(len(couches) - 1):
            w = np.random.randn(couches[i], couches[i + 1]) * 0.01
            b = np.zeros((1, couches[i + 1]))
            self.poids.append(w)
            self.biais.append(b)

    def relu(self, x):
        return np.maximum(0, x)

    def forward(self, X):
        for w, b in zip(self.poids[:-1], self.biais[:-1]):
            X = self.relu(np.dot(X, w) + b)
        # Dernière couche : softmax
        z = np.dot(X, self.poids[-1]) + self.biais[-1]
        exp_z = np.exp(z - np.max(z, axis=1, keepdims=True))
        return exp_z / np.sum(exp_z, axis=1, keepdims=True)
``'

---

## 4. Fonctions d'activation 🔌

```pseudo
' La fonction d'activation décide si le neurone "s'allume" ou pas

' ReLU (la plus utilisée) :
' Si entrée > 0 → sortie = entrée
' Si entrée ≤ 0 → sortie = 0
' → Simple et efficace !

' Sigmoïde :
' Transforme n'importe quelle valeur en probabilité (entre 0 et 1)
' → Utile pour les décisions binaires (oui/non)

' Softmax (pour la sortie) :
' Transforme les sorties en probabilités qui additionnent à 1
' → "Le chiffre est 7 avec 95% de chance"
``'

| Fonction | Formule | Utilisation |
|----------|---------|-------------|
| **ReLU** | `max(0, x)` | Couches cachées (la plus courante) |
| **Sigmoïde** | `1/(1+e⁻ˣ)` | Classification binaire |
| **Tanh** | `tanh(x)` | Valeurs entre -1 et 1 |
| **Softmax** | `eˣ/∑eˣ` | Sortie multi-classes |

---

## 5. Entraînement : la rétropropagation 🔄

```pseudo
' Comment le réseau apprend-il ?
' Il fait une prédiction, regarde l'erreur, et ajuste ses poids

' 1. FORWARD (aller) : le réseau prédit quelque chose
' 2. CALCUL DE L'ERREUR : à quel point c'est faux ?
' 3. BACKWARD (retour) : on propage l'erreur en arrière
' 4. AJUSTEMENT : on modifie les poids pour faire mieux
' 5. On répète des MILLIERS de fois !
``'

```python
# Pseudo-code de la rétropropagation
def entrainer(X, y, taux_apprentissage):
    # Forward
    predictions = reseau.forward(X)
    erreur = cout(predictions, y)  # Ex: cross-entropy

    # Backward (calcul des gradients)
    gradient = derivee_cout(predictions, y)
    for couche in reversed(reseau.couches):
        gradient = couche.backward(gradient, taux_apprentissage)

    # Les poids sont mis à jour
    # w = w - taux * gradient
``'

---

## 6. Exemple avec TensorFlow/Keras 🔥

```python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    Dense(128, activation="relu", input_shape=(784,)),
    Dense(64, activation="relu"),
    Dense(10, activation="softmax"),
])

model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"],
)

# Entraînement
model.fit(X_train, y_train, epochs=10, batch_size=32)

# Évaluation
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"Précision test : {test_acc:.3f}")
``'

---

## Exercices pour toi 🎯

1. **Neurone simple** : implémente un neurone qui décide si un film est bien selon 3 critères (note, durée, genre) avec des poids que tu choisis
2. **Réseau profond** : crée un réseau avec Keras pour reconnaître des chiffres manuscrits (dataset MNIST)
3. **Expérience** : compare un réseau avec 1 couche cachée vs 3 couches cachées — lequel est le plus précis ? Le plus long à entraîner ?

Exécution pas à pas

ReLUNonOui
0/9

État de la mémoire

4 variables
Variable
Valeur
Type
Addr.
couche_entrée
784
neurons
0x5200
couche_cachée
128
neurons
0x5300
couche_sortie
10
neurons
0x5400
poids
100352
parameters
0x5500
Aucune variable active
couche_entrée0x5200
784
neurons
couche_cachée0x5300
128
neurons
couche_sortie0x5400
10
neurons
poids0x5500
100352
parameters

⚡ Simulateur — Réseaux de neurones

Étape 1/7
📝 Pseudo-code
1🧠 RÉSEAU DE NEURONES ARTIFICIEL
2
3Couche d'entrée : 784 pixels (28×28) # ⬅ entrée
4 ↓ poids + biais
5Couche cachée 1 : 128 neurones + ReLU # ⬅ cachée 1
6 ↓ poids + biais
7Couche cachée 2 : 64 neurones + ReLU # ⬅ cachée 2
8 ↓ poids + biais
9Couche de sortie : 10 neurones + Softmax # ⬅ sortie
10
11Neurone unique :
12 sortie = activation(∑(x_i × w_i) + biais) # ⬅ calcul
13
14Forward → Erreur → Backward → Ajustement # ⬅ cycle
🧠 Réseau de Neurones
poids📥 Entrée784 neuronespoids🧩 Cachée 1128 neuronespoids🧩 Cachée 264 neurones📤 Sortie10 neurones
💡 Architecture
  • Entrée : données brutes (pixels, features)
  • Cachées : traits → formes → concepts
  • Sortie : prédiction finale
  • Des poids relient chaque couche

Un réseau de neurones imite le cerveau : des neurones interconnectés qui apprennent des patterns.