Skip to content

QC-Py-31 : le Transformer n'apprend rien — les deux tetes restent constantes (dir acc 57.34% plates, correlation nan) #17584

Description

@jsboige

Ce que le run committe montre

L'entrainement de reference de QC-Py-31-Transformer-Training.ipynb (FORCE_RETRAIN=True, Epochs: 1-25, kernel CUDA) n'apprend rien : les deux tetes sortent une constante des l'epoch 1.

Trace commitee (cellule Entrainement) :

Epoch Train Loss reg cls Val Loss Dir Acc
1/25 2.0620 1.7190 0.6860 2.0229 57.34%
6/25 2.0596 1.7170 0.6853 2.0211 57.34%
13/25 2.0597 1.7171 0.6852 2.0216 57.34%

Trois signatures convergentes :

  1. Direction Accuracy identique aux treize epochs (57.34%), des l'epoch 1 : c'est le taux de la classe majoritaire, pas un apprentissage.
  2. La perte de regression bouge de 0.1% (1.7190 -> 1.7171) — le modele ne parvient meme pas a reduire le train loss.
  3. Sur le test, Correlation: nan et Rendement moyen par quantile de prediction (0 quantiles) : la suite de predictions n'a pas de variance. np.corrcoef ne rend nan que si l'une des deux series est constante — le MSE reste fini (8.639617), donc il ne s'agit pas de nan propages.

Ce n'est pas le defaut « entrainement saute » de #17516

