En préliminaire il faut déjà comprendre comment fonctionne un neurone. Pour cela je vous invite à consulter
ce site
Pour résumer et pour comprendre la suite, il faut juste avoir en tête le schéma suivant :

Nous allons simuler des portes logiques à deux entrées (E1,E2) , deux cellules pour la couche cachée (C1,C2) et une sorte (S1)
Chaque liaison correspond à des poids P1 à P6, qui vont influencer la valeur des cellules en aval. Des fonctions mathématiques sont utilisées
pour calculer la valeur de ces poids en fonction des différentes cellules de chaque couche.
Le principe d'apprentissage est le suivant : On applique en entrée (E1,E2) différentes valeurs (0 ou 1) et à chaque fois on regarde en sortie
la différence ("L'erreur") entre le résultat attendu et le résultat fourni par le réseau de neurones. A chaque itération le but est de minimiser l'erreur en sortie.
Pour cela c'est du calcul mathématique pur faisant intervenir des notions de dérivées partielles. Grosso modo, la dérivée d'une fonction permet de connaître son sens de variation,
et grâce à cela on peut savoir comment agir sur ses paramètres pour faire converger vers la solution attendue.
Donc ici, le but est que le système se débrouille tout seul pour obtenir la bonne valeur en sortie en réglant correctement les poids.
La fonction OU exclusif logique

Ce programme est une implémentation d'un réseau de neurones multicouches avec une couche cachée utilisant la bibliothèque NumPy. Il s'agit d'un exemple d'un réseau de neurones à propagation avant (feedforward) avec rétropropagation du gradient.
Voici ce que fait le programme :
Il importe la bibliothèque NumPy, qui fournit des fonctionnalités pour effectuer des calculs matriciels et des opérations sur les tableaux.
Il définit les hyperparamètres du réseau neuronal, tels que le nombre d'itérations (epochs), la taille de la couche d'entrée (inputLayerSize), la taille de la couche cachée (hiddenLayerSize) et la taille de la couche de sortie (outputLayerSize).
Il initialise les poids (Wh et Wz) de manière aléatoire pour les connexions entre la couche d'entrée et la couche cachée, ainsi que pour les connexions entre la couche cachée et la couche de sortie.
Il définit deux fonctions d'activation : sigmoid, qui calcule la fonction sigmoïde, et sigmoid_, qui calcule la dérivée de la fonction sigmoïde.
Il définit les données d'entrée (X) et les résultats attendus (Y) pour la porte logique OR. Dans cet exemple, chaque ligne de la matrice X représente une paire de valeurs binaires, et chaque élément de la matrice Y représente le résultat correspondant de la porte logique OR.
Il effectue la phase d'apprentissage en bouclant sur le nombre d'itérations spécifié. À chaque itération, il effectue les étapes suivantes :
a. Calcule les valeurs de la couche cachée (H) en appliquant la fonction d'activation sigmoid à la multiplication matricielle des données d'entrée (X) par les poids de la couche cachée (Wh).
b. Calcule les valeurs de la couche de sortie (Z) en effectuant une multiplication matricielle des valeurs de la couche cachée (H) par les poids de la couche de sortie (Wz).
c. Calcule l'erreur (E) en soustrayant les valeurs de la couche de sortie (Z) des résultats attendus (Y).
d. Calcule le delta (dZ) en multipliant l'erreur (E) par le taux d'apprentissage (L).
e. Met à jour les poids de la couche de sortie (Wz) en ajoutant le produit de la transposée de la couche cachée (H.T) et du delta (dZ).
f. Calcule le delta (dH) de la couche cachée en multipliant le delta (dZ) par la transposée des poids de la couche de sortie (Wz.T) et en le multipliant par la dérivée de la fonction d'activation sigmoid de la couche cachée (sigmoid_(H)).
g. Met à jour les poids de la couche cachée (Wh) en ajoutant le produit de la transposée des données d'entrée (X.T) et du delta (dH).
Après la phase d'apprentissage, il affiche les valeurs finales de la couche de sortie (Z), qui représentent les prédictions du réseau neuronal pour les données d'entrée (X)


On voit que la sortie vaut -0,07 et 0,05 (donc très proche de 0) pour les valeurs d'entrée a=0 et b=0 ou a=1 et b=1
De même, pour a=0 b=1 et a=1 b=0 , on a comme valeur de sortie 0,98 , c'est à dire presque 1 qui est la valeur théorique attendue.
On a bien les résultats attendus pour une table de vérité OU exclusif.
La fonction ET logique


Au début on initialise les poids des neurones d'entrées et cachées avec des valeurs aléatoires et on lance les calculs:
Et le résultat:
On voit que le système neuronal a trouvé des valeurs de poids permettant d'obtenir les résultats attendu avec une très faible erreur.
Lorsque les poids ont été calculés, le système est dit "entrainé" et il est capable ensuite de déterminer seul les sorties en fonction des entrées.
C'est l'équivalent de l'équation logique du ET : S = A.B , qui signifie S=1 si A=1 et B=1 , et 0 pour les autres combinaisons.
Dans notre exemple, on voit que pour A=0 et B=1 , la sortie vaut 0.01442 (soit proche de 0) et pour A=1 B=1 la sortie vaut 0.9986 (soit presque 1)
L'exemple ici est tout simple et le nombre d'entrée très limité. Mais on peut extrapoler sur un plus grand nombre d'entrées pour réaliser
des fonctions logiques beaucoup plus complexe où le système se débrouille tout seul pour déterminer la fonction globale.
Tout le jeu ensuite est déterminer le nombre de couches cachées et d'agir sur divers paramètres (choix des fonctions d'activation, epoques, taux d'apprentissage etc...)
pour obtenir un système qui converge vers les bonnes solutions (car cela peut diverger, avec impossibilité de corriger les erreurs ...)
Additionneur binaire
Pour un additionneur binaire on : 0+0 = 0 , 0+1=1 1+0 = 1 et 1+1 = 10Là , après plusieurs tests, il faut 3 couches de neurones cachées :


Pour l'évaluation, on trouve bien les résultats attendus
Vous pouvez télécharger tous les sources programme de cette page ici :
Programme python OU exclusif
Programme python ET logique
Programme python Additionneur logique