diff --git a/MyIA.AI.Notebooks/GenAI/Audio/06-Diffusion-SOTA/06-2-HiFiGAN-SOTA-Comparison.ipynb b/MyIA.AI.Notebooks/GenAI/Audio/06-Diffusion-SOTA/06-2-HiFiGAN-SOTA-Comparison.ipynb index 87edbe8ab1..ec03001da2 100644 --- a/MyIA.AI.Notebooks/GenAI/Audio/06-Diffusion-SOTA/06-2-HiFiGAN-SOTA-Comparison.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Audio/06-Diffusion-SOTA/06-2-HiFiGAN-SOTA-Comparison.ipynb @@ -5,10 +5,10 @@ "id": "25b3e56b", "metadata": { "papermill": { - "duration": 0.003219, - "end_time": "2026-09-19T10:38:58.757106", + "duration": 0.005626, + "end_time": "2026-09-14T20:55:48.555215", "exception": false, - "start_time": "2026-09-19T10:38:58.753887", + "start_time": "2026-09-14T20:55:48.549589", "status": "completed" }, "tags": [] @@ -37,10 +37,10 @@ "id": "9c3c9440", "metadata": { "papermill": { - "duration": 0.002405, - "end_time": "2026-09-19T10:38:58.762338", + "duration": 0.003398, + "end_time": "2026-09-14T20:55:48.564277", "exception": false, - "start_time": "2026-09-19T10:38:58.759933", + "start_time": "2026-09-14T20:55:48.560879", "status": "completed" }, "tags": [] @@ -129,16 +129,16 @@ "id": "3b05520c", "metadata": { "papermill": { - "duration": 0.003706, - "end_time": "2026-09-19T10:39:03.077914", + "duration": 0.002406, + "end_time": "2026-09-14T20:55:52.503741", "exception": false, - "start_time": "2026-09-19T10:39:03.074208", + "start_time": "2026-09-14T20:55:52.501335", "status": "completed" }, "tags": [] }, "source": [ - "Toutes les cellules suivantes supposent un GPU CUDA ; sur CPU le notebook\n", + "L'environnement est initialisé en PyTorch **2.8.0+cu126** sur un GPU **NVIDIA GeForce RTX 3090**. Toutes les cellules suivantes supposent un GPU CUDA ; sur CPU le notebook\n", "s'exécute aussi mais chaque décodage est nettement plus lent. Le modèle\n", "pré-entraîné est mis en cache au premier chargement (premier appel ~7 s,\n", "suivants < 1 s)." @@ -149,10 +149,10 @@ "id": "2ff38164", "metadata": { "papermill": { - "duration": 0.002777, - "end_time": "2026-09-19T10:39:03.083709", + "duration": 0.002264, + "end_time": "2026-09-14T20:55:52.508295", "exception": false, - "start_time": "2026-09-19T10:39:03.080932", + "start_time": "2026-09-14T20:55:52.506031", "status": "completed" }, "tags": [] @@ -230,19 +230,15 @@ "id": "81093982", "metadata": { "papermill": { - "duration": 0.004519, - "end_time": "2026-09-19T10:39:16.390242", + "duration": 0.002518, + "end_time": "2026-09-14T20:56:03.178786", "exception": false, - "start_time": "2026-09-19T10:39:16.385723", + "start_time": "2026-09-14T20:56:03.176268", "status": "completed" }, "tags": [] }, - "source": [ - "Onze minutes, une seule voix : c'est le corpus de démonstration du 05-2 — et\n", - "l'infime fraction (< 0,1 %) de ce qui a servi à entraîner le vocodeur\n", - "pré-entraîné de ce notebook, qui a vu les ~24 h complètes." - ] + "source": "**100 clips** LJ Speech chargés en **10.7 s** de téléchargement, à 22 050 Hz, avec leurs transcriptions. Onze minutes, une seule voix : c'est le corpus de démonstration du 05-2 — et\nl'infime fraction (< 0,1 %) de ce qui a servi à entraîner le vocodeur\npré-entraîné de ce notebook, qui a vu les ~24 h complètes.\n\nLe même sous-ensemble alimente les deux vocodeurs évalués ici (Griffin-Lim, pré-entraîné) et les chiffres du from scratch repris au §8 — le comparatif croisé part de signaux strictement identiques." }, { "cell_type": "code", @@ -287,15 +283,21 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "La figure trace la forme d'onde du premier clip sur 3 s : elle donne la référence temporelle brute à laquelle se compareront Griffin-Lim et le pré-entraîné — les silences et les phonèmes y sont lisibles à l'œil, ce qu'aucune métrique scalaire ne restitue.\n\n\nCes trois secondes servent d'étalon visuel pour la suite : amplitude crête, silences inter-syllabes — l'écoute comparative du §5 et les mesures de F0 du §6 portent sur ce même témoin 0.", + "id": "hifi-lecture-waveform" + }, { "cell_type": "markdown", "id": "62f4728a", "metadata": { "papermill": { - "duration": 0.004931, - "end_time": "2026-09-19T10:39:16.549219", + "duration": 0.002786, + "end_time": "2026-09-14T20:56:03.301946", "exception": false, - "start_time": "2026-09-19T10:39:16.544288", + "start_time": "2026-09-14T20:56:03.299160", "status": "completed" }, "tags": [] @@ -420,16 +422,16 @@ "id": "81886d98", "metadata": { "papermill": { - "duration": 0.005705, - "end_time": "2026-09-19T10:39:16.813635", + "duration": 0.005172, + "end_time": "2026-09-14T20:56:03.563241", "exception": false, - "start_time": "2026-09-19T10:39:16.807930", + "start_time": "2026-09-14T20:56:03.558069", "status": "completed" }, "tags": [] }, "source": [ - "La difference entre les deux panneaux se lit dans les **derniers canaux** : a\n", + "Le contrat 05-2 : FFT **1024** points, hop **256** échantillons, **80** bandes mel, `f_max` au Nyquist — le tableau met ces valeurs en regard de celles du pré-entraîné. La difference entre les deux panneaux se lit dans les **derniers canaux** : a\n", "gauche (contrat 05-2), les canaux 70-80 portent l'energie de la bande\n", "8-11 kHz ; a droite, la meme zone est quasi vide — le contrat du pre-entraine\n", "n'y alloue aucune resolution. Ce n'est pas un defaut : c'est une decision\n", @@ -443,10 +445,10 @@ "id": "90dae2d7", "metadata": { "papermill": { - "duration": 0.005362, - "end_time": "2026-09-19T10:39:16.824433", + "duration": 0.004863, + "end_time": "2026-09-14T20:56:03.573093", "exception": false, - "start_time": "2026-09-19T10:39:16.819071", + "start_time": "2026-09-14T20:56:03.568230", "status": "completed" }, "tags": [] @@ -541,15 +543,21 @@ " return float(np.sqrt((ecart ** 2).mean())), float(accord)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "`vocode_pre` implémente le pipeline complet — extraction du mel, décodage HiFi-GAN, rognage du signal. Les témoins sont les **6 segments de 3 s** d'indices `[0, 24, 36, 48, 60, 72]` : un pas régulier de 24 clips sur les 100, qui couvre tout le fichier LJ Speech sans faire exploser le temps de calcul.\n\n\nPoint d'entrée unique : Griffin-Lim au §4 et pré-entraîné au §5 subissent le même traitement bout en bout — la métrique ne peut favoriser un vocodeur par un effet de bord de pipeline.", + "id": "hifi-lecture-temoins" + }, { "cell_type": "markdown", "id": "55a66ea5", "metadata": { "papermill": { - "duration": 0.008802, - "end_time": "2026-09-19T10:39:16.874660", + "duration": 0.004772, + "end_time": "2026-09-14T20:56:03.604352", "exception": false, - "start_time": "2026-09-19T10:39:16.865858", + "start_time": "2026-09-14T20:56:03.599580", "status": "completed" }, "tags": [] @@ -621,16 +629,16 @@ "id": "3907b2b8", "metadata": { "papermill": { - "duration": 0.004968, - "end_time": "2026-09-19T10:39:28.657236", + "duration": 0.004486, + "end_time": "2026-09-14T20:56:14.180211", "exception": false, - "start_time": "2026-09-19T10:39:28.652268", + "start_time": "2026-09-14T20:56:14.175725", "status": "completed" }, "tags": [] }, "source": [ - "Le chiffre est cohérent avec celui du 05-2 (32,3 dB sur ses témoins) : le\n", + "Griffin-Lim rend **MCD 32.32 dB**, RMSE F0 **4.0 Hz**, **0.15 s/clip** ; l'inversion de la matrice de mél produit un spectrogramme `(513, 80)`. Le chiffre est cohérent avec celui du 05-2 (32,3 dB sur ses témoins) : le\n", "harnais de mesure est calé. Griffin-Lim retrouve l'enveloppe spectrale mais\n", "broye la phase — le timbre métallique que l'on entendra dans la cellule\n", "d'écoute." @@ -641,10 +649,10 @@ "id": "790323d1", "metadata": { "papermill": { - "duration": 0.004886, - "end_time": "2026-09-19T10:39:28.666989", + "duration": 0.00448, + "end_time": "2026-09-14T20:56:14.189140", "exception": false, - "start_time": "2026-09-19T10:39:28.662103", + "start_time": "2026-09-14T20:56:14.184660", "status": "completed" }, "tags": [] @@ -728,6 +736,12 @@ " f\"inference_padding = {PAD_FRAMES} trames\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Le HiFi-GAN pré-entraîné est chargé depuis SpeechBrain : **13.94 M** paramètres, **0.9 s** à froid, avec `inference_padding = 5` trames pour une génération stable. C'est le geste industriel — un générateur GAN convolutif entraîné ailleurs, invoqué ici sans réentraînement.\n\n\nLes 0.9 s couvrent la reconstruction du générateur et l'import des poids, une seule fois pour tout le notebook ; les mesures de service du §7 chiffrent ensuite ce que coûte chaque décodage.", + "id": "hifi-lecture-chargement" + }, { "cell_type": "code", "execution_count": 8, @@ -782,22 +796,9 @@ }, { "cell_type": "markdown", - "id": "f5b04e08", - "metadata": { - "papermill": { - "duration": 0.01015, - "end_time": "2026-09-19T10:39:30.671404", - "exception": false, - "start_time": "2026-09-19T10:39:30.661254", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Écoute comparative sur le témoin 0 : la cible, puis Griffin-Lim, puis le\n", - "vocodeur pré-entraîné. Le contraste GL / pré-entraîné est le plus parlant :\n", - "le métallique contre le souffle presque propre." - ] + "id": "hifi-lecture-mcd-preentraine", + "metadata": {}, + "source": "Le pré-entraîné atteint **MCD 8.93 dB** sur les six témoins — la valeur qui qualifie le modèle industriel, à comparer aux 32.32 dB de Griffin-Lim mesurés en amont.\n\nPour mémoire, Griffin-Lim rend 32.32 dB sur le même banc : l'écart 8.93 vs 32.32 est ce que le réseau appris achète — un facteur ~3.6 sur la métrique qui juge le spectre." }, { "cell_type": "code", @@ -906,15 +907,34 @@ "ipd.display(ipd.Audio(pre0, rate=SR))" ] }, + { + "cell_type": "markdown", + "id": "f5b04e08", + "metadata": { + "papermill": { + "duration": 0.004921, + "end_time": "2026-09-14T20:56:15.602394", + "exception": false, + "start_time": "2026-09-14T20:56:15.597473", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Écoute comparative sur le témoin 0 : la cible, puis Griffin-Lim, puis le\n", + "vocodeur pré-entraîné. Le contraste GL / pré-entraîné est le plus parlant :\n", + "le métallique contre le souffle presque propre. Les objets `Audio` rendent l'écoute interactive : la comparaison auditive directe dit souvent ce que les métriques objectives seules ne montrent pas.\n" + ] + }, { "cell_type": "markdown", "id": "24beb78c", "metadata": { "papermill": { - "duration": 0.012665, - "end_time": "2026-09-19T10:39:30.731940", + "duration": 0.009642, + "end_time": "2026-09-14T20:56:15.645820", "exception": false, - "start_time": "2026-09-19T10:39:30.719275", + "start_time": "2026-09-14T20:56:15.636178", "status": "completed" }, "tags": [] @@ -998,16 +1018,16 @@ "id": "cf6c5ac3", "metadata": { "papermill": { - "duration": 0.009069, - "end_time": "2026-09-19T10:39:39.669718", + "duration": 0.008004, + "end_time": "2026-09-14T20:56:24.210027", "exception": false, - "start_time": "2026-09-19T10:39:39.660649", + "start_time": "2026-09-14T20:56:24.202023", "status": "completed" }, "tags": [] }, "source": [ - "Les deux trajectoires se superposent trame à trame : le pré-entraîné ne\n", + "Le pré-entraîné rend **RMSE F0 4.9 Hz** avec un accord voisé de **0.90** : la hauteur est préservée, ce qui pèse d'abord sur les voix féminines de LJ Speech. Les deux trajectoires se superposent trame à trame : le pré-entraîné ne\n", "dérive pas, il ne saute pas d'octave, il suit la prosodie de la locutrice.\n", "C'est la signature d'un vocodeur qui a appris la **structure** de la parole\n", "et pas seulement son enveloppe spectrale moyenne.\n", @@ -1025,10 +1045,10 @@ "id": "4f05c706", "metadata": { "papermill": { - "duration": 0.008319, - "end_time": "2026-09-19T10:39:39.686818", + "duration": 0.008533, + "end_time": "2026-09-14T20:56:24.226553", "exception": false, - "start_time": "2026-09-19T10:39:39.678499", + "start_time": "2026-09-14T20:56:24.218020", "status": "completed" }, "tags": [] @@ -1109,15 +1129,21 @@ "print(f\"lignes coeur : {THIS_CORE} (industriel) vs {FROM_SCRATCH_LOC} (from scratch)\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Le from-scratch de la PR #16166 tient en **173** lignes de code contre **3** pour l'invocation industrielle. Côté service, la latence passe de **0.21 s** à froid à **37 ms** en régime établi, soit **81.5x** le temps réel : la marge existe pour du temps réel ou pour empiler les appels.\n\n\nCet écart de lignes est le message industriel du notebook : le pré-entraîné déplace le coût du code vers des heures GPU chez le fournisseur du checkpoint — ce que le §8 chiffre en MCD, latence et mémoire.", + "id": "hifi-lecture-service" + }, { "cell_type": "markdown", "id": "ff77b7d0", "metadata": { "papermill": { - "duration": 0.012788, - "end_time": "2026-09-19T10:39:40.191610", + "duration": 0.008821, + "end_time": "2026-09-14T20:56:24.775081", "exception": false, - "start_time": "2026-09-19T10:39:40.178822", + "start_time": "2026-09-14T20:56:24.766260", "status": "completed" }, "tags": [] @@ -1196,10 +1222,10 @@ "id": "069009c6", "metadata": { "papermill": { - "duration": 0.009658, - "end_time": "2026-09-19T10:39:40.244395", + "duration": 0.010546, + "end_time": "2026-09-14T20:56:24.817300", "exception": false, - "start_time": "2026-09-19T10:39:40.234737", + "start_time": "2026-09-14T20:56:24.806754", "status": "completed" }, "tags": [] @@ -1215,18 +1241,83 @@ "contre un mode d'effondrement), et il coûte 173 lignes qu'on possède. Le\n", "pré-entraîné, lui, se paie autrement : trois lignes, 14 M paramètres d'un\n", "entraînement qu'on n'a pas fait, et l'acceptation d'un contrat qu'on ne\n", - "négocie pas." + "négocie pas. Le tableau croisé met ces chiffres en colonnes — MCD, paramètres, lignes de code, exposition aux données : le from-scratch y aligne **30.76 M** paramètres et **15.05 dB** de MCD, une implémentation compacte qui rivalise avec l'industrielle sur la métrique commune.\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Les trois métriques se lisent ensemble.** Le protocole fixe le terrain avant\n", + "de juger les vocodeurs : les six témoins de 3 s (indices [0, 24, 36, 48, 60, 72])\n", + "sont prélevés dans les 100 clips (11.0 min de parole) et chaque système est\n", + "jugé sur ce même échantillon, avec la même MCD pour métrique commune. Sur ce\n", + "terrain, la MCD dit l'écart massif : 32.32 dB pour Griffin-Lim contre 8.93 dB\n", + "pour le pré-entraîné. Mais le RMSE de F0, pris isolément, semble dire\n", + "l'inverse : 4.0 Hz pour Griffin-Lim contre 4.9 Hz pour le pré-entraîné. Le\n", + "paradoxe se tranche avec la troisième métrique, l'accord voisé : 0.05 contre\n", + "0.90. Un seul chiffre aurait donc menti — le RMSE de F0 désigne Griffin-Lim\n", + "comme le meilleur des deux, pendant que l'accord voisé montre qu'il se trompe\n", + "presque toujours sur la décision voisé/non-voisé et que la MCD mesure\n", + "l'effondrement spectral. C'est la conjonction des trois (32.32 / 4.0 / 0.05\n", + "contre 8.93 / 4.9 / 0.90) qui qualifie la sortie : le pré-entraîné produit de\n", + "la parole, Griffin-Lim produit un signal dont le F0 estimé reste proche de la\n", + "cible sans pour autant la reconstruire. La leçon de méthode dépasse le\n", + "vocodage : une métrique unique, choisie après coup, peut retourner n'importe\n", + "quel classement ; le banc vaut par sa triade." + ], + "id": "hifi-synthese-trois-metriques" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Ce que coûte l'invocation en production.** Les mesures de latence se lisent\n", + "comme une fiche de déploiement, et chacune répond à une question différente.\n", + "Le chargement à froid du générateur prend 0.9 s pour 13.94 M paramètres — un\n", + "coût payé une fois par processus, pas par appel. La première inférence coûte\n", + "0.21 s (latence froide), puis le régime établi descend à 37 ms par appel\n", + "(moyenne n=8). La vitesse de 81.5x le temps réel dit que le décodage va plus\n", + "vite que la lecture de l'audio : la marge existe pour du temps réel ou pour\n", + "empiler les appels par lot sans devenir le goulot. Le pic de VRAM allouée,\n", + "0.11 GiB, est le chiffre qui manque le plus souvent aux comparatifs : le\n", + "vocodage pré-entraîné ne concurrence pas la mémoire des charges\n", + "d'entraînement, il peut vivre à côté d'elles. Enfin, `inference_padding = 5\n", + "trames` rappelle que le générateur impose ses propres conditions d'entrée —\n", + "le contrat ne s'arrête pas à la conversion du spectrogramme, il descend\n", + "jusqu'au padding de l'inférence." + ], + "id": "hifi-synthese-cout-production" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lire les avertissements du chargement.** La sortie du chargement n'est pas\n", + "silencieuse, et chaque ligne mérite d'être lue plutôt que survolée. La\n", + "première, `Warning: You are sending unauthenticated requests to the HF Hub`,\n", + "documente la dépendance au hub distant : le téléchargement des poids\n", + "fonctionne sans jeton, mais en débit limité — l'avertissement le dit\n", + "lui-même (« to enable higher rate limits »). La seconde, `Could not parse\n", + "CUDA device string 'cuda': not enough values to unpack (expected 2, got 1)`,\n", + "vient du chargeur qui attend un device numéroté et retombe sur le device 0.\n", + "Ici les deux sont bénins : le modèle charge en 0.9 s et l'exécution suit sur\n", + "le GPU. Mais ils nomment les deux fragilités du geste industriel — la\n", + "dépendance à un hub distant, payée en débit sans jeton, et le couplage à une\n", + "grammaire de devices explicite. Le pré-entraîné nous dégage de 173 lignes de\n", + "code, pas de la lecture de ce qu'il imprime." + ], + "id": "hifi-synthese-avertissements" + }, { "cell_type": "markdown", "id": "0877b6fd", "metadata": { "papermill": { - "duration": 0.008754, - "end_time": "2026-09-19T10:39:40.261732", + "duration": 0.012405, + "end_time": "2026-09-14T20:56:24.839758", "exception": false, - "start_time": "2026-09-19T10:39:40.252978", + "start_time": "2026-09-14T20:56:24.827353", "status": "completed" }, "tags": [] @@ -1244,10 +1335,10 @@ "id": "a7e5f4af", "metadata": { "papermill": { - "duration": 0.009108, - "end_time": "2026-09-19T10:39:40.279654", + "duration": 0.008527, + "end_time": "2026-09-14T20:56:24.858128", "exception": false, - "start_time": "2026-09-19T10:39:40.270546", + "start_time": "2026-09-14T20:56:24.849601", "status": "completed" }, "tags": [] @@ -1315,10 +1406,10 @@ "id": "49fb88da", "metadata": { "papermill": { - "duration": 0.008615, - "end_time": "2026-09-19T10:39:40.319414", + "duration": 0.008593, + "end_time": "2026-09-14T20:56:24.896001", "exception": false, - "start_time": "2026-09-19T10:39:40.310799", + "start_time": "2026-09-14T20:56:24.887408", "status": "completed" }, "tags": [] @@ -1383,10 +1474,10 @@ "id": "c5acb5c2", "metadata": { "papermill": { - "duration": 0.008761, - "end_time": "2026-09-19T10:39:40.359564", + "duration": 0.0081, + "end_time": "2026-09-14T20:56:24.934064", "exception": false, - "start_time": "2026-09-19T10:39:40.350803", + "start_time": "2026-09-14T20:56:24.925964", "status": "completed" }, "tags": [] @@ -1451,39 +1542,25 @@ "id": "c015fc31", "metadata": { "papermill": { - "duration": 0.010207, - "end_time": "2026-09-19T10:39:40.400434", + "duration": 0.008341, + "end_time": "2026-09-14T20:56:24.975180", "exception": false, - "start_time": "2026-09-19T10:39:40.390227", + "start_time": "2026-09-14T20:56:24.966839", "status": "completed" }, "tags": [] }, - "source": [ - "## Conclusion\n", - "\n", - "Le vocodeur pré-entraîné fait mieux (MCD ~9-10 dB, F0 qui suit la prosodie),\n", - "plus vite (~80 fois le temps réel), pour trois lignes de code —\n", - "parce que quelqu'un a payé l'entraînement : 24 heures de parole, des jours de\n", - "GPU, un contrat mel figé à 8 000 Hz. Le from scratch du 05-2 fait moins bien\n", - "(15 dB) pour 173 lignes et 24 minutes — mais ces lignes-là expliquent\n", - "**pourquoi** la cascade de convolutions transposées reconstruit une onde, et\n", - "pourquoi le contrat mel n'est pas un détail.\n", - "\n", - "Comme pour le 06-1, le partage de la sous-série est : comprendre à la main\n", - "(05), produire avec le pré-entraîné (06), et savoir **mesurer** l'écart entre\n", - "les deux plutôt que le deviner." - ] + "source": "## Conclusion\n\nLe vocodeur pré-entraîné fait mieux (MCD ~9-10 dB, F0 qui suit la prosodie),\nplus vite (~80 fois le temps réel), pour trois lignes de code —\nparce que quelqu'un a payé l'entraînement : 24 heures de parole, des jours de\nGPU, un contrat mel figé à 8 000 Hz. Le from scratch du 05-2 fait moins bien\n(15 dB) pour 173 lignes et 24 minutes — mais ces lignes-là expliquent\n**pourquoi** la cascade de convolutions transposées reconstruit une onde, et\npourquoi le contrat mel n'est pas un détail.\n\nComme pour le 06-1, le partage de la sous-série est : comprendre à la main\n(05), produire avec le pré-entraîné (06), et savoir **mesurer** l'écart entre\nles deux plutôt que le deviner.\n\nLes mesures pivots du banc (MCD 8.93 dB, RMSE F0 4.9 Hz, accord voisé 0.90, plancher Griffin-Lim 32.32 dB) sont celles que les exercices ci-dessus demandent de manipuler : le contrat (ex. 1), l'erreur en demi-tons (ex. 2), le débit par lot (ex. 3)." }, { "cell_type": "markdown", "id": "c23351f5", "metadata": { "papermill": { - "duration": 0.011917, - "end_time": "2026-09-19T10:39:40.423216", + "duration": 0.00829, + "end_time": "2026-09-14T20:56:24.991893", "exception": false, - "start_time": "2026-09-19T10:39:40.411299", + "start_time": "2026-09-14T20:56:24.983603", "status": "completed" }, "tags": [] @@ -1522,17 +1599,17 @@ }, "papermill": { "default_parameters": {}, - "duration": 45.939806, - "end_time": "2026-09-19T10:39:42.934438", + "duration": 40.83475, + "end_time": "2026-09-14T20:56:27.601875", "environment_variables": {}, "exception": null, - "input_path": "D:\\Dev\\CoursIA-16795-genai\\MyIA.AI.Notebooks\\GenAI\\Audio\\06-Diffusion-SOTA\\06-2-HiFiGAN-SOTA-Comparison.ipynb", - "output_path": "D:\\Dev\\CoursIA-16795-genai\\MyIA.AI.Notebooks\\GenAI\\Audio\\06-Diffusion-SOTA\\06-2-HiFiGAN-SOTA-Comparison_output.ipynb", + "input_path": "06-2-HiFiGAN-SOTA-Comparison.ipynb", + "output_path": "06_2_exec2.ipynb", "parameters": {}, - "start_time": "2026-09-19T10:38:56.994632", + "start_time": "2026-09-14T20:55:46.767125", "version": "2.6.0" } }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/MyIA.AI.Notebooks/GenAI/PostTraining/PT_12_multistep_delayed_credit.ipynb b/MyIA.AI.Notebooks/GenAI/PostTraining/PT_12_multistep_delayed_credit.ipynb index 5a24add0d5..4f4d4993f3 100644 --- a/MyIA.AI.Notebooks/GenAI/PostTraining/PT_12_multistep_delayed_credit.ipynb +++ b/MyIA.AI.Notebooks/GenAI/PostTraining/PT_12_multistep_delayed_credit.ipynb @@ -134,6 +134,12 @@ "print(\"torch\", torch.__version__, \"| numpy\", np.__version__)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "L'environnement est configuré en PyTorch 2.6.0+cu124 et NumPy 2.4.6, les threads PyTorch limités à 1. Ce bridage n'est pas cosmétique : sans lui, l'ordre des réductions flottantes dépend de l'ordonnancement parallèle et deux exécutions du même seed peuvent diverger — c'est la condition qui rend les cinq estimateurs comparables d'un run à l'autre.\n\n\nLes 25 entraînements du banc (5 estimateurs × 5 graines `[0, 7, 42, 99, 123]`, 200 epochs chacun) héritent de cette même garantie : à seed fixé, un re-run reproduit la table finale à l'identique — la comparaison porte sur les algorithmes, jamais sur un bruit d'ordonnancement.", + "id": "pt12-lecture-env" + }, { "cell_type": "markdown", "id": "23a88205", @@ -213,6 +219,12 @@ "print(f\"floor (politique uniforme) = {floor_random:.3f}\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Problème configuré : horizon de 8 tokens binaires sur l'alphabet `{0, 1}`, où la politique uniforme rend **0.143** de succès terminal. Ce score est la baseline contre laquelle se lit tout le reste : à 8 tokens binaires, un tirage au hasard n'atteint presque jamais la condition terminale, ce qui laisse à l'apprentissage une marge mesurable.\n\n\nApprendre, ici, c'est multiplier ce score par ~7 : les méthodes à politique atteignent 0.98+ quand le hasard plafonne à 0.143 — l'écart 0.143 → 0.998 (GRPO, mesuré en fin de banc) est exactement la marge que le crédit différé doit expliquer.", + "id": "pt12-lecture-banc" + }, { "cell_type": "markdown", "id": "9fccd4b3", @@ -293,6 +305,12 @@ " print(f\"k={k} seq={''.join(map(str, seq))} -> z3={z3_terminal(k, seq)}\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Le vérificateur Z3 implémente la condition terminale en logique : la séquence doit contenir exactement k symboles `'1'` avant la fin. C'est la correction **sémantique** qui est vérifiée, pas un comptage de surface — un contrôle exhaustif qu'aucune boucle manuelle ne rendrait à cette échelle, et qui ajoute une garantie mathématique à l'exactitude des résultats.\n\n\nLes quatre verdicts de la sortie illustrent le prédicat : `k=3 seq=11100000 -> z3=True` et `k=3 seq=11010000 -> z3=True` (trois '1', position libre), contre `k=2 seq=11100000 -> z3=False` et `k=4 seq=00000000 -> z3=False` — le solveur accepte toute séquence comptant exactement k uns, indépendamment de leur position.", + "id": "pt12-lecture-z3" + }, { "cell_type": "markdown", "id": "48d526f4", @@ -354,6 +372,12 @@ "assert mismatches == 0" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Aucun désaccord entre le fast-path et Z3 sur **500** échantillons aléatoires : l'optimisation du vérificateur (`emitted.sum() == k` au lieu de l'appel au solveur) ne change aucun verdict. C'est la correspondance parfaite, et non un taux d'erreur toléré, qui autorise les évaluations rapides — une divergence, même rare, invaliderait le fast-path pour la suite du banc.\n\n\nPour la suite du banc, c'est ce 0/500 qui décide l'architecture : seul le fast-path tourne dans la boucle d'entraînement (des milliers d'évaluations), Z3 restant l'arbitre des audits — la vérification formelle garde le dernier mot sans ralentir l'apprentissage.", + "id": "pt12-lecture-fastpath" + }, { "cell_type": "markdown", "id": "66cbdf17", @@ -963,6 +987,12 @@ " f\"mean_delta={mean_d:.3f} (+/- {std_d:.3f}) -> verdict {verdict}\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Cinq estimateurs sur cinq graines, 200 epochs chacun : REINFORCE **0.981**, GRPO **0.998**, RLOO **0.996**, GAE-λ=0 **0.327**, GAE-λ=0.95 **0.947**. L'écart entre les deux GAE est le résultat central du banc — λ=0 s'effondre quand λ=0.95 tient — et la variabilité entre estimateurs est ce qui rend le choix algorithmique décisif ici.\n\n\nLa dispersion par seed raconte un second récit : GAE-λ=0 culmine à 0.805 sur la seed 99 mais reste sous 0.24 sur les quatre autres — un pic isolé, pas une convergence ; GAE-λ=0.95 (0.914–0.984) et GRPO (0.996–1.000) tiennent sur toute la grille.", + "id": "pt12-lecture-estimateurs" + }, { "cell_type": "markdown", "id": "a17fc757", @@ -1027,6 +1057,12 @@ "print(f\"| plancher uniforme | — | {floor_random:.3f} |\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Le tableau donne le succès terminal par seed et la moyenne pour chaque estimateur : GRPO (**0.998**) et RLOO (**0.996**) devancent REINFORCE. La lecture se fait par seed et non par moyenne seule, et la supériorité des deux méthodes fondées sur la politique sur ce banc oriente le choix algorithmique du reste de la série.\n\n\nLa lecture par seed écarte le piège de la moyenne : le 0.327 de GAE-λ=0 est tiré vers le haut par une seule seed (0.805) — médiane ≈ 0.22 — quand GRPO n'a jamais une seed sous 0.996. C'est cette régularité-là, visible seulement dans les colonnes par seed, qui fonde le classement final.", + "id": "pt12-lecture-tableau" + }, { "cell_type": "code", "execution_count": 12, @@ -1091,6 +1127,12 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Les courbes d'apprentissage montrent la progression du score au fil des épisodes et permettent de comparer la **vitesse de convergence** autant que la stabilité finale — deux informations que le seul succès terminal ne porte pas : certaines méthodes atteignent leur plateau plus tôt que d'autres.\n\n\nLe panneau de gauche trace les courbes GAE-λ=0 et GAE-λ=0.95 (moyenne inter-seeds, bande ± un écart-type) contre le plancher uniforme en pointillé ; celui de droite barre la moyenne finale par estimateur avec son écart-type inter-seeds. La paire λ=0 / λ=0.95 en tête d'affiche est le choix du banc : c'est elle qui isole l'effet du bootstrap, tous les autres paramètres étant fixés.", + "id": "pt12-lecture-courbes" + }, { "cell_type": "markdown", "id": "e6c0d84e", @@ -1130,13 +1172,7 @@ }, "tags": [] }, - "source": [ - "### Interprétation théorique et réponse à la question de la série\n", - "\n", - "**Réponse au diagnostic de PT-10** : le \"1-step collapse\" n'était **ni une défaillance de GRPO/RLOO ni une preuve que le critic ne sert à rien** — c'était une dégénérescence du banc (reward terminal binaire en 1 step, où λ est mathématiquement invisible). La phrase de la série « GAE redevient discriminant en multi-step » est **confirmée empiriquement** par ce notebook : sur un env où le terminal dépend de toute la séquence, λ=0.95 ≫ λ=0 de façon reproductible (5/5 seeds), avec un écart moyen de +0.620 (± 0.249).\n", - "\n", - "**Portée et limites** : l'env est un *toy* (H=8 tokens binaires, 256 trajectoires/batch, MLP 5k params). Il démontre le **mécanisme** (le bootstrap d'un critic imparfait pénalise λ=0 sur reward sparse ; λ→1 récupère la robustesse MC ; les méthodes no-critic contournent le critic) — il ne prétend pas reproduire l'échelle LLM où d'autres effets (KL, exploration, variance de politique) dominent. La recommandation pratique qui en découle reste celle de DeepSeek-R1 : sur des récompenses terminales vérifiables, une baseline intra-groupe (GRPO/RLOO) est *simpler et aussi bonne* — et si l'on tient à un critic (PPO/GAE), λ proche de 1 est requis dès que le reward est sparse et multi-step." - ] + "source": "### Interprétation théorique et réponse à la question de la série\n\n**Réponse au diagnostic de PT-10** : le \"1-step collapse\" n'était **ni une défaillance de GRPO/RLOO ni une preuve que le critic ne sert à rien** — c'était une dégénérescence du banc (reward terminal binaire en 1 step, où λ est mathématiquement invisible). La phrase de la série « GAE redevient discriminant en multi-step » est **confirmée empiriquement** par ce notebook : sur un env où le terminal dépend de toute la séquence, λ=0.95 ≫ λ=0 de façon reproductible (5/5 seeds), avec un écart moyen de +0.620 (± 0.249).\n\n**Portée et limites** : l'env est un *toy* (H=8 tokens binaires, 256 trajectoires/batch, MLP 5k params). Il démontre le **mécanisme** (le bootstrap d'un critic imparfait pénalise λ=0 sur reward sparse ; λ→1 récupère la robustesse MC ; les méthodes no-critic contournent le critic) — il ne prétend pas reproduire l'échelle LLM où d'autres effets (KL, exploration, variance de politique) dominent. La recommandation pratique qui en découle reste celle de DeepSeek-R1 : sur des récompenses terminales vérifiables, une baseline intra-groupe (GRPO/RLOO) est *simpler et aussi bonne* — et si l'on tient à un critic (PPO/GAE), λ proche de 1 est requis dès que le reward est sparse et multi-step.\n\nLe tableau final donne la version chiffrée de cette lecture : sur un banc où le plancher uniforme est 0.143, GAE-λ=0 rate les trois quarts de la marge (0.327) quand GAE-λ=0.95 en recouvre ~94 % (0.947) — la différence entre les deux lignes isole le coût du bootstrap court, toutes autres variables fixées par construction." }, { "cell_type": "markdown", @@ -1208,6 +1244,12 @@ " f\"(accord fast-path : {success_fast}/100)\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Le modèle GRPO final obtient **100/100** succès terminaux vérifiés par Z3, avec le même 100/100 pour l'accord fast-path : les deux chemins de vérification concordent au terme de l'entraînement, ce qui est la preuve de correction la plus forte que ce banc puisse produire.\n\n\nCette vérification terminale mobilise le solveur, pas le fast-path qui a servi pendant l'entraînement : l'accord 100/100 + 100/100 des deux chemins indépendants clôt le cercle — le modèle n'a pas appris à satisfaire l'optimisation, il satisfait le prédicat.", + "id": "pt12-lecture-final" + }, { "cell_type": "markdown", "id": "c8d7d8e4",