Repository navigation
QC-Py-31 : le Transformer n'apprend rien — les deux tetes restent constantes (dir acc 57.34% plates, correlation nan) #17584
Description
Activity
- added a commit that references this issue
on Sep 23, 2026 - added a commit that references this issue
on Sep 25, 2026 [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 matricescaled), puis fix et re-execution GPU (RTX 3070 8 GiB locale), conformement aux criteres d'acceptation de l'issue.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:build_sequencesapparie 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).target_risk_adjest 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.- Le chemin du gradient est sain :
GradScaler.scalestable a 32768,grad_normfinis, permutation des entrees →delta preds = 0.0000(sortie constante). - 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_returnau lieu du risque-ajuste)avant apres Correlation (test) nan-0.0158(definie)Rendement moyen par quantile 0 quantiles0 quantiles(brancheexcept 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 Accuracyde validation qui bouge entre epochs : non — constante de bout en bout (limite intrinseque a cet horizon ; l'overfit test disculpe le modele). - (b)
Correlationdefinie : 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-04puis2021-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.
[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_sequencesdécalagepred_len), chemin du gradient (testpreds.std()+grad_norm), normalisation StandardScaler, AMP GradScaler. Machine : po-2024 (RTX 3090, CUDA local).[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), matricescaler.transformen entrée du modèle, chaîne AMP correcte. - Verdict : dégénérescence intrinsèque à la paire features/cible (
pred_len=5sur 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.
- added a commit that references this issue
on Sep 29, 2026 - addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 30, 2026 Fermeture — urne
delivered, chaque critere du body confronte aorigin/mainpar 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.
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) :Trois signatures convergentes :
Direction Accuracyidentique aux treize epochs (57.34%), des l'epoch 1 : c'est le taux de la classe majoritaire, pas un apprentissage.Correlation: nanetRendement moyen par quantile de prediction (0 quantiles): la suite de predictions n'a pas de variance.np.corrcoefne rendnanque si l'une des deux series est constante — le MSE reste fini (8.639617), donc il ne s'agit pas denanpropages.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 banniereFORCE_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.0160et1 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)
build_sequencesappariefeatures[i-seq_len:i]et la cible eni— verifier quetarget_risk_adj/target_directionsont bien decales depred_lenpar rapport a la fenetre, et non lus a l'indiceibrut.preds.std()sur des entrees permutees ;grad_normpar couche).StandardScalerest fitte sur le train ; verifier que c'est bien la matrice scaled qui entre dans le modele (et nondf[feature_cols].valuesbrut).GradScalerne saute pas tous les pas (unscalequi ne redescend jamais = aucun update).Criteres d'acceptation
Direction Accuracyde validation bouge entre epochs (au minimum : elle n'est plus identique d'un bout a l'autre).Correlationdefinie (nonnan) sur le set de test, ou une explication mesuree de pourquoi elle ne peut pas l'etre.Rendement moyen par quantile de predictionnon vide (au moins 2 quantiles), ou suppression assumee de cette lecture du notebook.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.