Two runs. Same method, same base model (Qwen3-4B-Instruct, LoRA r=16 on q/v), same budget of roughly 600 practice tasks, same 12-primitive vocabulary. One difference: how many distinct compositions those tasks were spread over.
N = training structures · k = 2 (composition depth) · m = 12 (vocabulary size)
Structure × primitive
These are absolute counts, so Run B's bars are longer in part because its corpus has four times as many structures. The shape is the point. Run A runs 5, 4, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0 — one primitive in nearly half the corpus, three in a single structure each, and one in none at all. Run B runs 11 down to 5, with nothing missing.
The vocabulary — 12 primitives, each list[int] → list[int]
Click a row to select that column in the matrix above.
Run A: what was practised vs what was held out
Both lists are depth-2 compositions drawn from the same 12-primitive vocabulary.
the model saw these, repeatedly, in ~600 wake tasks
never practised · badge = how many training structures each part appeared in
Caption.
Skew.
Reconstruction note.