Réseau de Neurones Artificiels

Introduction au
Deep Learning

Construire un Perceptron Multicouche de zéro pour résoudre le premier problème historique de l'IA : la fonction XOR. Le défi qui a failli tuer l'intelligence artificielle.

Par Nathan Feuerstein

01

Avant-propos

L'intelligence artificielle est l'une des inventions technologiques majeures de notre époque. Sa variante la plus impressionnante, notamment celle des grands modèles de langage (LLM) comme ChatGPT ou Claude, est le « Deep Learning » ou apprentissage profond. Cet article a pour but d'en faire une introduction accessible au plus grand nombre.

Un modèle de Deep Learning est un Réseau de Neurones Artificiel (RNA). C'est l'interconnexion de fonctions mathématiques appelées neurones qui permet à notre modèle de fonctionner. Pas de panique, je détaillerai ces concepts par la suite et je suis persuadé que cela vous paraîtra limpide.

Le saviez-vous ? Selon un rapport de Microsoft, en 2025, 35 % des entreprises utilisent déjà l'IA quotidiennement dans leurs opérations. Environ 1,5 milliard de personnes utilisent des outils d'IA générative au quotidien. (Global AI Adoption, 2025)

Les ingénieurs qui développent de nouveaux outils d'IA utilisent bien souvent des bibliothèques spécialisées (PyTorch, TensorFlow…). Cela signifie qu'ils utilisent des outils d'IA qui existent déjà, sans avoir besoin de les recréer de zéro, et ne ressentent donc pas toujours le besoin de comprendre leur fonctionnement réel.

Par conséquent, peu de gens en dehors des chercheurs en intelligence artificielle s'intéressent vraiment au cœur du fonctionnement mathématique et algorithmique des réseaux de neurones artificiels.

Dans cet article, je vais expliquer le fonctionnement détaillé du premier réseau de neurones : le Perceptron Multicouche (MLP). Les MLP sont encore des rouages essentiels des Transformers, les architectures de Deep Learning les plus puissantes, théorisées en 2017 par Google (Attention Is All You Need). Pour l'anecdote, l'acronyme « GPT » signifie littéralement Generative Pre-Trained Transformers.

Pour vraiment comprendre les MLP en profondeur, vous allez m'accompagner dans la création d'un réseau de neurones sans bibliothèques spécialisées. Nous allons construire un réseau de neurones de zéro qui aura une tâche spécifique : résoudre le problème historique du XOR.

Prérequis : Aucun. Pour comprendre le code en détail, il est judicieux d'avoir des bases en programmation Python orientée objet (OOP).

Quiz
Qu'est-ce qu'un Réseau de Neurones Artificiel (RNA) ?
✓ Exactement ! Un RNA est une composition de fonctions mathématiques (neurones) interconnectées qui, ensemble, permettent de faire des prédictions à partir de données.
✗ Un RNA n'est pas un algorithme de tri. C'est une composition de fonctions mathématiques appelées neurones, interconnectées pour produire des prédictions.
02

Contexte historique

L'histoire des réseaux de neurones artificiels commence dans les années 1940, lorsque les neurophysiologistes Warren McCulloch et Walter Pitts proposent le premier modèle mathématique formel d'un neurone artificiel. L'idée est révolutionnaire : simuler le fonctionnement du cerveau humain à l'aide de mathématiques et d'électronique.

1943 McCulloch & Pitts Neurone formel 1958 Rosenblatt Perceptron 1969 Minsky & Papert Hiver de l'IA 1986 Rumelhart, Hinton, Williams Backpropagation 2017 Google Transformers
Figure 1Frise chronologique des grandes étapes du Deep Learning (1943–2017)

En 1958, Frank Rosenblatt invente le Perceptron multicouche : le premier ancêtre direct de nos réseaux modernes. Ce modèle apprend à classer des données en ajustant des poids numériques, un peu comme un enfant qui apprend par essais et erreurs. L'enthousiasme est immense : on imagine déjà des machines capables de reconnaître des objets, de comprendre le langage, de prendre des décisions.

Mais en 1969, les mathématiciens Marvin Minsky et Seymour Papert publient un livre dévastateur : ils démontrent que le perceptron simple est fondamentalement incapable de résoudre certains problèmes de base, dont la fonction XOR.

Le problème XOR : La fonction XOR est non linéaire. Les neurones artificiels sont des fonctions linéaires. Il est impossible pour une fonction linéaire, aussi complexe soit-elle, d'approximer une fonction non linéaire. Cela signifiait que l'IA n'était capable de résoudre qu'un nombre très limité de tâches. C'est le premier grand hiver de l'IA : une période de désillusion générale et de coupes budgétaires massives.

Table de vérité de la fonction XOR

ABA XOR B
000
011
101
110
A B 0 1 0 1 Impossible d'isoler les 0 et les 1 avec une seule droite ! 0 0 1 1 (0,0) (1,0) (0,1) (1,1)
Figure 2Représentation graphique du problème XOR dans un espace bidimensionnelNote. Les points de même classe (0 ou 1) ne peuvent pas être séparés par une seule droite, illustrant la non-séparabilité linéaire du XOR.

Il faudra attendre les années 1980 pour que la solution soit découverte : en empilant plusieurs couches de neurones et en introduisant des fonctions d'activation non linéaires, on obtient un réseau capable de résoudre XOR, et bien plus encore. L'algorithme de rétropropagation du gradient (backpropagation), popularisé par Rumelhart, Hinton et Williams en 1986, donne enfin un moyen efficace d'entraîner ces réseaux multicouches.

Aujourd'hui, les réseaux qui font tourner ChatGPT ou Gemini s'appuient toujours sur ces mêmes principes fondamentaux. C'est pourquoi comprendre le MLP, c'est comprendre le cœur de l'IA moderne.

Quiz
Pourquoi le Perceptron simple de Rosenblatt (1958) était-il incapable de résoudre XOR ?
✓ Exact ! Un perceptron calcule une somme pondérée puis applique un seuil — c'est une transformation linéaire. Or XOR place ses points de façon non séparable par une droite. Aucune droite ne peut les séparer.
✗ Pas tout à fait. Le problème est mathématique : XOR est une fonction non linéaire, et un perceptron simple ne peut modéliser que des frontières de décision linéaires.
Démo interactive — Réseau XOR entraîné

Déplace les curseurs pour modifier les entrées A et B. Le réseau (déjà entraîné, 6 000 itérations) calcule la prédiction en temps réel.

0.00
0.00
Prédiction XOR :
0.02 0
03

Fonctionnement général

Un réseau de neurones artificiel est une fonction mathématique prédictive. Elle prend une information en entrée et produit une prédiction en sortie. Par exemple, un modèle de langage génératif prend en entrée notre phrase (prompt) et calcule la probabilité de chaque mot (token) que produirait un être humain.

Ces architectures mathématiques ont la particularité de pouvoir s'auto-évaluer et de s'améliorer grâce à des données. C'est ce qu'on appelle communément l'apprentissage automatique (Machine Learning).

Les paramètres : Un paramètre est un nombre. Ce qui rend un réseau différent d'un autre, ce sont les valeurs et la quantité de ses paramètres. Plus un RNA a de neurones, plus il a de paramètres, car il y aura davantage de liens entre les neurones.

Le but est donc de trouver les valeurs des paramètres qui permettent au réseau de faire les meilleures prédictions possibles.

Les trois étapes de l'apprentissage

1

Propagation avant (Forward Pass)

Le réseau fait une prédiction. Les données d'entrée traversent le réseau de couche en couche. En sortie, on obtient une ou plusieurs probabilités — par exemple, 89 % de chance que l'image représente un être humain, 11 % de chance que non.

2

Calcul de l'erreur (Loss)

Le modèle s'auto-évalue. Il mesure à quel point sa prédiction est éloignée de la réponse attendue grâce à une fonction de perte.

3

Rétropropagation (Backward Pass)

Le modèle calcule comment ajuster chacun de ses paramètres pour s'améliorer, puis met à jour leurs valeurs pour réduire l'erreur de prédiction.

FORWARD Prédiction LOSS Évaluation de l'erreur BACKWARD Auto-correction Répété des milliers de fois
Figure 3Le cycle d'apprentissage d'un réseau de neurones artificielNote. Les trois étapes — propagation avant, calcul de l'erreur et rétropropagation — sont répétées des milliers de fois jusqu'à ce que l'erreur soit faible.
Quiz
Dans quel ordre se déroulent les trois étapes de l'apprentissage d'un RNA ?
✓ Correct ! Le réseau fait d'abord une prédiction (Forward), évalue son erreur (Loss), puis corrige ses poids (Backward). Ce cycle est répété des milliers de fois.
✗ L'ordre correct est : Forward (prédiction) → Loss (évaluation de l'erreur) → Backward (correction des poids). Le réseau doit d'abord prédire avant de pouvoir évaluer son erreur.
04