La courbe plate avait ete attribuee au checkpoint repris sans entrainement (#17516, 2e defaut). La re-execution le refute : la cellule porte Epochs: 1-25 (depart a l'epoch 1, pas une reprise) et la banniere FORCE_RETRAIN=True : checkpoint/.pt ignores, entrainement depuis zero. Le mecanisme de saut est bien corrige, mais le symptome qui l'avait fait detecter survit — sa cause est autre.

Comparaison avec main (origin/main abf155556b, meme notebook) : MSE 8.636676 / MAE 2.155939 / Correlation 0.0160 et 1 quantiles (Q1 seul). L'ecart de MSE entre les deux versions est de 0.03% : le modele n'avait pas plus de signal sur main, il y etait seulement moins exactement constant. La degenerescence est donc preexistante ; la re-execution honnete l'a rendue visible (0 quantiles, nan) au lieu de la masquer derriere une correlation de 0.0160.

Ce qui reste a tester (pistes, non tranchees)

  • Alignement fenetre/cible : build_sequences apparie features[i-seq_len:i] et la cible en i — verifier que target_risk_adj / target_direction sont bien decales de pred_len par rapport a la fenetre, et non lus a l'indice i brut.
  • Chemin du gradient : val loss oscille (2.0211 -> 2.0239) sans tendance alors que le train loss est quasi immobile — un modele de 3.2 M parametres devrait au moins reduire le train loss par memorisation. Verifier que les sorties des deux tetes dependent effectivement des entrees (test : preds.std() sur des entrees permutees ; grad_norm par couche).
  • Normalisation : le StandardScaler est fitte sur le train ; verifier que c'est bien la matrice scaled qui entre dans le modele (et non df[feature_cols].values brut).
  • AMP : verifier que le GradScaler ne saute pas tous les pas (un scale qui ne redescend jamais = aucun update).

Criteres d'acceptation

  • Un run depuis zero ou la Direction Accuracy de validation bouge entre epochs (au minimum : elle n'est plus identique d'un bout a l'autre).
  • Correlation definie (non nan) sur le set de test, ou une explication mesuree de pourquoi elle ne peut pas l'etre.
  • La serie Rendement moyen par quantile de prediction non vide (au moins 2 quantiles), ou suppression assumee de cette lecture du notebook.
  • Si la cause est intrinseque (donnees sans signal exploitable a cet horizon), le dire explicitement et corriger la prose du notebook en consequence — c'est-a-dire retirer du corps du texte les chiffres annonces comme attendus (Correlation 0.02-0.08, Direction Accuracy 51-55%).

Perimetre

MyIA.AI.Notebooks/QuantConnect/Python/QC-Py-31-Transformer-Training.ipynb (cellules d'entrainement / evaluation) et, si la cause est dans le harnais partage, MyIA.AI.Notebooks/QuantConnect/shared/gpu_training.py.

Decouvert en traitant #17516 (PR #17521) ; porte : lane myia-po-2026:CoursIA.

Activity

  1. added a commit that references this issue on Sep 23, 2026
  2. added a commit that references this issue on Sep 25, 2026
  3. jsboige commented on Sep 25, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-2 -- paths: MyIA.AI.Notebooks/QuantConnect/Python/QC-Py-31-Transformer-Training.ipynb, MyIA.AI.Notebooks/QuantConnect/shared/gpu_training.py

    Grain: DEEP/qc — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-lean #17663

    Reprise de la porte (l'issue declare porte : lane myia-po-2026:CoursIA, mais aucun [CLAIMED] n'etait pose et aucune PR ouverte ne couvre le chemin : mesure avant claim).

    Confrontation du body au reel au head courant 524e058e89 (le commit #17521 lui-meme) — le symptome est vivant :

    • FORCE_RETRAIN=True : checkpoint/.pt ignores, entrainement depuis zero.
    • Dir Acc : 57.34% -> 57.35% entre epochs 1-2 (fraction de la classe majoritaire, pas un apprentissage)
    • Train Loss : 2.0621 -> 2.0605 -> 2.0603 (immobile ; un modele de 3,2 M parametres reduirait au moins par memorisation)
    • Test : Correlation: nan, Direction Accuracy 55.51% = Baseline classe majoritaire (test) 55.51%, Ecart vs classe majoritaire: -0.00 points, 0 quantiles

    Diagnostic a venir par experience bornee (permutation d'entree + grad_norm par couche + etat du GradScaler + stats de la matrice scaled), puis fix et re-execution GPU (RTX 3070 8 GiB locale), conformement aux criteres d'acceptation de l'issue.

  4. added 2 commits that reference this issue on Sep 25, 2026
  5. jsboige commented on Sep 25, 2026

    @jsboige
    OwnerAuthor

    Hypothese « la cible de regression est la cause » : testee et refutee (mesure #17735)

    La PR #17735 a teste la piste « alignement fenetre/cible » de ce body, sur RTX 3070, kernel coursia-ml-training, FORCE_RETRAIN=1 :

    1. build_sequences apparie correctement fenetre et cible : l'ecart ne venait pas de l'indexation mais du split. Le decoupage « temporel » coupait un tableau trie par ticker — le train voyait 2023-2024 (fuite du futur).
    2. target_risk_adj est un bruit de variance (std=2.95, p99=8.6, max abs(y)=45) : le modele ne peut que moyenner. Mesure : preds.std() ~ 1e-4 → corr = nan.
    3. Le chemin du gradient est sain : GradScaler.scale stable a 32768, grad_norm finis, permutation des entrees → delta preds = 0.0000 (sortie constante).
    4. Overfit test (256 echantillons, fp32, sans AMP, execute hors notebook) : corr +0.91, acc 97%, MSE 1.69 << var 9.6 → le modele sait apprendre quand le signal existe. La cause est dans la cible, pas dans le modele.

    Resultat de la bascule de cible (rendement simple target_return au lieu du risque-ajuste)

    avant apres
    Correlation (test) nan -0.0158 (definie)
    Rendement moyen par quantile 0 quantiles 0 quantiles (branche except ValueError)
    Direction Accuracy (test) 55.51% 56.23% (= baseline majoritaire)

    La bascule rend la correlation definie, pas l'edge : le predicteur reste constant.

    Etat des criteres d'acceptation de cette issue

    • (a) Direction Accuracy de validation qui bouge entre epochs : non — constante de bout en bout (limite intrinseque a cet horizon ; l'overfit test disculpe le modele).
    • (b) Correlation definie : oui (-0.0158).
    • (c) Serie de quantiles non vide : non — l'analyse reste vide sur ce run.
    • (d) Cause intrinseque dite + prose corrigee : oui.

    Ce qui est deja sur main

    #17583 (mergee 13:37Z, 3704321673) repond a la meme famille de defauts et est strictement plus riche : split temporel global par date (memes bornes mesurees : <= 2021-10-04 puis 2021-10-05 -> 2023-05-15), backtest cross-sectionnel sur axe calendaire, re-entrainement from scratch, prose ancree sur les sorties, verdict NO BEATS (correlation NaN, 0 quantile, Sharpe strategie 3.023 < benchmark 3.495, explique comme risque de concentration en bull market).

    La degenerescence est donc documentee et expliquee sur main, et l'hypothese « changer la cible » est refutee par la mesure.

    La PR #17735 ne peut pas porter ce resultat sous forme de diff : ses 5 cellules modifiees sont un sous-ensemble exact des 12 cellules que #17583 a reecrites apres elle, et merger sa version reintroduirait le backtest empile de #17571 (mesures et diff cellule par cellule dans le commentaire sur #17735).

    Cette issue peut donc etre fermee sur la foi de #17583 plus la mesure ci-dessus, ou rouverte sur une piste differente (horizon de prediction plus court, features de microstructure, taille d'univers) — arbitrage coordinateur.

  6. jsboige commented on Sep 29, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA — diagnostic + réparation du Transformer figé (QC-Py-31, #17584). Plancher DEEP/qc du cycle. Pistes prioritaires : alignement fenêtre/cible (build_sequences décalage pred_len), chemin du gradient (test preds.std() + grad_norm), normalisation StandardScaler, AMP GradScaler. Machine : po-2024 (RTX 3090, CUDA local).

  7. jsboige commented on Sep 29, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] lane myia-po-2024:CoursIA — PR #18388

    Diagnostic mesuré de la dégénérescence QC-Py-31, embarqué dans le carnet (re-exécution complète, sorties réelles committées) :

    • Piste 2 (gradient) mesurée, réfutée : normes par bloc sur un pas réel AMP — reg_head 4.11e-01, cls_head 6.30e-02, encodeur 8.44e-02, totale 4.25e-01. Le chemin du gradient est fonctionnel.
    • Pistes 1/3/4 vérifiées au code : alignement shift(-PRED_LEN) correct (pas de fuite), matrice scaler.transform en entrée du modèle, chaîne AMP correcte.
    • Verdict : dégénérescence intrinsèque à la paire features/cible (pred_len=5 sur cet univers). Le run committé est en dégénérescence partielle : std des prédictions 2.78e-02 (~0,9 % de l'échelle de la cible 3.15), corrélation test 0.0323, 5 quantiles formés mais profil non monotone (Q2 0.3256 < Q1 0.5295), Dir Acc 56.23 % = classe majoritaire. Un run antérieur du même code était rigoureusement constant (std 7.1e-05) : la profondeur du collapse est un tirage, la conclusion est stable — aucun signal exploitable au-delà du prior.
    • Critère (d) : le chiffre attendu « entre 50 % et 56 % » retiré de la prose, remplacé par le constat mesuré. Interprétations (courbes, évaluation, backtest) réalignées sur les valeurs du run committé.

    L'issue reste au coordinateur pour fermeture.

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

    @myia-ai-01
    Collaborator

    Fermeture — urne delivered, chaque critere du body confronte a origin/main par ai-01 (05/10)

    #18388, mergee le 29/09, a re-entraine QC-Py-31 depuis zero (FORCE_RETRAIN=True).

    • La sortie de la cellule 10 donne une correlation definie (0.0323, MSE 9.936) et 5 quantiles formes.
    • La direction accuracy reste constante. C'est le cas que prevoit le critere (d) : la cause intrinseque est dite et mesuree dans le carnet (std des predictions 2,78e-02, normes de gradient par bloc sur un pas AMP reel).
    • La prose qui annoncait des chiffres attendus a ete retiree.
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

    bugSomething isn't workingcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)qc

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions