Le dictionnaire `parametres` : un sac etiquete pour W1, b1, W2, b2

Idée

Au lieu de quatre variables baladeuses, on range les poids et biais des deux couches dans un sac etiquete que l'on passe d'une fonction a l'autre.

Pourquoi

Au lieu de quatre variables baladeuses, on range les poids et biais des deux couches dans un dictionnaire Python parametres = {"W1":..., "b1":..., "W2":..., "b2":...}. Toutes les fonctions (forward, apprentissage) recoivent ce dict en argument et l'extraient. C'est le même reflexe qu'en physique MPSI quand on regroupe (m, k, l_0, omega_0) dans un tuple plutot que de trainer quatre symboles : la fonction garde une signature lisible même quand le système grandit.

Outil

En physique MPSI : regrouper (m, k, l_0) dans un tuple plutot que trainer trois symboles dans chaque équation.

Formule

Trois entiers : ne = nb d'entrées ($n_0$), nc = nb de neurones de la couche cachée ($n_1$), ns = nb de neurones de sortie ($n_2$). Tirage gaussien standard via torch.randn : $W_1 \in \mathbb{R}^{n_1 \times n_0}$, $b_1 \in \mathbb{R}^{n_1 \times 1}$, $W_2 \in \mathbb{R}^{n_2 \times n_1}$, $b_2 \in \mathbb{R}^{n_2 \times 1}$. Pour XOR : ne=2, nc=2, ns=1, donc $W_1$ est 2x2, $b_1$ est 2x1, $W_2$ est 1x2, $b_2$ est 1x1. La graine torch.manual_seed(0) rend l'initialisation reproductible.

Piège

Si W1 est un tenseur Pytorch requires_grad=True, faire parametres['W1'] = parametres['W1'] - lr * grad crée un nouveau tenseur (perd le requires_grad ou casse le graphe). Il faut soit .data -= (en place) soit utiliser optimizer.step(). Confondre les deux casse l'apprentissage Pytorch silencieusement.