Technical note
A working intuition for diffusion on SO(3)
Why rotations make a useful case study for respecting geometry in generative models.
Many generative models begin in Euclidean space because Gaussian noise is easy to state and reverse. Rotations are a useful reminder that representation is not an implementation detail: a rotation matrix is constrained, and adding ordinary Gaussian noise walks off the manifold.
The space we are actually modeling
A three-dimensional rotation belongs to the special orthogonal group:
The tangent space at the identity is the Lie algebra , consisting of skew-symmetric matrices. A vector maps to this space with the hat operator:
The exponential map then takes a local direction back onto the group. That is the geometric move: perturb in a tangent space, then map the result to a valid rotation.
This is not a full derivation. It is the minimal picture I want in mind before choosing a parameterization or a noise process.
A practical lens
In a conventional diffusion process, the forward marginal is often written as
For rotational variables, the central question is not how to reuse that expression verbatim. It is how to define a stochastic process whose samples remain meaningful rotations, and whose score or denoising target is well-conditioned in the representation being used.
The implementation questions follow directly:
- Choose a stable representation and conversion path.
- Define noise in the tangent space or with a distribution on .
- Test equivariance and numerical behavior before trusting a training curve.
# Sketch: local perturbation, then return to the group.
omega_t = sigma_t * torch.randn(batch, 3)
R_t = R_0 @ so3_exp(omega_t)
For protein structure generation, these choices are not cosmetic. Frames, relative orientations, and coordinate updates all carry geometric constraints. Keeping them visible in the model design makes debugging more concrete.
Where this goes next
The next note will connect this local picture to frame-based protein representations and the design of a denoising objective. Until then, the important thing is simple: is a constraint worth honoring from the first line of code.