A tiny decoder, trained right here

The model is ten lines of PyMC (model.py: z → Dense(4→20) → sigmoid → Dense(20→196) → sigmoid), built ahead of time by pymcwasm-build into a wasm module, so no Python loads here. load fetches that module; train fits it with tapewasm's advi(), in a worker. 32 MNIST digits (posteriordb's subset), downsampled to 14×14 so a fit takes seconds.

idle — load the model first

Model

i = 1…32 j = 1…196 zᵢ hᵢ xᵢⱼ W₁,b₁ W₂,b₂ N(0, 1) N(0, 1) sd 0.05 N(0, I₄) 20 units
zᵢ  ~ N(0, I₄)
hᵢ  = sigmoid(W₁ᵀzᵢ + b₁)
μᵢ  = sigmoid(W₂ᵀhᵢ + b₂)
xᵢⱼ ~ N(μᵢⱼ, 0.05²)

Shaded: observed pixel. Double circle: deterministic. Not a VAE — there is no encoder. Each zᵢ is its own parameter, fit jointly with the weights by mean-field ADVI.

Not loaded yet.

Latent space

Train the decoder to explore it.

Each digit's fitted z, on two of its four axes. Drag, or click a point.

x y

Decoded

Nothing fitted yet.

Rendered live from the fitted weights.