## Génération par Diffusion Inverse

Un DDPM apprend à créer en faisant l'inverse d'une destruction contrôlée : on apprend d'abord comment une image devient du bruit, puis le modèle apprend à retirer ce bruit étape par étape.

C'est une autre façon de générer : au lieu d'un duel entre faussaire et critique, on entraîne un spécialiste du "nettoyage" qui sait transformer un nuage de bruit en image cohérente.

::: {.callout-note collapse="true"}
## 🔍 Détails techniques
Les Denoising Diffusion Probabilistic Models (DDPM) représentent un **changement de paradigme** par rapport aux GANs. Inspirés par la physique statistique, ils déplacent la charge générative de la compétition adversariale vers la **reconstruction thermodynamique** : apprendre à inverser un processus de dégradation progressive [@Ho2020; @Weng2021].
:::

::: {.card .card-window .mb-4}

:::: {.card-header}
🌡️ Diffusion DDPM
::::

:::: {.card-control-row .sim-controls-row}

```{ojs}
//| echo: false
viewof ddpm_t = Inputs.range([0, 100], { value: 0, step: 1, label: "Pas t" })
```

::::

:::: {.row .g-3 .px-3 .pb-2}

::::: {.col-md-9}
:::::: {#ddpm-chart-container .card-body .p-1}
::::::
:::::

::::: {.col-md-3 .d-flex .flex-column .justify-content-center .gap-2}

:::::: {.card .border .p-2 .text-center}
**ᾱ_t**

::::::: {#ddpm-alpha-display .font-monospace .fw-bold .fs-5}
—
:::::::

Signal restant
::::::

:::::

::::

:::

```{ojs}
//| echo: false
import { updateDiffusionViz } from "../../assets/js/simulations/diffusion.js"

_ddpmViz = {
  updateDiffusionViz(
    document.getElementById("ddpm-chart-container"),
    document.getElementById("ddpm-alpha-display"),
    { t: ddpm_t, T: 100 }
  );
}
```

### Destruction Contrôlée

Le processus *forward* salit progressivement une image avec du bruit. Au début, on reconnaît encore l'image ; à la fin, il ne reste qu'un brouillard aléatoire.

::: {.callout-note collapse="true"}
## 🔢 Formules du bruit progressif
Le processus *forward* (ou de diffusion) dégrade itérativement une donnée $\mathbf{x}_0 \sim p_0$ en ajoutant du bruit gaussien à chaque pas de temps $t \in \{1, \ldots, T\}$ [@Singh2024; @SixSimpleSteps2024]. Ce processus est **markovien** et défini par :

$$q(\mathbf{x}_t | \mathbf{x}_{t-1}) = \mathcal{N}(\mathbf{x}_t; \sqrt{1 - \beta_t} \, \mathbf{x}_{t-1}, \beta_t \mathbf{I})$$ ([voir le Glossaire](../../glossaire.qmd#symboles-mathématiques-notations))

* **$q(\mathbf{x}_t | \mathbf{x}_{t-1})$** : la probabilité conditionnelle de transition d'état au pas $t$.
* **$\beta_t$ (bêta)** : coefficient de bruit au pas $t$ (déterminant la quantité de bruit injectée).
* **$\mathbf{I}$** : la matrice identité (bruit isotrope, identique et indépendant sur chaque dimension).

où $\{\beta_t\}_{t=1}^T$ est un calendrier de bruit (*noise schedule*) croissant. En définissant $\alpha_t = 1 - \beta_t$ et $\bar\alpha_t = \prod_{s=1}^t \alpha_s$, on obtient la **forme fermée** permettant d'échantillonner $\mathbf{x}_t$ directement depuis $\mathbf{x}_0$ sans simuler toutes les étapes intermédiaires ([voir le Glossaire](../../glossaire.qmd#symboles-mathématiques-notations)) :

$$q(\mathbf{x}_t | \mathbf{x}_0) = \mathcal{N}(\mathbf{x}_t; \sqrt{\bar\alpha_t} \, \mathbf{x}_0, (1 - \bar\alpha_t) \mathbf{I})$$

* **$\alpha_t$ (alpha)** : coefficient de conservation du signal original au pas $t$.
* **$\bar\alpha_t$** : le produit cumulatif (via l'opérateur de produit successif $\prod$) des coefficients de conservation du pas $1$ au pas $t$.

Pour $T$ suffisamment grand (typiquement $T = 1000$) et $\bar\alpha_T \approx 0$, $\mathbf{x}_T \approx \mathcal{N}(\mathbf{0}, \mathbf{I})$ — la donnée est devenue du bruit pur.
:::

::: {.callout-note appearance="simple" icon="false"}
## 🌡️ Diffusion de l'Encre

Imaginez une goutte d'encre dans un verre d'eau. Le processus forward est la **diffusion naturelle** : l'encre se disperse progressivement jusqu'à ce que la solution soit uniformément colorée (état de haute entropie = bruit pur). Le processus reverse est la **diffusion inverse** : apprendre à reconcentrer l'encre en une goutte cohérente à partir du chaos. La physique interdit ce retour spontané (deuxième loi de la thermodynamique), mais un modèle entraîné peut l'apprendre statistiquement, à condition de connaître le "gradient de densité" — la fonction de score.
:::

### Reconstruction Apprise

Le processus *reverse* est le geste inverse : partir du brouillard et retirer un petit morceau de bruit à chaque étape, comme si l'on essayait de reformer la goutte d'encre dispersée.

::: {.callout-note collapse="true"}
## 🔢 Formules de reconstruction
Le processus *reverse* apprend à **remonter** de $\mathbf{x}_T$ vers $\mathbf{x}_0$, étape par étape. La distribution inverse est approximée par un réseau de neurones $p_\theta$ [@Ho2020; @Raha] :

$$p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{x}_t, t), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t))$$ ([voir le Glossaire](../../glossaire.qmd#symboles-mathématiques-notations))

* **$p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t)$** : distribution inverse apprise paramétrée par les poids $\theta$ du réseau.
* **$\boldsymbol{\mu}_\theta(\mathbf{x}_t, t), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t)$** : moyenne et covariance de l'état précédent estimées par le réseau de neurones.

Ho et al. (2020) montrent qu'il est optimal de paramétrer $\boldsymbol{\mu}_\theta$ non pas directement, mais via une **prédiction du bruit** $\boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t)$ ([voir le Glossaire](../../glossaire.qmd#symboles-mathématiques-notations)) :

$$\boldsymbol{\mu}_\theta(\mathbf{x}_t, t) = \frac{1}{\sqrt{\alpha_t}} \left(\mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar\alpha_t}} \boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t)\right)$$