Le neurone artificiel

Un neurone est une fonction mathématique à n variables. Il reçoit un nombre n d'entrées et produit une valeur en sortie. Par exemple, pour n = 3, les entrées peuvent être 2, 3 et 0,00001, et la sortie 42.

Un neurone possède les caractéristiques suivantes : pour chaque entrée, il possède un poids qui lui est associé, ainsi qu'un biais (un nombre stocké dans la mémoire du neurone).

Lorsqu'un neurone s'active (feedforward), il multiplie la valeur de chacune de ses entrées par le poids associé, puis additionne le biais.

Enfin, la sortie du neurone passe dans une fonction appelée fonction d'activation (sigmoïde) : une fonction non linéaire qui prend un nombre en entrée et retourne une valeur comprise entre 0 et 1.

x₁ x₂ x₃ xₙ w₁ w₂ w₃ Σ + b σ(z) Activation ŷ z = w₁x₁ + w₂x₂ + w₃x₃ + … + wₙxₙ + b → entrées → somme pondérée → activation → sortie
Figure 4Anatomie d'un neurone artificiel et direction du signalNote. Les entrées (x) sont multipliées par leurs poids (w), sommées avec le biais (b), puis transformées par σ. Adapté de Goodfellow et al. (2016).

Formule du neurone

\[ \text{Sortie} = \sigma\!\left(\sum_{i=1}^{n} w_i \cdot x_i + b\right) = \sigma(\mathbf{w} \cdot \mathbf{x} + b) \]

Pour les plus attentifs, cela ressemble à la formule du produit scalaire ! En effet, la sortie d'un neurone (avant activation) est le produit scalaire de ses poids et de ses entrées, auquel on additionne un biais.

Analogie visuelle : Imaginez que les poids représentent la pente d'une droite, et le biais son point de départ. En faisant varier ces deux valeurs, on peut tracer n'importe quelle droite, mais seulement des droites. C'est précisément pourquoi le premier hiver de l'IA a eu lieu : la fonction XOR n'est pas une droite.

Forme vectorielle compacte

\[ z = \mathbf{X} \cdot \mathbf{W} + b \]
Quiz
Un neurone a 3 entrées x₁=2, x₂=0, x₃=−1, avec les poids w₁=0.5, w₂=1, w₃=2 et un biais b=1. Quelle est la valeur de z (avant activation) ?
✓ Correct ! z = 0.5×2 + 1×0 + 2×(−1) + 1 = 1 + 0 − 2 + 1 = 0.
✗ Recalcule : z = 0.5×2 + 1×0 + 2×(−1) + 1 = 1 + 0 − 2 + 1 = 0. N'oublie pas d'additionner le biais b=1 !
05

Couches de neurones

Généralement, toutes les sorties des neurones d'une couche entrent dans chacun des neurones de la couche suivante. Tous les neurones d'une même couche ont les mêmes entrées, mais pas les mêmes poids ni le même biais.

Couche d'entrée Couche cachée Couche de sortie x₁ x₂ h₁ h₂ h₃ ŷ Direction de la propagation (feedforward)
Figure 5Architecture d'un perceptron multicouche (MLP) pour la résolution du problème XORNote. Le réseau comporte une couche d'entrée (2 neurones), une couche cachée (3 neurones) et une couche de sortie (1 neurone). Les connexions représentent les poids synaptiques.

C'est bien pour cela qu'au début de l'entraînement, les poids et les biais sont générés aléatoirement. Car sinon, tous les neurones auraient la même sortie et le réseau les corrigerait tous de la même manière, comme si l'on n'en avait qu'un seul par couche. Ce serait évidemment bien moins efficace.

Chaque neurone possède un biais et des poids qui lui sont propres. Il est important que le nombre de poids soit égal au nombre d'entrées : la dimension du vecteur des entrées doit être égale à la dimension du vecteur des poids.

Implémentation en Python

Python
class Dense(Layer):

    def __init__(self, in_dim, out_dim, seed=0):
        rng = np.random.default_rng(seed)

        # Poids : valeurs aléatoires autour d'une gaussienne
        self.W = rng.normal(0.0, 0.5, size=(in_dim, out_dim))

        # Biais : initialisé à zéro (convention)
        self.b = np.zeros((1, out_dim))

        # Vecteurs de gradients pré-alloués
        self.dW = np.zeros_like(self.W)
        self.db = np.zeros_like(self.b)

    def forward(self, x):
        self.x = x  # mémorisé pour backward
        return x @ self.W + self.b

