Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,14 @@
"print(f\"sigma(1) = sqrt(1 - alpha_bar(1)) = {math.sqrt(1 - alpha_bar_vp(1.0)):.8f} (proche de 1 : Q approx N(0, I))\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : La fonction `alpha_bar_vp(t)` implémente le schedule de bruit du VP-SDE (Variance Preserving Stochastic Differential Equation) en utilisant une interpolation linéaire du taux de bruit `beta(t)` entre BETA_MIN=0.1 et BETA_MAX=20.0. Le calcul de `alpha_bar(t) = exp(-integral(beta(s) ds from 0 to t))` montre que ce coefficient passe de 1.0 à t=0 à environ 4.3e-05 à t=1, confirmant que le bruit accumulé efface progressivement la structure des données. La valeur de `sigma(t) = sqrt(1 - alpha_bar(t))` passe corrélativement de 0 à ~0.99998, illustrant comment le processus de diffusion ajoute du bruit gaussien de variance croissante. Cette paramétrisation est cruciale car elle détermine la quantité de bruit injecté à chaque pas de la dynamique de débruitage.\n"
],
"id": "c14ca820"
},
{
"cell_type": "code",
"execution_count": 3,
Expand Down Expand Up @@ -658,6 +666,14 @@
"le réseau devra apprendre."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : Verbatim : « melange : 5 composantes | 4096 echantillons de reference », « poids : [0.24 0.2 0.18 0.22 0.16] ». Les moyennes, dans le code : [-1.60, 1.10], [1.70, 1.30], [1.90, -1.20], [-1.80, -1.40], [0.00, 0.00] — cinq modes bien séparés, dont un au centre. Les FORMES (σx, σy, ρ) par composante font varier orientations et échelles (« les orientations different, le score n'est pas radial », dit le commentaire du code) : déterminants de covariance de ~0.00058 (composante 3, σ 0.30/0.10, ρ -0.60) à 0.1296 (composante 5, σ 0.60/0.60, ρ 0). Cette cible multimodale est le banc d'essai de toutes les dynamiques qui suivent."
],
"id": "e1956603"
},
{
"cell_type": "code",
"execution_count": 8,
Expand Down Expand Up @@ -1179,6 +1195,14 @@
"print(f\"|cible| a t = 1.0 : {1/np.sqrt(1-alpha_bar_vp(1.0)):10.3f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : Le champ de score exact est calculé analytiquement sur une grille 26x26 couvrant l'espace [-3.2, 3.2]^2 à 4 instants différents (t=0.0, 0.3, 0.6, 0.9). Le score, défini comme le gradient du logarithme de la densité, est calculé pour le mélange gaussien bruité à chaque instant t. À t=0, le score correspond au score de la distribution cible non bruité. À mesure que t augmente, le bruit domine et le score devient de plus en plus simple, tendant vers un champ linéaire car la distribution s'approche d'une gaussienne centrée. Ces visualisations montrent comment le score évolue pour guider le processus de débruitage vers la distribution cible, avec des contours qui deviennent de plus en plus lisses à mesure que le bruit augmente.\n"
],
"id": "65281af4"
},
{
"cell_type": "markdown",
"id": "0154e9fd",
Expand Down Expand Up @@ -1369,6 +1393,14 @@
"print(f\"duree d'entrainement : {duree_entrainement:.1f} s ({len(histo)} pas)\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : Verbatim : « pas 2000 / 8000 loss epsilon = 0.28111 », puis 0.25420, 0.25147, « pas 8000 / 8000 loss epsilon = 0.25051 » ; « loss epsilon : premiere tranche 0.37907 -> derniere tranche 0.25127 » et « duree d'entrainement : 49.2 s (8000 pas) ». La perte décroît et se stabilise juste au-dessus de 0.25. Architecture, dans le code : « encodage de temps de Fourier + 3 couches cachees », 35714 paramètres, appareil cuda."
],
"id": "b78aa9d9"
},
{
"cell_type": "markdown",
"id": "c19bee7d",
Expand Down Expand Up @@ -1627,6 +1659,14 @@
"print(f\"borne superieure (predicteur eps = 0, soit ne rien predire) : {2.0:.5f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : Verbatim du tableau « loss epsilon moyenne par tranche de t, contre le plancher intrinseque » : ratios mesuré/plancher 1.032, 1.028, 1.026, 0.979, 0.999, 1.022 sur [0.00, 0.60] — puis 1.105, 1.229, **2.507, 12.947** sur [0.60, 1.00]. Le ratio n'est PAS stable : il reste à ~3 % du plancher là où la perte est grande, mais explose aux grands t — non parce que le modèle y est mauvais, mais parce que le plancher lui-même y devient minuscule (0.00054 sur [0.90, 1.00] contre 0.00693 mesuré : l'écart absolu est petit, le ratio ne se lit pas seul). Bilan global imprimé : « moyenne sur t : mesuree 0.50619 | plancher 0.49562 | mesuree/plancher 1.0213 », contre « borne superieure (predicteur eps = 0, soit ne rien predire) : 2.00000 » — prédire quelque chose divise la perte par ~2 par rapport à ne rien prédire."
],
"id": "2dfaa62a"
},
{
"cell_type": "markdown",
"id": "98ccccff",
Expand Down Expand Up @@ -1819,6 +1859,31 @@
"plt.tight_layout(); plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : Verbatim du tableau « t | EQM | similarite cosinus | |s exact| moyen » : t=0.02 **EQM 201.42536, cosinus 0.8533** ; t=0.10 EQM 2.03487, cosinus 0.9740 ; t=0.30 0.01692/0.9931 ; t=0.50 0.00947/0.9991 ; t=0.70 0.01361/0.9991 ; t=0.95 0.01596/0.9990. Lecture honnête : à t=0.02 l'EQM explose et le cosinus tombe à 0.85 — précisément là où la cible DSM diverge (|cible| = 36.6 à t=0.005, section précédente). Dès t=0.10 le champ appris suit le champ exact (cosinus > 0.97), et il y colle (≥ 0.999) de t=0.30 à t=0.95. Le champ appris est fidèle partout sauf au tout début de la trajectoire — le même défaut que la pondération de la perte compense à l'entraînement."
],
"id": "2c130511"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : La figure juxtapose champ exact et champ appris à t petit et t grand — l'œil y retrouve ce que le tableau vient de mesurer : structure suivie dès t=0.10 (cosinus 0.9740), quasi confondue aux grands t (0.999), décalage visible seulement au plus petit t."
],
"id": "b1f81b0d"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : La démonstration de la divergence de la cible aux petits t est cruciale pour comprendre pourquoi la pondération est nécessaire dans la perte DSM (Denoising Score Matching). Le calcul montre que |cible| = 36.6 à t = 0.005, alors qu'elle reste proche de 1.0 pour t ≥ 0.5 (1.042 à t=0.5, 1.000 à t=1.0). Cette divergence s'explique par le fait que la distribution de référence devient très concentrée quand t approche 0, et la densité peut devenir extrêmement grande dans certaines régions de l'espace. La pondération par alpha_bar(t) dans la perte DSM compense cet effet en donnant moins de poids aux petits t où la cible diverge, et plus de poids aux grands t où la cible est bien comportée. Sans cette pondération, l'entraînement serait dominé par les petits t et le modèle n'apprendrait pas correctement à reconstruire les données. Cette technique est au cœur des méthodes modernes d'échantillonnage par diffusion et explique pourquoi les modèles de score peuvent être entraînés efficacement sur des distributions complexes. La démonstration numérique montre clairement que l'écart entre les versions pondérée et non pondérée de la perte serait énorme sans cette correction.\n",
""
],
"id": "518428f9"
},
{
"cell_type": "markdown",
"id": "ea93cf09",
Expand Down Expand Up @@ -2202,6 +2267,14 @@
" return part, int((part >= seuil).sum())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : Le test des quatre conventions de signe, verbatim : « derive = -1*(-beta/2 x) +1*beta*s | MMD=0.00079 | modes=5/5 <-- RETENUE » ; les trois autres : 0.68029 (modes 1/5), 0.04392 (modes 5/5), 0.68030 (modes 1/5). Le détail spectaculaire : les mauvais signes font **exploser la variance** — « Var empirique 141092958951420.7500 » contre « attendue 4.0987 » à t=0.00 pour l'un — et le « +1 +1 », qui passe le test des modes, **sous-disperse** (Var ~0.7 contre ~2.0 attendue) : seul le signe RETENU colle à la variance attendue sur toute la trajectoire (4.1501 vs 4.0987 à t=0.00, 1.9599 vs 2.0001 à t=1.00). Une dynamique de diffusion n'est pas une équation « au signe près »."
],
"id": "945261c2"
},
{
"cell_type": "markdown",
"id": "8023ea49",
Expand Down Expand Up @@ -2469,6 +2542,14 @@
"print(f\"{'N (echantillons par methode)':42s} {N_ECH}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture** : Le tableau final, verbatim : Langevin recuit (réseau) MMD=0.00894 modes=5/5 12.6 s ; **Euler-Maruyama (réseau) 0.00156 5/5 1.0 s** ; Prédicteur-correcteur 0.00259 5/5 1.8 s ; Euler-Maruyama (score exact, contrôle) 0.00025 5/5 2.5 s ; Euler-Maruyama (mauvais signe, contre-exemple) 0.68030 **modes=1/5** 2.6 s ; « plancher vrai/vrai (tirage independant) MMD=0.00016 ». Lecture : le score exact frôle le plancher (0.00025 contre 0.00016), le réseau EM atteint 10× le plancher pour ~12× moins de temps que le Langevin recuit — et le contre-exemple mauvais signe, même sampler, tombe à 1 mode sur 5 : la qualité vient du score, pas du sampler."
],
"id": "727f3548"
},
{
"cell_type": "code",
"execution_count": 26,
Expand Down Expand Up @@ -2781,4 +2862,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
}
}
Loading