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 @@ -59,7 +59,7 @@
"| 7 | Réductions + axis | `sum`, `mean`, `std` par axe | \"Quelle dimension ma réduction écrase-t-elle ?\" |\n",
"| 8 | Reproductibilité | `default_rng(seed)` | \"Comment rendre un tirage aléatoire reproductible ?\" |\n",
"\n",
"**Coût total** : < 5 secondes (imports + 18 cellules code, dont une boucle de\n",
"**Coût total** : < 5 secondes (imports + une boucle de\n",
"1M éléments mesurée contre sa version vectorisée).\n",
"\n",
"**Concepts clés** : `ndarray`, vectorisation, broadcasting, indexation avancée,\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@
"source": [
"### Lecture — la vérification vaut preuve\n",
"\n",
"Le from-scratch et `sklearn` donnent la **même précision** (0.925) et **exactement les mêmes prédictions** (les classes coïncident bit à bit). Les moyennes de classe apprises sont identiques : sur la classe 1, chaque dimension est décalée de **l'ordre de +1** par rapport à la classe 0 — précisément le `+1.2` imposé à la génération, les moyennes échantillonnées s'en écartant légèrement (`[1.26, 0.91, 1.16]` sur les trois premières valeurs). Le code de 10 lignes **reproduit** la lib de référence, sur les mêmes données : la série gagne la même exigence de preuve que le reste du catalogue."
"Le from-scratch et `sklearn` donnent la **même précision** (0.925) et **exactement les mêmes prédictions** (les classes coïncident bit à bit). Les moyennes de classe apprises sont identiques : sur la classe 1, chaque dimension est décalée de **l'ordre de +1** par rapport à la classe 0 — précisément le `+1.2` imposé à la génération, les moyennes échantillonnées s'en écartant légèrement (`[1.26, 0.91, 1.16]` sur les trois premières valeurs). Le code **reproduit** la lib de référence, sur les mêmes données : la série gagne la même exigence de preuve que le reste du catalogue."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@
"source": [
"## 3. Reconstruire le dual que `SVC` ne rend pas\n",
"\n",
"`SVC` n'expose pas le vecteur `alpha` complet — il rend `dual_coef_` (les `y_i · α_i` **des seuls supports**, concaténés) et `support_` (leurs indices dans le train). Le dual complet se reconstruit en deux lignes : `alpha` nul hors supports, `|dual_coef_|` sur les supports. Avec lui, tous les instruments de 2.7b section 10 se pointent sur LIBSVM :\n",
"`SVC` n'expose pas le vecteur `alpha` complet — il rend `dual_coef_` (les `y_i · α_i` **des seuls supports**, concaténés) et `support_` (leurs indices dans le train). Le dual complet se reconstruit : `alpha` nul hors supports, `|dual_coef_|` sur les supports. Avec lui, tous les instruments de 2.7b section 10 se pointent sur LIBSVM :\n",
"\n",
"- `||w||²` reconstruit depuis le dual : `Σ_ij (y_i α_i)(y_j α_j) K(x_i, x_j)` ;\n",
"- objectif dual `D(α) = Σ α_i − ½ ||w||²` ;\n",
Expand Down Expand Up @@ -850,7 +850,7 @@
"source": [
"## Conclusion\n",
"\n",
"Le geste SOTA tient en deux lignes et trois ordres de grandeur de temps gagnés, mais ce notebook a surtout montré que **la boîte noire s'ouvre** : le dual complet se reconstruit depuis `dual_coef_`, le gap de dualité et les violations KKT se mesurent sur LIBSVM exactement comme sur la SMO maison, et la tolérance d'arrêt est un contrat explicite — pas une promesse d'optimalité exacte. Les deux solveurs rendent le même classifieur au `tol` près : c'est la définition opérationnelle d'un problème bien posé.\n",
"Le geste SOTA vaut trois ordres de grandeur de temps gagnés, mais ce notebook a surtout montré que **la boîte noire s'ouvre** : le dual complet se reconstruit depuis `dual_coef_`, le gap de dualité et les violations KKT se mesurent sur LIBSVM exactement comme sur la SMO maison, et la tolérance d'arrêt est un contrat explicite — pas une promesse d'optimalité exacte. Les deux solveurs rendent le même classifieur au `tol` près : c'est la définition opérationnelle d'un problème bien posé.\n",
"\n",
"**Couverture de l'EPIC optimisation convexe** ([#16061](https://github.com/jsboige/CoursIA/issues/16061)) : ce notebook couvre le **bloc B.5** (SVM-SOTA). Les blocs **B.6** (Lasso-SOTA : `sklearn.linear_model` coordinate descent, CV du λ) et **B.7** (CVXPY déclaratif, solvers ECOS/SCS) sont couverts par [2.11b — Proximal Operators from scratch](2.11b-Proximal-Operators-From-Scratch.ipynb), qui confronte ISTA/FISTA aux implémentations scikit-learn et à `cvxpy` sur le même problème Lasso. Les blocs A.1 (SMO) et A.3 (proximal) sont livrés par [2.7b](2.7b-SMO-From-Scratch.ipynb) et 2.11b ; le bloc A.2 (ADMM) reste ouvert.\n",
"\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -910,8 +910,8 @@
"quantification dynamique ne touche que la tête Linear (640 poids, 0,2 % du modèle) sur\n",
"un réseau dominé par les convolutions. La version manuelle fait exactement ce qu'elle\n",
"annonce — **sur un périmètre qui ne pèse rien sur ce modèle**. Sa valeur est ailleurs :\n",
"25 lignes où le scale, l'offset, l'arrondi et le clamp sont **lisibles**, contre\n",
"1 ligne d'API opaque."
"un code où le scale, l'offset, l'arrondi et le clamp sont **lisibles**, contre\n",
"une API opaque."
]
},
{
Expand Down Expand Up @@ -1426,14 +1426,14 @@
"réellement les octets (x2,0) sans rien perdre.\n",
"\n",
"**2. La vraie différence A-vs-B n'est pas l'outillage, c'est la politique.** INT8 : les\n",
"deux implémentations convergent à ±0,02 (représentation équivalente, 25 LOC contre 1).\n",
"deux implémentations convergent à ±0,02 (représentation équivalente).\n",
"Pruning : 5,96 points séparent les lignes — mais ils viennent de l'allocation (par\n",
"couche vs globale), pas de l'API. Le SOTA vaut par ses **defaults plus malins** et ses\n",
"noyaux quand son périmètre atteint les poids qui comptent (FX statique, 3.9e : x4,0 en\n",
"taille et latence CPU 21,4 → 12,1 ms).\n",
"\n",
"**3. Pourquoi le from scratch, quand le SOTA.** Les 25 lignes du `LinearInt8Manuel` et\n",
"les 14 du pruneur manuel rendent scale, offset, arrondi, masque **lisibles et\n",
"**3. Pourquoi le from scratch, quand le SOTA.** Le `LinearInt8Manuel` et\n",
"le pruneur manuel rendent scale, offset, arrondi, masque **lisibles et\n",
"vérifiables** — ce qu'aucun appel d'API n'enseigne. Le SOTA devient le bon outil des que\n",
"le périmètre est large (CNN complet : FX), la cible est la production (edge, export), ou\n",
"que la politique d'allocation embarquée (globale) est celle qu'on veut. La distillation\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1162,7 +1162,7 @@
"\n",
"*(lire le tableau final §6, il porte la conclusion)*\n",
"\n",
"- **Le wrapper avale le code** : quelques dizaines de lignes effectives ici contre ~400 au 4.2c pour le même terrain — boucle d'entraînement, augmentation, NMS, validation : c'est le contrat `ultralytics`, et il est tenu. Quatre modèles = deux lignes de code supplémentaires, pas 400.\n",
"- **Le wrapper avale le code** : boucle d'entraînement, augmentation, NMS, validation : c'est le contrat `ultralytics`, et il est tenu. Quatre modèles = un surcoût de code négligeable.\n",
"- **La performance est celle d'un petit modèle très bien optimise** : les YOLO sont conçus pour le temps réel embarque — le nano n'a pas la profondeur des ResNet50 du 4.2f, mais son rapport latence/précision est son terrain d'élection. Le v5nu et le v8s montrent que **la marge dans la même famille** est plus grande qu'on ne le croit (8x les params entre nano et small).\n",
"- **Le prix : le format et la boite noire** — données sur disque dans un format impose, hyperparamètres par defaut enfouis, metrique auto-rapportee a protocole interne (exercice 3). Le 4.2c existe precisement pour qu'aucune de ces cases noires ne soit magique.\n",
"- **Le choix est mesure, pas dogmatique** : comprendre (4.2c), finetuner fin (4.2f), deployer vite (4.2g en 4 modèles) — trois etages, un même terrain, un tableau."
Expand Down Expand Up @@ -1212,7 +1212,7 @@
"\n",
"- **Dans la même famille, YOLOv5nu voisine YOLO11n** (memes ordres de params, mAP au même palier) — la migration ultralytics v8.4 a nivelé les recettes. **YOLOv8s gagne la course** sur ce terrain (mAP + quelques points, ~4x les params) — c'est la profondeur du petit modele, pas la recette. La courbe nano < small du §6 est tenue.\n",
"\n",
"- **Le wrapper est un choix d'ingenierie, pas un raccourci intellectuel** : les ~400 lignes du from scratch du 4.2c achetent la comprehension ; les trois lignes de `model.train(...)` achetent la vitesse de mise en production. La serie refuse de choisir a ta place — elle chiffré les deux.\n",
"- **Le wrapper est un choix d'ingenierie, pas un raccourci intellectuel** : le from scratch du 4.2c achète la comprehension ; l'appel à `model.train(...)` achète la vitesse de mise en production. La serie refuse de choisir a ta place — elle chiffré les deux.\n",
"\n",
"- **Le protocole maison reste la règle d'or** : jamais évaluer un modèle uniquement au metre auto-rapporte de son framework — l'exercice 3 montre ou vivent les ecarts.\n",
"\n",
Expand Down
Loading