* **$\boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t)$** : le bruit d'écart gaussien estimé par le réseau (U-Net) à partir de la version bruitée $\mathbf{x}_t$ et de l'indice temporel $t$.
:::

### L'Objectif Simplifié

À l'entraînement, on donne au modèle une image bruitée et on lui demande : "quel bruit a été ajouté ?" S'il sait prédire ce bruit, il sait aussi l'enlever.

::: {.callout-note collapse="true"}
## 🔢 Perte de débruitage
L'objectif d'entraînement ELBO se simplifie remarquablement en une perte de débruitage [@Ho2020; @DiffusionModelsPDF] :

$$\mathcal{L}_{\text{simple}} = \mathbb{E}_{t, \mathbf{x}_0, \boldsymbol{\epsilon}}\!\left[\|\boldsymbol{\epsilon} - \boldsymbol{\epsilon}_\theta(\sqrt{\bar\alpha_t}\,\mathbf{x}_0 + \sqrt{1-\bar\alpha_t}\,\boldsymbol{\epsilon}, \, t)\|^2\right]$$ ([voir le Glossaire](../../glossaire.qmd#symboles-mathématiques-notations))

* **$\mathbb{E}_{t, \mathbf{x}_0, \boldsymbol{\epsilon}}$** : espérance mathématique calculée sur le pas $t$ (tiré uniformément), l'échantillon initial $\mathbf{x}_0$, et le bruit gaussien standard $\boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I})$.
* **$\|\cdot\|^2$** : la norme Euclidienne au carré, pénalisant l'erreur de prédiction de bruit élément par élément.

Le modèle apprend simplement à **prédire le bruit ajouté** à partir de l'image bruitée et du pas de temps $t$. Cette reformulation est à la fois simple à implémenter et efficace à optimiser.
:::

### L'Architecture U-Net

Le U-Net regarde l'image à plusieurs tailles à la fois : les grandes formes d'un côté, les petits détails de l'autre. C'est utile pour enlever du bruit sans perdre la structure globale.

::: {.callout-note collapse="true"}
## 🔍 Détails techniques
Le réseau $\boldsymbol{\epsilon}_\theta$ est typiquement un **U-Net** — une architecture encodeur-décodeur avec connexions de saut (*skip connections*) permettant de combiner les représentations à différentes échelles [@MilvusReverse]. Le partage de poids entre les couches du U-Net à différentes résolutions spatiales est une forme de **Sparse Weight-Sharing** : le même filtre appris s'applique à différentes échelles, exploitant la structure multi-échelle inhérente aux images naturelles.
:::

### DDIM Déterministe

Le DDPM classique est lent parce qu'il enlève le bruit en beaucoup de petites étapes. DDIM garde le même modèle, mais prend des raccourcis plus directs pour générer plus vite.

::: {.callout-note collapse="true"}
## 🔢 Formule DDIM
Un défaut majeur des DDPM est la lenteur de la génération : $T = 1000$ passes du réseau pour générer une image. Le DDIM (*Denoising Diffusion Implicit Models*) reformule le processus inverse comme un **ODE déterministe** plutôt qu'une SDE stochastique, permettant de réduire le nombre de pas à 50–100 sans perte significative de qualité [@MilvusDDPM; @Tarricone2026] :

$$\mathbf{x}_{t-1} = \sqrt{\bar\alpha_{t-1}} \underbrace{\frac{\mathbf{x}_t - \sqrt{1-\bar\alpha_t}\,\boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t)}{\sqrt{\bar\alpha_t}}}_{\text{prédiction de }\mathbf{x}_0} + \sqrt{1-\bar\alpha_{t-1}} \, \boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t)$$ ([voir le Glossaire](../../glossaire.qmd#symboles-mathématiques-notations))

* **$\bar\alpha_{t-1}$** : le coefficient cumulatif de conservation du signal à l'étape temporelle précédente $t-1$.

Le DDIM utilise le même modèle entraîné que le DDPM mais change uniquement le schéma de sampling, offrant un compromis vitesse/qualité contrôlable.
:::
