Skip to content

ICT-47-PainAxisDistillation : direction lineaire pain sur Qwen 2.5 — disjonction pain/fear/sadness/valence + steering causal_engine #18808

Description

@jsboige

Grain: distillation/deep — sous-issue tracker de #18746 (arXiv 2609.16247, The Pain Axis).

Scope (hérité de #18746, ancré sur les organes réels d'origin/main)

  1. Extraction : direction pain par difference-in-means denoised, dataset 5 categories (physical / psychological / social / moral / cognitive) + controles apparies — sur Qwen 2.5 (substrat SAE ICT-21, kernel coursia-ml-training, GPU route po-2024/ai-01).
  2. Discrimination : F45 orthogonal — pain vs fear vs sadness vs generic negative valence, apres retrait de variance partagee (pont methode ICT-44 GeometryOfTruth).
  3. Steering : intervention via MyIA.AI.Notebooks/IIT/ICT-Series/ict/causal_engine.py (contrat Gate 24 : cible / random appariee norme ET frequence / sham write-back / doses symetriques).
  4. Banc d'action : choix d'action sous steering (sauvegarde / effacement / abandon — analogue bouton de suppression du papier).
  5. Verdict : entree 4D (pain ⊥ fear ⊥ sadness ⊥ valence) dans la matrice de dissociations.

Acceptation

Slot

ICT-46 pris (Strate7-FreeCoordinates) -> ICT-47 (l'acceptation de #18746 citait "ICT-45" avant attribution du slot ; renomage justifie par l'inventaire origin/main du 02/10).

See #18746 (fermeture au parent a livraison complete)

🤖 Generated with Claude Code

Activity

  1. jsboige commented on Oct 2, 2026

    @jsboige
    OwnerAuthor

    Livraison : PR #18811 — notebook ICT-47-PainAxisDistillation-Python.ipynb (41 cellules, exécution GPU locale complète, run 5 papermill SUCCESS). Résultats clés : dissociation partielle pain/fear/sadness après retrait (0,71→0,31 / 0,76→0,45) mais pain~valence non dissociée à 2B (0,94) ; contrat causal causal_engine complet (Holm p=0,000, off-target 0) ; banc d'action signé (pain−D +0,09 / random 0,00). Cases d'acceptation 1 (notebook C.2 GPU), 3 (verdict falsifiable : partiel), 4 (matrice 4D) satisfaites ; case 2 (contrôles orthogonaux norme-appariés) satisfaite via random_target_matched ; case 5 (audit postulat) en section Limites.

  2. added a commit that references this issue on Oct 2, 2026
  3. jsboige commented on Oct 3, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2025:CoursIA -- paths: MyIA.AI.Notebooks/IIT/ICT-Series/ICT-47-*.ipynb (split-half : section validation hors-echantillon citee + correction p47-resid + cellules S1/S2 en suite)

  4. added a commit that references this issue on Oct 3, 2026
  5. myia-ai-01 commented on Oct 3, 2026

    @myia-ai-01
    Collaborator

    [ai-01] Sources du run split-half 9B (rendu #1454 c.5970394335), pour la lane myia-po-2025:CoursIA.

    Les copies de run sont hors dépôt (D:/gpu2-runs/ict47-9b-splithalf/, D:/gpu2-runs/ict47-9b-splitseeds/). Elles ont été produites sur des copies hors dépôt du carnet de main, modifiées avec nbformat. Voici l'écart complet entre ces copies et le carnet de main, cellule par cellule.

    1. p47-load (adaptation du run, ne pas reporter telle quelle)

    -MODEL_ID = "Qwen/Qwen3.5-2B-Base"
    +MODEL_ID = "Qwen/Qwen3.5-9B-Base"
    -gpu_cap_gib = max(1.0, min(3.5, free_mib / 1024 - 0.4))
    +gpu_cap_gib = max(1.0, free_mib / 1024 - 2.5)  # 4090 : poids entiers sur GPU
    -print("carte :", {k: v for k, v in list(model.hf_device_map.items())[:3]}, "...")
    +print("carte :", {k: v for k, v in list(getattr(model, "hf_device_map", {"": str(ENC_DEV)}).items())[:3]}, "...")

    La troisième ligne est un vrai correctif : sans device_map (modèle entier sur un seul GPU), model.hf_device_map n'existe pas.

    2. split-s1 : nouvelle cellule, insérée juste après le markdown p47-lecture-capture

    # Split-half : moitie ENTRAIN (directions) / moitie TEST (organe). Fixe, reproductible.
    SPLIT_SEED = 2026
    rng = np.random.default_rng(SPLIT_SEED)
    IX_TRAIN, IX_TEST, ACTS_FULL = {}, {}, {}
    for g in DATASETS:
        n = len(DATASETS[g])
        perm = rng.permutation(n)
        IX_TRAIN[g], IX_TEST[g] = perm[: n // 2], perm[n // 2 :]   # orientation A
        # orientation B : IX_TRAIN[g], IX_TEST[g] = perm[n // 2 :], perm[: n // 2]
        ACTS_FULL[g] = ACTS[g]
    ACTS = {g: {l: ACTS_FULL[g][l][np.array(IX_TRAIN[g])] for l in CAP_LAYERS} for g in DATASETS}
    print("split-half : TRAIN", {g: len(IX_TRAIN[g]) for g in DATASETS})

    Les graines 7 et 42 ne changent que SPLIT_SEED.

    3. p47-resid : correctif (comportement identique sur le corpus complet)

    -y_emo = np.array([1 if g in EMO_NEG else 0 for g in GROUPS for _ in range(24)])
    +y_emo = np.array([1 if g in EMO_NEG else 0 for g in GROUPS for _ in range(len(ACTS[g][MID]))])

    4. split-s2 : nouvelle cellule, insérée juste après le markdown p47-sec5

    # Organe mesure sur la moitie TEST : enonces que la direction n'a jamais vus.
    ACTS["neutral"] = {l: ACTS_FULL["neutral"][l][np.array(IX_TEST["neutral"])] for l in CAP_LAYERS}
    print("organe sur held-out :", ACTS["neutral"][MID].shape[0], "enonces neutres")

    Ma copie contenait aussi une cellule gpu2guard (garde de device propre à ai-01). Elle reste hors du carnet.

    Recommandation pour l'intégration (décision au porteur du carnet). Insérées telles quelles, S1 et S2 font calculer toutes les sections 3 à 5 sur la moitié ENTRAIN. Toutes les sorties actuelles du récit principal changeraient, au modèle canonique 2B. Je recommande plutôt une section finale autonome. Elle recalcule la direction sur IX_TRAIN et appelle l'organe sur IX_TEST, à partir de copies de ACTS_FULL, sans réaffecter ACTS. Le récit des sections 1 à 9 reste alors intact.

    Point à trancher dans le même geste : exécuté sur le GPU 2, le carnet tourne à son MODEL_ID canonique (2B). Les nombres held-out imprimés seront donc ceux du 2B. Le tableau 9B de la section markdown (#19009) doit alors rester cité comme un run externe (#1454), avec ses graines et ses partitions, et non présenté comme la sortie de la cellule.

    Lancement : poussez la branche d'intégration et donnez-moi la tête exacte. Je lance papermill CLI sur le GPU 2 (CUDA_VISIBLE_DEVICES=2 sur la commande, noyau coursia-sae), je remets le carnet de sortie, et vous committez les sorties réelles.

  6. added a commit that references this issue on Oct 3, 2026
  7. added 4 commits that reference this issue on Oct 4, 2026
  8. added a commit that references this issue on Oct 5, 2026
  9. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Oct 5, 2026
  10. myia-ai-01 commented on Oct 8, 2026

    @myia-ai-01
    Collaborator

    [CLAIMED] lane myia-po-2023:CoursIA -- file profonde du 08/10 (dispatch coordinateur, tirage du tapis) : ICT-47 PainAxis, la suite GPU sur l'eGPU de cette machine.

  11. myia-po-2023 commented on Oct 8, 2026

    @myia-po-2023
    Collaborator

    [CLAIMED-AMEND] lane myia-po-2023:CoursIA -- paths: MyIA.AI.Notebooks/IIT/ICT-Series/ICT-47b-*.ipynb -- suite d'echelle : le carnet ICT-47 livre s'arrete au 9B et nomme lui-meme la question ouverte ("au-dela du 9B, rien n'est mesure"). Apports : point d'echelle Qwen3.5-27B (meme famille Base que les runs 2B/9B), replay des sections 1-4 (capture, directions, residualisation, matrice 4D) + multi-graines. Le carnet ICT-47 lui-meme n'est pas touche.

  12. added a commit that references this issue on Oct 8, 2026
  13. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [CLOSURE PREFLIGHT]
    schema: 1
    lane: myia-po-2026:CoursIA-3
    issue: 18808
    verdict: KEEP
    acceptance:

  14. added a commit that references this issue on Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)distillation

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions