← Projets

Multilayer Perceptron

juillet 2026

C++EigenNeural NetworksAdamMachine Learning42
github

J’ai pris beaucoup plus de plaisir sur ce projet que sur le premier projet de machine learning que j’avais fait (Linear Regression), sans doute à cause de la complexité algorithmique accrue. Ça m’a donné envie d’aller plus loin sur le sujet.

Vue d’ensemble

Un multilayer perceptron entraîné à classifier des tumeurs mammaires comme malignes ou bénignes à partir du Wisconsin Breast Cancer dataset. Aucun framework de machine learning — la forward propagation, la backpropagation et la descente de gradient sont toutes implémentées directement, Eigen ne fournissant que les primitives d’algèbre linéaire.

Le projet fonctionne comme un petit pipeline en CLI : découper le dataset brut, entraîner un réseau avec une profondeur et des hyperparamètres configurables, puis l’évaluer sur des données inédites — avec un mode de comparaison interactif pour superposer plusieurs runs d’entraînement.

Fonctionnement

Feedforward. Chaque couche calcule une somme pondérée de ses entrées, y ajoute un biais, puis applique une fonction d’activation — ReLU dans les couches cachées, softmax sur la couche de sortie pour obtenir une distribution de probabilité sur les deux classes.

Backpropagation. L’erreur entre la prédiction et la véritable valeur est propagée en sens inverse à travers le réseau via la règle de dérivation en chaîne (chain rule) : chaque couche détermine dans quelle mesure ses propres poids ont contribué à l’erreur, puis transmet le gradient à la couche précédente. Les gradients sont accumulés sur un mini-batch avant toute mise à jour des poids.

Descente de gradient. Les poids se déplacent d’un petit pas dans la direction qui réduit la loss, le learning rate contrôlant la taille de ce pas.

Choix d’implémentation

Choix Justification
ReLU dans les couches cachées Converge plus vite que sigmoid
Initialisation des poids en He Uniform Variance mise à l’échelle de la taille d’entrée — évite l’initialisation à zéro incompatible avec ReLU
Normalisation Z-score, calculée sur le train uniquement Met toutes les features à la même échelle sans utiliser les statistiques de validation dans l’entraînement
Dérivée combinée softmax + cross-entropy Se simplifie directement en ŷ - y, évitant de calculer la matrice Jacobienme complète de softmax dans la backpropagation

Résultats

binary cross-entropy loss: 0.015279
accuracy:   98.00%
precision: 100.00%
recall:     96.77%
f1 score:   98.36%

Dans ce contexte médical, la precision et le recall comptent davantage que l’accuracy brute : un faux négatif (une tumeur maligne non détectée) est bien plus grave qu’une fausse alerte. C’est aussi pour ça que le réseau reporte precision, recall et F1 plutôt que la seule accuracy. Ajouter ces métriques faisait partie des bonus proposés par le sujet, mais j’ai pris plaisir à le faire: c’était un bon moyen d’ancrer le projet dans la réalité.

Bonus : optimiseur Adam

Un optimiseur Adam a été implémenté en complément de la descente de gradient en mini-batch, en maintenant des estimations de moment par poids pour adapter dynamiquement le learning rate effectif pendant l’entraînement. Il converge nettement plus vite dans les premières epochs, même si sur ce petit dataset il atteint une performance finale similaire à la descente de gradient classique.