Pourquoi initialiser les biais à zéro ? Contrairement aux poids, les biais n'ont pas besoin de symétrie brisée pour fonctionner. Un biais à zéro est un point de départ neutre que le réseau ajustera de lui-même lors de l'entraînement.

Quiz
Pourquoi initialise-t-on les poids d'un réseau de neurones de façon aléatoire ?
✓ Exactement ! Si tous les poids étaient identiques, tous les neurones d'une couche produiraient la même sortie et seraient mis à jour de la même façon : le réseau ne pourrait jamais apprendre des représentations variées.
✗ La raison est mathématique : si tous les poids sont identiques, tous les neurones calculent exactement la même chose et reçoivent le même gradient. La diversité des poids est indispensable pour que chaque neurone se spécialise.
06

Fonction d'activation

Le problème majeur des débuts de l'IA était que les RNA n'étaient pas capables d'implémenter des fonctions non linéaires. Pour une raison très simple : un neurone artificiel est une fonction linéaire.

Par définition, la combinaison linéaire d'une fonction linéaire est toujours linéaire

\[ T(c\mathbf{A} + d\mathbf{B}) = c \cdot T(\mathbf{A}) + d \cdot T(\mathbf{B}) \]

Pour prendre une analogie visuelle : on ne pourra jamais dessiner un cercle ou une courbe en traçant uniquement des droites. Cela donnera toujours une sorte de polygone. Or la plupart des fonctions utiles sont non linéaires.

Pour garder la logique des neurones tout en brisant la linéarité, dans les années 1980, les scientifiques ont trouvé un stratagème ingénieux : la fonction d'activation.

Une fonction d'activation transforme la sortie d'un neurone via une fonction non linéaire. Par exemple, si notre neurone produit en sortie 40 003, la fonction d'activation peut la transformer en 0,065. L'intérêt ? Une fonction d'activation est non linéaire, ce qui permet à l'ensemble du réseau de modéliser des relations non linéaires.

La fonction Sigmoïde

