Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

gaussianization tutorial

Part 2 — Rotations & Orthogonal Mixers

The between-coordinate half of Gaussianization. Part 1’s marginal transforms fix each coordinate’s distribution but can never remove dependence between coordinates — a product of 1D maps is separable. An orthogonal rotation mixes information across dimensions so the next marginal pass has something to do; iterating the two is RBIG (Part 3). This part builds every mixer that matters — fitting one, learning one, freezing one, and the cheap structured linear layers that make deep flows trainable — grounded in rbig and gauss_flows.

Each notebook keeps the Part 0/1 pattern: derive the idea, then confirm it against the packages.

Notebooks

#notebookmaster listwhat you take away
00Rotation zoo & why it matters2.1–2.2PCA/ICA/random/Picard; the demo that marginal-only stalls and a rotation unsticks it
01Householder & trainable orthogonals2.3–2.4reflections → products spanning O(d)O(d); Cayley/matrix-exp for SO(d)SO(d); log-det 0 under training
02Fixed orthogonal & PCA warm starts2.5–2.6FixedRotation.from_data; why freezing matters; Householder decomposition to warm-start a trainable stack
03Structured linear layers: 1×1 conv & ActNorm2.7–2.8LU-parameterised 1×11\times1 conv ($\log

The through-line: log-determinants of linear layers

Part 2 is organised by what a linear layer costs the log-likelihood:

Each is kept a valid bijector by construction — orthogonal parameterisation, LU factorisation, positive scale — so none can drift singular under training, the lesson of notebook 02 §2.

Threads from earlier parts

A note on the packages

gauss_flows covers the whole toolkit: HouseholderRotation, OrthogonalRotation (Cayley), FixedRotation.from_data, Invertible1x1Conv (LU), ActNorm/ActNorm1D; rbig supplies the rotation zoo (PCARotation, ICARotation, RandomRotation, PicardRotation). One small asymmetry surfaced while writing notebook 03 — FixedRotation has a from_data factory but ActNorm does not, despite data-dependent init being ActNorm’s defining feature (gauss_flows#112); the notebook shows the three-line manual init in the meantime.

Running

Same uv environment as Part 0 / Part 1 (rbig + gauss_flows + a Jupyter stack):

cd projects/gaussianization
.venv-tutorials/bin/jupyter nbconvert --to notebook --execute --inplace \
  notebooks/02_rotations/0*.ipynb --ExecutePreprocessor.timeout=600

Notebooks are paired (jupytext, py:percent) and set jax_enable_x64.