Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
"source": [
"# 3.4c — Mixture of Experts : router les jetons, croître sans payer\n",
"\n",
"**Navigation** : [<< 3.4 — Attention & Transformer](3.4-Attention-Transformer-From-Scratch.ipynb) · [3.4d — Fourier features >>](3.4d-Fourier-Features-Biais-Spectral-Python.ipynb) · [Feuille de route de la série](README.md)\n",
"\n",
"\n",
"Le bloc FFN d'un Transformer est appliqué **identiquement** à chaque jeton, quelle que soit sa nature : un article, un chiffre, un verbe conjugué passent par la même matrice. L'idée du *Mixture of Experts* (Jacobs et al. 1991, adapté aux Transformers par Shazeer et al. 2017, puis Switch Transformer, Fedus et al. 2021) est de **conditionner ce calcul** : un petit routeur choisit, pour chaque jeton, lesquels de E réseaux indépendants — les *experts* — vont le traiter.\n",
"\n",
"Le pari économique : si seulement k des E experts travaillent par jeton, le modèle a E fois plus de paramètres qu'un FFN dense de même largeur, pour un coût de calcul par jeton qui ne croît que comme k. C'est la promesse qu'il faut mesurer et non réciter : **paramètres et calcul se découplent-ils vraiment, et à quel prix d'apprentissage ?**\n",
Expand Down Expand Up @@ -1566,13 +1569,13 @@
"end_time": "2026-09-19T13:40:37.538058",
"environment_variables": {},
"exception": null,
"input_path": "D:\\Dev\\CoursIA-16795-qc\\MyIA.AI.Notebooks\\ML\\DataScienceWithAgents\\03-DeepLearning\\3.4c-MoE-from-scratch.ipynb",
"output_path": "D:\\Dev\\CoursIA-16795-qc\\MyIA.AI.Notebooks\\ML\\DataScienceWithAgents\\03-DeepLearning\\3.4c-MoE-from-scratch_output.ipynb",
"input_path": "3.4c-MoE-from-scratch.ipynb",
"output_path": "3.4c-MoE-from-scratch.ipynb",
"parameters": {},
"start_time": "2026-09-19T13:39:11.693609",
"version": "2.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ séries (RL, PostTraining, ML-Training-Pipeline). L'entraînement final du 2.9 e
| [3.3-Regularisation](3.3-Regularisation.ipynb) | Dropout, weight decay et early stopping écrits à la main sur un MLP construit pour surapprendre (17 000 paramètres, 100 points d'entraînement, 12 étiquettes fausses) | **Corriger la variance sans changer le modèle** : trois remèdes appliqués au même surapprentissage fabriqué | sans régularisation : val acc 84,0 % (les 12 erreurs mémorisées) ; dropout p=0,3 : 89,0 % ; early stopping : +4,5 % ; gradient check du dropout (masque gelé) et invariants du dropout inverse (p=0,4, 2000×50) |
| [3.4-Attention-Transformer-From-Scratch](3.4-Attention-Transformer-From-Scratch.ipynb) | De l'attention mono-tête lisible sur l'inversion de séquence au mini-GPT de 1,25 M entraîné dans le notebook | **L'attention jusqu'au bout, sur CPU** : attention + masque causal + multi-têtes + bloc pré-norme, équivalence numérique avec `torch.nn`, mini-GPT char-level entraîné (117 s) sur le *Horla* (Maupassant, domaine public, 59 k caractères) | sac de mots A = B pour phrases opposées (1-9) ; inversion : poids requete 0 = `[0,007 0,007 0,007 0,007 0,007 0,967]` ; multi-têtes maison vs `torch.nn.MultiheadAttention` à 2,38e-07 (assert allclose 1e-5) ; mini-GPT 1 251 040 paramètres : perte ln(85)=4,44 → train 2,46 / val 2,45 en 800 étapes (117 s), perplexité val 11,5 ; 4 têtes spécialisées post-entraînement (diagonale 0,110 / 0,172 / 0,133 / 0,102) |
| [3.4c-MoE-from-scratch](3.4c-MoE-from-scratch.ipynb) | La couche Mixture of Experts écrite à la main (routeur top-k, capacité par expert avec jetons jetés, loss d'équilibrage `E·Σ f_i·P_i`), son coût mesuré en millisecondes contre deux FFN denses d'équivalence (iso-calcul, iso-paramètres) puis son entraînement dense contre MoE sur la tâche jouet du 3.4b | **Découpler paramètres et calcul** : E experts dont seuls k travaillent par jeton — le banc entrelacé mesure ce que la promesse vaut réellement, routage compris | routeur vérifié sur cas contrôlés (entropie uniforme 2,0794 = ln 8, tie-break de `topk` exposé) ; banc de coût : MoE E=8 k=2 (1 054 720 params) à 0,75× le temps du dense-32d iso-paramètres mais ~2,9× le dense-8d iso-calcul (rapports calculés dans la même cellule ; les temps absolus varient avec la machine) — le routage top-k a un coût propre qui mange une partie de l'économie théorique ; qualité : la tâche jouet ne discrimine pas (acc 1,000 partout, dit comme tel) — l'information est dans les routeurs : sans loss d'équilibrage, parts 0,284…0,000 ; avec α=0,01, parts 0,118–0,134 quasi uniformes (L_aux 1,29 → 1,00) ; 3 exercices |
| [3.4d-Fourier-Features-Biais-Spectral](3.4d-Fourier-Features-Biais-Spectral-Python.ipynb) | Le **biais spectral** d'un MLP tanh reproduit empiriquement (Rahaman et al. 2019) face à un signal 1D à 13 cycles, puis débloqué par le mapping de Fourier `γ(x) = [cos(2πB x), sin(2πB x)]` avec `B ~ N(0, σ²)` (Tancik et al. 2020, geste NeRF) — trois régimes mesurés (sous-ajustement, bande utile, aliasing) plus un témoin négatif qui combine σ=50 et h=256 : la capacité mémorise le train sans récupérer le test | **Le MLP n'apprend pas les hautes fréquences** : la NTK tanh a une bande passante trop étroite pour la cible 13 cycles ; un mapping `B ~ N(0, σ²)` adapté la débloque, σ excessif re-sur-ajuste — la MSE comme bande à dépasser, pas comme optimum ponctuel | garde gradient 2,08e-07 (seuil 1e-5) ; balayage σ (64 pts train / 400 test, seed 0) : baseline 3,23e-01 (plafond spectral), σ=1 1,40e-02, σ=2 minimum à 8,33e-03, σ=5 1,21e-02, σ=10 9,70e-03, σ=20 7,41e-02 (aliasing), σ=50 4,42e-01 ; témoin négatif σ=50 + h=256 (99 073 paramètres) : MSE train 1,36e-07 contre test 4,32e-01, rapport 3,2e-07 — la capacité mémorise le train sans gain au test ; 3 exercices |
| [3.5-Phenomenes-de-Generalisation](3.5-Phenomenes-de-Generalisation.ipynb) | Grokking et double descente reproduits en NumPy pur (MLP à embeddings + Adam à la main), confrontés à la borne PAC du 2.8 | **Le phénomène sans la boîte noire** : mémorisation → transition abrupte, et le W de la double descente | garde gradient ≤ 1e-6 (embeddings inclus) ; grok mesuré : train saturé ~500 pas, test 100 % des dizaines de milliers de pas plus tard (wd = 1) ; contre-témoin wd = 0 ; double descente : pic au seuil M ≈ n (×5 le creux), asymptote moderne sous le creux classique, 20 graines |
| [3.6-Modeles-Generatifs](3.6-Modeles-Generatifs.ipynb) | VAE, GAN et diffusion (DDPM) écrits en NumPy pur, même cible (huit modes sur un cercle), même budget (6 000 pas, batch 256, largeur 64), face à une baseline GMM ajustée par EM | **Trois objectifs, trois échecs** : le VAE couvre mais moyenne, le GAN s'effondre, la diffusion raffine au prix de 100 passes par échantillon | garde gradient 1,4e-08 (ELBO + reparamétrisation) et 3,2e-10 (eps-net) ; multi-4-graines : GMM 8/8 disp 0,99 (2,2 s) ; VAE 8/8 disp 6,0 ; GAN 1,5 ± 0,5 modes ; DDPM 8/8 disp 1,51 ; trajectoire de denoising en 5 instantanés (t = 99 → 0) |
| [3.6b-Modeles-Generatifs-PyTorch](3.6b-Modeles-Generatifs-PyTorch.ipynb) | Versant **framework** du 3.6 : VAE, GAN et DDPM (diffusion) entraînés sur une même cible 2D à 4 modes (mélange de Gaussiennes, PyTorch CPU) puis comparés — ELBO vs adversarial vs débruitage | **Le compromis qualité/diversité** : 4 mécanismes génératifs sur les mêmes métriques (couverture de modes, entropie effective), le GMM empirique en référence « modèle exact » | médiane sur 3 graines (budget de pas commun) : GMM cov 4/4 ESS 3,96 · VAE cov 4/4 ESS 3,95 · GAN cov 3/4 ESS 2,99 (perte de diversité, un mode jamais couvert) · Diff cov 4/4 ESS 1,62 (couvre mais sous-échantillonne le mode le plus faible) — verdict nuancé, pas de « gagnant » unique |
Expand Down
Loading