experiment: mnist_collapse kind: mnist_lineage seed: 20260705 n_replicates: 4 # (Layer 1.5 external-validity tier; maps to Layer-1 E1/E2 and neural collapse/grounding): does # model collapse — and its rescue by grounding — appear on REAL MNIST images, not just the # synthetic sandbox? A convolutional VAE (the canonical model in which generative collapse was # first observed) is retrained each generation on the previous VAE's own generated images, plus a # fraction g of fresh REAL MNIST images (grounding). Modes = digit class x stroke-thickness bin # (K=30) resampled to a Zipf p*; a frozen CNN + deterministic thickness is the oracle (its # confusion matrix, recorded in the manifest, is the measurement-noise floor). Expect (per E1/E2): # the dry arm (g=0) collapses — rare modes die, forward-KL climbs, support shrinks — while a # grounded arm holds the tail. This is confirmation-only: SIGNS, not magnitudes (blueprint 3.5); # the exact synthetic oracle remains the anchor for every quantitative comparison. Falsifier: the # dry VAE shows no diversity loss, or grounding fails to arrest it. mnist: K: 30 n_classes: 10 style_bins: 3 # K = 10 classes x 3 stroke-thickness bins R: 1 tail: zipf zipf_s: 1.5 # the rarest ~18/30 modes form a real tail (~9% of the mass) tail_threshold: 1.0e-2 init: truth data_root: data model: kind: convvae latent: 32 epochs: 30 lr: 1.0e-3 batch_size: 256 beta: 1.0 n_eval: 10000 # generate-and-classify samples for the mode-distribution readout oracle: epochs: 5 # frozen digit CNN (~98.5% mode accuracy = the noise floor) lr: 1.0e-3 batch_size: 256 cache: models/mnist_cnn.pt dynamics: n: 6000 # images the pupil VAE sees per generation (drift strength) grounding: {m: 0, policy: proportional} # m overwritten per g by the sweep generations: 15 metrics: kl_floor: 1.0e-9 support_eps: 1.0e-9 sweep: - param: g values: [0.0, 0.1] # dry vs grounded (VAE collapse is strong; needs ~10% real, cf. grounding) output: dir: results/fig2_mnist_collapse