How a model makes a picture by removing noise.

SRC·17 Source
To make a picture, it starts from pure static.

To make a picture, it starts from pure static.

Every image generator faces the same wall: a million pixels that must all agree at once. Diffusion models dodge it with a strange move — they start from a screen of pure random static and take it away, a little at a time, until a picture nobody has ever seen is standing there. The first thing they learned wasn't how to create. It was how to destroy.
First, the easy direction: how to wreck a picture.

First, the easy direction: how to wreck a picture.

q(xtxt1)=N ⁣(xt; 1βtxt1, βtI)q(x_t \mid x_{t-1}) = \mathcal{N}\!\left(x_t;\ \sqrt{1-\beta_t}\,x_{t-1},\ \beta_t \mathbf{I}\right)
Reversing chaos is hard; making it is trivial — so start there. Take a real photo and stir in a little random noise, step after step, until nothing's left but grey snow. Like a drop of ink in still water: it spreads a touch more each moment, never un-spreads, until the glass is one even grey. In plain words: each step keeps a hair less of the picture and blends in a hair more pure static — tiny, exact, and easy to learn.
You can skip to any amount of ruin in one shot.

You can skip to any amount of ruin in one shot.

xt=αˉtx0+1αˉtε,εN(0,I)x_t = \sqrt{\bar{\alpha}_t}\,x_0 + \sqrt{1-\bar{\alpha}_t}\,\varepsilon, \quad \varepsilon \sim \mathcal{N}(0, \mathbf{I})
Adding noise one slow step at a time would be tedious. Happily, all those little steps collapse into one formula: any noised version is just the original turned down and pure static turned up, mixed by a single knob. Like a translucent scrim drawn across a stage: the further you pull it, the more the scene dims and the white takes over — and exactly how far you've pulled is the only number you need. So you can jump to any moment of decay at once.
Now the real trick: teach a net to spot the static.

Now the real trick: teach a net to spot the static.

Lsimple=Ex0,ε,t[εεθ(xt,t)2]\mathcal{L}_{\text{simple}} = \mathbb{E}_{x_0,\,\varepsilon,\,t}\left[\,\left\lVert \varepsilon - \varepsilon_\theta(x_t,\,t) \right\rVert^2\,\right]
Here's the whole magic. You can't un-mix ink by hand — but a network can estimate what was stirred in. Show it a noisy image and ask one question: which part of this is the static I added? Grade it on how close its guess is, across millions of examples. Like an art restorer lifting grime off an old painting: it doesn't repaint the scene — it learns to see only the dirt, so that what remains is the picture underneath.
Why hundreds of tiny steps, not one big leap?

Why hundreds of tiny steps, not one big leap?

xt1=1αt(xt1αt1αˉtεθ(xt,t))+σtz,zN(0,I)x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\,\varepsilon_\theta(x_t,\,t)\right) + \sigma_t z, \quad z \sim \mathcal{N}(0, \mathbf{I})
If it can spot the noise, why not strip it all at once? Because one giant guess asks it to imagine the whole picture from grey — too much. So it removes a thin slice, looks again, and repeats, hundreds of times. In plain words: subtract a little of the predicted static, stir in a whisper of fresh randomness, repeat. Like a stonemason splitting granite: not one wild blow but a row of small, sure taps — each easy, the stone cleaving true only because no single hit had to do it all.
But how does it draw a cat and not just… anything?

But how does it draw a cat and not just… anything?

ε~θ(xt,c)=εθ(xt,)+w(εθ(xt,c)εθ(xt,))\tilde{\varepsilon}_\theta(x_t, c) = \varepsilon_\theta(x_t, \varnothing) + w\left(\varepsilon_\theta(x_t, c) - \varepsilon_\theta(x_t, \varnothing)\right)
Left alone, denoising drifts toward some plausible image — not yours. So at every step you also hand it your words, and lean its guess toward them. The cleanest way: compare its denoise with the prompt against its denoise blind, and exaggerate the gap. Like a magnet under a sheet of iron filings: the prompt is the field; crank its strength and the scattered grains snap harder into the shape you named.
Static in, a picture out — destruction, run backward.

Static in, a picture out — destruction, run backward.

Step back and see the whole engine. It taught itself to ruin pictures, learned to name the ruin, and now runs that knowledge in reverse — from a fresh field of static, steered by your words, one gentle step after another. Like a print rising in the developer tray: the blank sheet was never blank; under the right bath, in its own time, the image simply surfaces. Nothing was drawn. The noise was sculpted.
🌱 Did it create the picture — or just uncover it?

🌱 Did it create the picture — or just uncover it?

Change the opening static and you get a different picture; the same static always gives the same one. So every image it can make is, in a way, already implied — folded into some grain of noise, waiting. Like a face the sculptor swears is already inside the marble: remove what isn't it, and there it stands. So is the model making these pictures — or only carving away everything they are not?
tap →swipe ↑ for depthswipe ↓ to exit