Nous allons utiliser la fonction Sigmoïde car elle se dérive facilement (vous verrez plus tard pourquoi c'est utile) et donne en sortie une valeur entre 0 et 1, le format idéal pour un calcul de probabilité, qui est toujours comprise entre ces deux valeurs.

Fonction Sigmoïde et sa dérivée

\[ \sigma(z) = \frac{1}{1 + e^{-z}} \qquad \sigma'(z) = \sigma(z) \cdot (1 - \sigma(z)) \]
Figure 6Graphique de la fonction sigmoïde σ(z)
Python
class Sigmoid(Layer):

    def forward(self, z):
        z = np.clip(z, -50, 50)  # éviter les overflows
        self.s = 1.0 / (1.0 + np.exp(-z))
        return self.s

    def backward(self, grad_out):
        # σ'(z) = σ(z) * (1 - σ(z))
        return grad_out * (self.s * (1.0 - self.s))
Quiz
Quelle est la sortie de la fonction Sigmoïde σ(z) quand z → +∞ ?
✓ Correct ! Quand z → +∞, e^(−z) → 0, donc σ(z) = 1/(1+0) = 1. La sigmoïde compresse tout l'axe des réels entre 0 et 1, avec une asymptote en y=1.
✗ Quand z est très grand et positif, σ(z) = 1/(1+e^(−z)) ≈ 1/(1+0) = 1. La sortie se rapproche de 1, pas de l'infini.
07

Auto-évaluation : la Loss Function

Lorsqu'on entraîne un réseau de neurones pour une tâche spécifique, nous savons quel résultat nous voulons obtenir. Pour cela, nous avons besoin de données d'entraînement : des données qui correspondent à ce que l'on veut que notre IA prédise.

Par exemple, si on entraîne une IA censée prédire le nombre de boîtes de LEGO vendues à Chicago l'année prochaine, nous avons besoin des données de ventes des dernières années. Plus nous disposerons de données pertinentes, plus notre modèle pourra apprendre et ajuster ses paramètres pour devenir performant.

Dans le monde de l'intelligence artificielle, l'une des ressources les plus cruciales sont les données. Sans données, pas d'entraînement. Sans entraînement, pas d'apprentissage. Sans apprentissage, pas de résultats.

Mean Squared Error (MSE).">Pour évaluer notre réseau, on calcule l'écart entre la réponse attendue et la prédiction. Plus l'écart est faible, meilleure est la prédiction. C'est le rôle de la Loss Function (fonction de perte). Nous utilisons l'Erreur Quadratique Moyenne (MSE).

Mean Squared Error (MSE)

\[ \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (\hat{y}_i - y_i)^2 \]
Prédiction ŷ = 0.51 Valeur attendue y = 1.0 Erreur (MSE) 0.24 Plus l'erreur est faible → meilleure est la prédiction
Figure 7Illustration du calcul de l'erreur quadratique moyenne (MSE)Note. La fonction de perte compare la prédiction du réseau (ŷ) à la valeur attendue (y) pour quantifier l'erreur.
Python
class MSELoss:

    def forward(self, y_pred, y_true):
        self.y_pred = y_pred
        self.y_true = y_true
        return float(np.mean((y_pred - y_true) ** 2))

    def backward(self):
        n = self.y_pred.shape[0]
        return 2 * (self.y_pred - self.y_true) / n
Quiz
Si un réseau prédit ŷ = 0.9 et la valeur attendue est y = 1.0, quelle est la MSE pour cet exemple ?
✓ Exact ! MSE = (ŷ − y)² = (0.9 − 1.0)² = (−0.1)² = 0.01. L'erreur quadratique pénalise les grandes erreurs plus fortement que les petites.
✗ MSE = (ŷ − y)² = (0.9 − 1.0)² = 0.01. Attention : on élève l'écart au carré, donc (−0.1)² = 0.01, pas 0.1.
08

Auto-correction : la Backpropagation

On sait désormais à quel point notre réseau est imprécis. Mais comment l'améliorer ? C'est exactement le rôle de la rétropropagation du gradient : l'actualisation des paramètres pour améliorer le RNA.

Ce qui fait la spécificité et la performance d'un réseau de neurones, ce sont ses paramètres. C'est en modifiant soigneusement leurs valeurs qu'on améliore un RNA. Certains RNA contiennent des millions, voire des milliards de paramètres. Pour savoir lesquels ajuster et de combien, nous utilisons un outil issu du calcul différentiel d'Isaac Newton.

Rappel : La dérivée partielle d'une fonction par rapport à une de ses variables nous apprend à quel point la fonction va varier si on fait varier cette variable. Pour schématiser : en étudiant une heure de plus pour mon contrôle, ma moyenne va-t-elle augmenter de 1 %, de 5 %, ou va-t-elle diminuer à cause de la fatigue engendrée ?

La dérivée partielle de la Loss par rapport à un paramètre nous dit : à quel point la Loss va varier si je fais varier ce paramètre ? Nous saurons alors dans quel sens modifier nos paramètres pour réduire notre MSE.

En appliquant la règle de la dérivée en chaîne, on calcule les gradients de chaque couche en multipliant le gradient entrant par le vecteur X des entrées de la couche. Le learning rate (lr), ou taux d'apprentissage, est une constante fixée à l'avance qui définit la vitesse à laquelle le réseau s'actualise.

La règle de la chaîne (Chain Rule)

\[ \frac{\partial L}{\partial W} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial W} \]
→ Forward pass (prédiction) Entrées X Dense + σ Couche 1 Dense + σ Couche 2 Loss (MSE) Erreur ← Backward pass (correction des poids) ∂L/∂X Gradient entrées ∂L/∂W₁, ∂L/∂b₁ Mise à jour W₁, b₁ ∂L/∂W₂, ∂L/∂b₂ Mise à jour W₂, b₂ ∂L/∂ŷ Gradient initial
Figure 8Forward et Backward pass comparésNote. Le forward pass calcule la prédiction de gauche à droite ; le backward corrige les poids de droite à gauche. Adapté de Rumelhart et al. (1986).

Gradients de la couche Dense

\[ \frac{\partial L}{\partial W} = X^T \cdot \nabla_{out} \quad \frac{\partial L}{\partial b} = \sum \nabla_{out} \quad \frac{\partial L}{\partial X} = \nabla_{out} \cdot W^T \]

Mise à jour des poids (descente de gradient)

\[ W \leftarrow W - \eta \cdot \frac{\partial L}{\partial W} \qquad b \leftarrow b - \eta \cdot \frac{\partial L}{\partial b} \]

où η est le learning rate (taux d'apprentissage)

Python
def backward(self, grad_out):
    # grad_out = dL/d(out) de shape (N, out_dim)
    self.dW = self.x.T @ grad_out        # dL/dW
    self.db = np.sum(grad_out, axis=0,
                     keepdims=True)    # dL/db
    grad_x = grad_out @ self.W.T        # dL/dx
    return grad_x

def step(self, lr):
    # Descente de gradient
    self.W -= lr * self.dW
    self.b -= lr * self.db
09

Implémentation complète

Maintenant que nous avons compris chaque composant, assemblons-les. Notre MLP aura l'architecture suivante : Dense(2→2) → Sigmoid → Dense(2→1) → Sigmoid. Deux neurones cachés suffisent pour résoudre XOR.

Le réseau (MLP)

Python — MLP
class MLP:
    """
    Dense(2→2) → Sigmoid → Dense(2→1) → Sigmoid
    XOR n'est pas linéairement séparable : une couche
    cachée non-linéaire rend le problème résoluble.
    """

    def __init__(self, seed=0):
        self.layers = [
            Dense(2, 2, seed=seed),
            Sigmoid(),
            Dense(2, 1, seed=seed + 1),
            Sigmoid()
        ]

    def forward(self, x):
        for layer in self.layers:
            x = layer.forward(x)
        return x

    def backward(self, grad_out):
        # On remonte les couches en sens inverse
        for layer in reversed(self.layers):
            grad_out = layer.backward(grad_out)

    def step(self, lr):
        for layer in self.layers:
            layer.step(lr)

L'entraîneur (Trainer)

Python — Trainer
class Trainer:

    def __init__(self, model, lr=0.5):
        self.model = model
        self.lr = lr
        self.loss_fn = MSELoss()

    def fit(self, X, Y, epochs=5000):
        for epoch in range(1, epochs + 1):
            # 1) Forward : prédiction
            Y_pred = self.model.forward(X)

            # 2) Loss : évaluation
            loss = self.loss_fn.forward(Y_pred, Y)

            # 3) Backward : gradients
            grad = self.loss_fn.backward()
            self.model.backward(grad)

            # 4) Update : correction des poids
            self.model.step(self.lr)

Résolution du XOR

Python — Exécution
# Dataset XOR (4 points)
X = np.array([[0.0, 0.0],
              [0.0, 1.0],
              [1.0, 0.0],
              [1.0, 1.0]])

Y = np.array([[0.0],
              [1.0],
              [1.0],
              [0.0]])

model = MLP(seed=42)
trainer = Trainer(model, lr=0.8)
trainer.fit(X, Y, epochs=6000)

proba, binary = trainer.predict(X)
print("Probas :", np.round(proba, 4))
print("Sortie :", binary)

Résultats après 6 000 itérations

Entrée (A, B)XOR attenduPrédiction du réseauSortie binaire
(0, 0)0≈ 0.020 ✓
(0, 1)1≈ 0.971 ✓
(1, 0)1≈ 0.971 ✓
(1, 1)0≈ 0.030 ✓

Le réseau a appris la fonction XOR ! En partant de poids aléatoires, après 6 000 itérations de forward → loss → backward → update, notre MLP produit des prédictions proches de 0 et 1 avec une marge d'erreur inférieure à 3 %. Notre réseau est donc bien capable d'approximer une fonction non linéaire, dans ce cas précis la fonction XOR !

Figure 9Courbe d'apprentissage du MLP lors de la résolution du problème XORNote. La loss (MSE) diminue progressivement au fil des 6 000 itérations d'entraînement, confirmant la convergence du réseau.
Visualise l'entraînement en direct

Appuie sur Play pour voir le réseau apprendre XOR depuis zéro. La loss descend, les poids changent, les prédictions s'améliorent.

Itération : 0 / 3000
Loss (MSE)
Précision
η (lr)
0.8
Paramètres
9
(0,0)→0
(0,1)→1
(1,0)→1
(1,1)→0
Quiz
Dans notre MLP pour XOR, combien de paramètres (poids + biais) le réseau possède-t-il au total ?
✓ Correct ! Dense(2→2) : 2×2 poids + 2 biais = 6. Dense(2→1) : 2×1 poids + 1 biais = 3. Total : 6 + 3 = 9 paramètres.
✗ Compte couche par couche. Dense(2→2) : 4 poids + 2 biais = 6. Dense(2→1) : 2 poids + 1 biais = 3. Total = 9 paramètres.
10

Références