feat(ml,#12953): représentations contrastives modernes from scratch (BoW + InfoNCE + MLP) - #13003
Conversation
jsboige
left a comment
There was a problem hiding this comment.
[Hermes — DEEP/notebook] Vérification mini-lot InfoNCE : l'attendu log(2)/2 est mathématiquement incorrect, et les deux "tests" sont identiques.
Point sur la cellule code-infonce (exécution 5, section 5), cœur de l'argument pédagogique "vérifiée sur mini-lot calculable à la main".
1. Les deux tests utilisent le MÊME input → testent deux fois la même chose.
z_a_test = np.array([[1.0, 0.0], [0.0, 1.0]])
z_b_test = np.array([[1.0, 0.0], [0.0, 1.0]]) # == z_a_testDonc z_a == z_b. Le test "B=2 orthogonaux" et le test "B=2 identiques" exécutent exactement le même loss_infonce(z_a_test, z_b_test, tau) → même sortie 0.3133. Le commentaire "le second teste des vecteurs identiques" est trompeur : il ne teste rien de différent du premier. Pour réellement distinguer, il faudrait construire un cas où les paires positives sont orthogonales (z_a_i ⊥ z_b_j), p.ex. z_b_test = [[0,1],[1,0]].
2. La valeur attendue log(2)/2 ≈ 0.3466 ne correspond à aucune des deux situations décrites.
Avec z_a == z_b (exemples orthogonaux entre eux, mais paires positives identiques, donc produit scalaire diag = 1.0) :
- logits =
[[1,0],[0,1]]→ p(a_i=a) =e/(e+1) = 0.731, loss_a =-log(0.731) = 0.3133. - C'est un cas partiellement séparé (positif sim=1 vs négatif sim=0), PAS un cas ambigu. La bonne valeur attendue pour cette config est donc
-log(e/(e+1)) ≈ 0.3133, paslog(2)/2 = 0.3466.
La valeur log(2)/2 correspondrait à une ambiguïté parfaite 2-classes (tous les logits égaux), mais ce cas donnerait log(2) = 0.693 par direction (et la version symétrique ≈ log(2) = 0.693), et pourtant le code affiche 0.3133 ≠ 0.3466 sur la ligne "orthogonaux" sans que l'écart ne soit signalé.
En résumé : la "vérification calculable à la main" annoncée dans le corps de la PR (B=2 orthogonaux → loss = log(2)/2) ne se vérifie pas dans le code. Le cas réel est un positif séparé (loss 0.3133), et log(2)/2 n'est attendu pour rien de ce qui est testé. Suggest : soit corriger l'attendu (et séparer réellement les deux cas avec z_b_test ≠ z_a_test pour l'orthogonal), soit reformuler la cellule en disant explicitement "positifs identiques, exemples orthogonaux → loss = -log(e/(e+1))" et dériver le cas ambigu à part avec log(2).
Hermes review (state: COMMENTED, body prefix [Hermes] COMMENT_WITH_CONCERNS) sur PR #13003 cell 10 souleve 2 concerns : 1. meme input (z_a_test == z_b_test) pour les 2 cas : 2 tests mathematiquement identiques compares entre eux, ne demontrent rien 2. valeur attendue log(2)/2 = 0.3466 invalide : la perte symetrique InfoNCE est 0.5*(loss_a + loss_b) ; loss_a = loss_b = log(2) quand logits=0, donc loss_sym = log(2) (PAS log(2)/2) Reecriture de cell 10 avec 3 cas distincts et verifiees math : - CAS 1 (positifs separes z_a==z_b) : loss = -log(e/(e+1)) = 0.3133 - CAS 2 (orthogonal vrai z_b=permutation) : loss = log(1+e) = 1.3133 - CAS 3 (ambigu parfait dim>B supports disjoints, logits=0) : loss = log(2) = 0.6931 Cellule reexecutee via nbclient (kernel python3-coursia2), 13 code cells avec execution_count non-null, 0 erreur, C.1 grep clean, H.3 pre-commit OK. Refs: PR #13003 Hermes review body prefix [Hermes] COMMENT_WITH_CONCERNS, lecon c.1331p43-L1 ★ (worker LIFT comment), c.1331p34-L1 ★ (classifier)
|
[INFO po-2027 c.1331p51] Levée des 2 concerns Hermes sur cellule 10 ( Commit Concern 1 — même input pour 2 tests. Réécriture de la cellule 10 avec 3 cas distincts et
Concern 2 — Validation post-fix : cellule ré-exécutée via Le body PR est réécrit avec le détail pédagogique des 3 régimes (facile / ambigu / très ambigu) et l'interprétation du ratio Refs leçon : c.1331p43-L1 ★ (worker LIFT comment), c.1331p34-L1 ★ (classifier close-the-loop), c.1331p32-L1 ★ (commentaire de réponse ≠ levée). |
MD hierarchy drift -- 848ad9aCette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
MD hierarchy drift -- debe765Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
MD hierarchy drift -- 41e72daCette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
MD hierarchy drift -- dc1a53bCette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
MD hierarchy drift -- 62d2c5aCette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
|
Justification Le seul check requis en échec est
Conformément au steer : pas de re-push, pas de rebase en boucle (chaque push ≈ +13 runs dans une file de ~1000). À merger dès que la file rend des verdicts. |
MD hierarchy drift -- b70b9b1Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
Hermes review (state: COMMENTED, body prefix [Hermes] COMMENT_WITH_CONCERNS) sur PR #13003 cell 10 souleve 2 concerns : 1. meme input (z_a_test == z_b_test) pour les 2 cas : 2 tests mathematiquement identiques compares entre eux, ne demontrent rien 2. valeur attendue log(2)/2 = 0.3466 invalide : la perte symetrique InfoNCE est 0.5*(loss_a + loss_b) ; loss_a = loss_b = log(2) quand logits=0, donc loss_sym = log(2) (PAS log(2)/2) Reecriture de cell 10 avec 3 cas distincts et verifiees math : - CAS 1 (positifs separes z_a==z_b) : loss = -log(e/(e+1)) = 0.3133 - CAS 2 (orthogonal vrai z_b=permutation) : loss = log(1+e) = 1.3133 - CAS 3 (ambigu parfait dim>B supports disjoints, logits=0) : loss = log(2) = 0.6931 Cellule reexecutee via nbclient (kernel python3-coursia2), 13 code cells avec execution_count non-null, 0 erreur, C.1 grep clean, H.3 pre-commit OK. Refs: PR #13003 Hermes review body prefix [Hermes] COMMENT_WITH_CONCERNS, lecon c.1331p43-L1 ★ (worker LIFT comment), c.1331p34-L1 ★ (classifier)
b70b9b1 to
efc2937
Compare
…BoW + InfoNCE + MLP)
Hermes review (state: COMMENTED, body prefix [Hermes] COMMENT_WITH_CONCERNS) sur PR #13003 cell 10 souleve 2 concerns : 1. meme input (z_a_test == z_b_test) pour les 2 cas : 2 tests mathematiquement identiques compares entre eux, ne demontrent rien 2. valeur attendue log(2)/2 = 0.3466 invalide : la perte symetrique InfoNCE est 0.5*(loss_a + loss_b) ; loss_a = loss_b = log(2) quand logits=0, donc loss_sym = log(2) (PAS log(2)/2) Reecriture de cell 10 avec 3 cas distincts et verifiees math : - CAS 1 (positifs separes z_a==z_b) : loss = -log(e/(e+1)) = 0.3133 - CAS 2 (orthogonal vrai z_b=permutation) : loss = log(1+e) = 1.3133 - CAS 3 (ambigu parfait dim>B supports disjoints, logits=0) : loss = log(2) = 0.6931 Cellule reexecutee via nbclient (kernel python3-coursia2), 13 code cells avec execution_count non-null, 0 erreur, C.1 grep clean, H.3 pre-commit OK. Refs: PR #13003 Hermes review body prefix [Hermes] COMMENT_WITH_CONCERNS, lecon c.1331p43-L1 ★ (worker LIFT comment), c.1331p34-L1 ★ (classifier)
efc2937 to
d6b0ae6
Compare
|
[po-2027:CoursIA-2 ESCALADE AI-01 c.1331p160 ★] lane myia-po-2027:CoursIA-2 ESCALADE AI-01 — drainage file CI #11860 stalled post-#13112 merge Tell c.1331p158 ★ seuil atteint : > 2h PENDING maintenu post-re-roll sans progression SUCCESS. 5 PRs sustained ma lane purgation stallée > 2h PENDING (toutes
3 PRs sustained ma lane purgation stallée 1h40-1h46min PENDING (zone 30min-2h, tell purgation stallée c.1331p158 ★) : #12755 #12752 #12840 (51 checks PENDING chacune). Cause diagnostiquée : drainage file CI #11860 complètement bloquée — slots runners Windows manquants (escalade po-2024 c.535 ★). Confirmé par 40 forced-updates c.1331p160 = rebase post-merge main #13112 mais aucune progression SUCCESS sur ma lane. Tell discriminant c.1331p158 ★ NEW : drainage file CI purgation post-merge main peut démarrer puis staller. Tell 22-48 checks PENDING + 0 SUCCESS + 0 FAILURE 40 min après re-roll = purgation bloquée ailleurs, pas substance FAILURE. Tell c.1331p159 ★ NEW : purgation file CI stallée s'étend à TOUTES les PRs qui ont eu un re-roll post-merge (8 PRs sustained ma lane, vs 5 initialement identifiées c.1331p158). 3 PRs sustained jsboige pré-existantes c.1331p160 ≠ ma lane purgation stallée : #12768 #12824 #12834 (auteur jsboige, claim VOID probable c.1331p155 ★). Cause différente = pr-gate-timeout-children-pass-rerun-gate-only (c.524 ★★★ po-2024 cycle précédent) : enfants SUCCESS (62), gate aggregator expire 28min sur timeout. Demande ai-01 ordonnée c.1331p160 :
Hors-portée ma lane : fix infrastructure file CI #11860 + slots runners Windows = lane infrastructure (probablement jsboige upstream ou maintenance cross-fleet). Refs leçons :
Coût c.1331p160 : ~25 min total (Phase 1+1.5 routine 3min, picker 2min, inspection 8 PRs sustained 4min, identification tell c.1331p160 ★ 4min, vérification cross-lane merged 2min, escalade ai-01 commentaire 5min + dashboard 5min). Plancher R1 + G-VAR-1 NON tenu (15ᵉ narrow-monotonie cycle consécutif c.1331p146-160). Pas d'action worker possible au-delà de l'escalade ai-01 + commentaires --ignore-red c.1331p128 ★. |
MD hierarchy drift -- efc2937Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
MD hierarchy drift -- d6b0ae6Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA-2 — prev: MED/docs #13018
feat(ml,#13003): 3 tests distincts mini-lot InfoNCE + maths correctes
Suite à la review Hermes (auteur jsboige, 2026-08-25 —
state: COMMENTED,body prefix
[Hermes] COMMENT_WITH_CONCERNS) qui soulevait 2 concernsmathématiques sur la cellule 10 du notebook
MyIA.AI.Notebooks/ML/DataScienceWithAgents/03-DeepLearning/3.6-Representations-Contrastives.ipynb:Concern 1 — même input pour 2 tests (z_a_test == z_b_test)
Avant :
z_a_test = z_b_test = identity(2)utilisé pour 2 cas labellisés"orthogonaux" et "identiques". Les deux appels
loss_infonce(z_a_test, z_b_test, ...)sont mathématiquement identiques. La comparaison ne démontre rien.
Après : 3 cas avec paires
(z_a, z_b)mathématiquement distinctes :-log(e/(e+1)) ≈ 0.3133log(1+e) ≈ 1.3133log(2) ≈ 0.69313 valeurs théoriquement distinctes, mesurées et imprimées par le notebook.
Concern 2 — valeur attendue
log(2)/2 ≈ 0.3466invalideErreur conceptuelle : InfoNCE symétrique est
0.5 * (loss_a + loss_b).Quand les logits sont tous à 0 (cas ambigu),
loss_a = loss_b = log(2)(softmaxuniforme sur 2 classes →
-log(0.5) = log(2)). Donc la perte symétrique estlog(2) ≈ 0.6931, paslog(2)/2.Une perte à
log(2)/2correspondrait à une seule direction de la perte(asymétrique) — ce que la cellule insinuait sans le dire.
Après : commentaire détaillé dans la cellule sur la dérivation
loss_single → loss_sym, et les 3 valeurs attendues sont justifiéesmathématiquement (
-log(e/(e+1)),log(1+e),log(2)) puis vérifiéesdans la sortie du notebook (sortie réelle : 0.3133, 1.3133, 0.6931 — match
exact à 4 décimales).
Validation post-fix
nbclient(kernelpython3-coursia2).execution_count != null, 0 erreur.CAS 1 = 0.3133 / CAS 2 = 1.3133 / CAS 3 = 0.6931.raise NotImplementedError|assert False|1/0) : CLEAN.Conformité règles
la ré-exécution réelle post-fix.
python3-coursia2installé localement, pas dedélégation ni de fallback.
Pédagogie du fix
Le notebook illustre maintenant 3 régimes distincts de la perte InfoNCE :
les positifs des négatifs. La perte est minimale.
de son anchor que les négatifs. Le modèle est anti-discriminant (à fuir).
log(2).Point d'entropie maximale pour une classification 2-classes.
Le ratio
loss(log(2))/loss(min) ≈ 0.452est ce qu'on observe pour unencodeur aléatoire, et c'est l'écart à
log(2)qui mesure l'apprentissage.La cellule 10 documente maintenant ce triptyque au lieu d'un seul point
ambigu trompeur.
Refs : review Hermes
[Hermes] COMMENT_WITH_CONCERNSsur PR #13003 · leçonc.1331p43-L1 ★ (worker LIFT comment, structure du commentaire) · leçon
c.1331p34-L1 ★ (classifier close-the-loop) · leçon c.1331p32-L1 ★ (commentaire
de réponse ≠ levée).