forced wordcelification (of a math model)
This is a work-in-progress.
{Written : 27 October 2026 | Repo : [WIP!] }
Paradigma is a new auto-research startup based in Rome that has recently released the delightful model Limite 1B - Violetto. Self-evidently, Limite is tiny little thing, {{but it punches above its weight in mathematics.}} <- revise
(From hereon in, I'll refer to the final model as Violetto and the base model as Limite, with the whole 'family' being Limite/Violetto)
To be completely honest with you, I don't care much about how good Violetto is at math. Okay, that's a lie. I wouldn't be so interested in the model if it were an utter lobotomite, but my fascination with restricted-domain pretraining is what begets that interest in the first place. And Limite/Violetto is the rare case of a modern model with significantly restricted pretraining that is not disabled by design (*cough* training on random bullshit like children's stories *cough*).

I mean, this is usually what post-training looks like! While I'm quite the proponent of pre-training diversity and thoughtfulness in data curriculum construction, there are so many neat properties that come out of regime like this, especially combined with even more brutally math-centric post-training.
Namely, despite the base model also being trained on a mathmaxxed corpus, Violetto's post-training kind of cooked its other abilities.

Paradigma uses the above as an example of an "instruction following failure," but it feels less like an issue of instruction following and more like one of parametric knowledge access; ... [ do more writing lazy ; it feels like it's drawn towards mitosis ]
[TODO: run the above prompt on the side-by-side!]
The first example I thought of was dangling a concept more associated with a certain problem in mathematics than its actual origin in the model's face-- Konigsberg, of Seven Bridges Fame. [Okay, I know it is of a lot of historical fame as well. I fucking love Prussia. The fact that it goes by Kaliningrad now probably does not help Violetto at all, but Limite still gets the answer, so it's not too obscure of a fact as to not be recallable by the base model.]

With these two motivating examples, I decided I was interested in eliciting OOD behaviour from this model, where OOD vaguely means "not possible without steering or interventions," because the math-heavy curation of its pretraining corpus and its poor non-mathematical instruction following make it difficult to fully gauge what Violetto actually knows.
Intuitively, a model trained mostly on mathematics will find elucidating mathematical ideas quite easy, while the internal pathways that allow generalist models to properly identify and tap their knowledge base may not have been reinforced during training, or have even formed in the first place! Thus, I hypothesize that we may be able to properly assess how much "moribund" knowledge Violetto really learned through interventions on its residual stream.
If this is the case, it's likely that we can improve its mathematical abilities through making its crystallized knowledge more accessible. Also, because we have access to both the base and post-trained model, we can observe the pernicious effects (if any) of RL & SFT post-training on a narrow domain, contrasting that with just pre-training on that more narrow domain. Also, because this is cool.
On my depressing unoriginality
Evaluations
To get an idea of what I'm working with, I decided to run evals myself. These should all be repeatable via the setup in my repo.
Math
With a fixed budget of 16,384 tokens, we get the results below. Obviously, this is not what Violetto and co. were evaluated on; the model seemed awfully verbose for how small it is, so I wanted to try both this...
| model | gsm8k | math500 | aime2025 | aime2026 |
|---|---|---|---|---|
| violetto | 90.1 ± 0.8 | 89.8 ± 1.4 | 31.7 ± 8.1 | 36.2 ± 8.3 |
| limite-base | 75.1 ± 1.2 | 50.2 ± 2.2 | 1.2 ± 0.7 | 0.4 ± 0.4 |
| limite-base-soup | 74.2 ± 1.2 | 58.0 ± 2.2 | 10.0 ± 2.3 | 12.1 ± 2.8 |
| qwen3-1.7b | 90.4 ± 0.8 | 90.0 ± 1.3 | 30.4 ± 7.5 | 31.2 ± 7.0 |
| r1-distill-1.5b | 85.8 ± 1.0 | 84.6 ± 1.6 | 22.5 ± 6.9 | 22.5 ± 6.2 |
| openmath-nemotron-1.5b | 76.4 ± 1.2 | 89.8 ± 1.4 | 39.2 ± 7.5 | 48.3 ± 7.0 |
...and a longer math eval using Paradigma's own suite, of course. However, due to compute constraints and the fact that I'm not particularly distrustful of Paradigma, I decided to only bother recreating the AIME 2026 Violetto run; it came out at 93.9% vs the tech report's 94.01%, so that checks out. (It used a median of 17k tokens per problem, but went up to 120k on the difficult ones!)
General Knowledge (loglik)
(Done via raw-text loglik, where random MMLU chance is 25)
| model | mmlu | arc_c | hellaswag | winogrande | piqa |
|---|---|---|---|---|---|
| violetto | 28.2 | 28.5 | 31.6 | 50.4 | 55.1 |
| limite-base | 39.3 | 38.7 | 39.2 | 55.1 | 62.9 |
| limite-base-soup | 35.6 | 33.2 | 35.4 | 54.9 | 60.6 |
| qwen3-1.7b-base | 62.8 | 55.5 | 67.1 | 64.9 | 75.5 |
| olmo2-1b-base | 41.8 | 44.2 | 67.7 | 68.3 | 75.3 |
| openmath-nemotron-1.5b | 28.0 | 28.2 | 34.4 | 52.7 | 56.0 |
Generative Short Answer
(Basically what you'd expect from a regular eval, judged by gpt-6-luna with low effort on 24 October 2026)
| model | triviaqa | nq_open | popqa | simpleqa |
|---|---|---|---|---|
| violetto | 0.9 | 0.5 | 0.8 | 0.1 |
| limite-base | 4.6 (5.6) | 4.0 (4.7) | 3.6 (8.2) | 1.2 (1.0) |
| limite-base-soup | 3.7 (2.8) | 1.5 (2.6) | 1.9 (4.2) | 1.3 (0.9) |
| qwen3-1.7b-base | 32.2 (43.9) | 18.5 (22.7) | 21.9 (26.1) | 2.8 (3.4) |
| olmo2-1b-base | 37.4 (46.5) | 14.0 (19.3) | 23.1 (29.4) | 2.6 (2.9) |
| olmo2-1b-rlvr | 37.5 | 20.4 | 23.7 | 2.4 |
| openmath-nemotron-1.5b | 1.8 | 1.5 | 2.1 | 0.4 |
These results are a little... uh... abysmal, but not unexpected.
Post-Training Damage?
Transplanting (lol)
Something interesting about the architecture of this model is that it uses a lot of NanoGPT Speedrun tricks. One that I was particularly eyeing was its use of gated value embeddings every third layer.

For all intents and purposes, this is tantamount to having a second embedding table with a row for every token in our input vocabulary. Instead of entering the residual stream directly, each token's row is added straight to attention every third layer.
So, in a value-embedding-affected layer, for each token position in the sequence, let be that position's residual stream vector entering the layer, and the token id sitting there. The values fed to attention are
where is the value for that token from the second embedding table. This is somewhat reminiscent of DeepSeek's Engram, which they demonstrated in their own paper the recall effects of.

A corollary of this is that the mid-layer patching that [transfers recall in normal models does not work on Limite/Violetto. (Actually, Violetto doesn't know enough facts to be fairly tested, so I couldn't include it below).
| Model (Layers) | Facts tested | First 5 layers | Best window (Layers) |
|---|---|---|---|
| Qwen3-1.7B-base (28) | 196 | 0.91 | 0.91 (0-4) |
| Qwen2.5-Math-1.5B (28) | 161 | 0.82 | 0.82 (0-4) |
| OLMo2-1B-base (16) | 199 | 0.28 | 0.30 (1-5) |
| limite-base (48) | 88 | 0.04 | 0.05 (7-11) |
| limite-base-soup (48) | 42 | 0.02 | 0.03 (7-11) |
To demonstrate the difference between Limite and Violetto here, I decided to run a small test on the value-embedding table. (And because I am me, I went straight to geography. Sue me, it's easy!)
For each of the 51 countries below, I
- Looked it up in the value-embedding table (if its name contained multiple tokens, I averaged them. This only affected 4/51 countries.)
- Passed that row through a single head in layer 46 (the last layer that reads the value-embedding table; I ran some experiments before this that showed patching value-embeddings has basically no effect on recall for every value-embedding layer except this one [why is that the case? late layer -> affects readout heavily, maybe], where I got 0.70 recall fidelity from the patch). I took the best heads for both Limite and Violetto (3 and 8, respectively). Selecting a single best did better than picking multiple heads, probably due to specialization, so I feel it's acceptable in a readout-only experiment.
- Read the vector produced by step (2) with the LM head unembedding
- Took the score of the first token of the capital and ranked them by the scores for each country (this, of course, only measures how likely it is in comparison to the 50 other capitals!)
(Many of these capitals are not represented as one token; I've provided the full capital names for reading convenience, but something like Hanoi really starts with H, so that's what I checked the probs for. This could be a minor reason why tokens like Hav and Kab with more "country-capital-ness" to them attract so many of the countries in Limite, but it's much more of a head-specific thing, as you can see by comparing to another head's outputs. This effect is also minorly visible in Limite's chart!)
While this gives us a nice figure, it doesn't feel exhaustive enough to conclude anything about what knowledge Violetto actually has-- we only see what it can output. It could be true that Violetto's access to its knowledge has been trained out of it, while the knowledge still remains moribund in its weights. (Essentially, that readout is extremely fucked-up.)
To attempt and address this, I decided to Frankenstein Limite and Violetto with components of each other. (Soup is a limite-base variant made by averaging different checkpoints; I won't get too much into it, as there are more details in their tech report, but I use as a sort of control here.)
I originally planned to only use CounterFact, but limite-base only got 71 out of 1020 total facts right there. Because I didn't want to encounter any weird floor-effect issues, I added 203 random, well-known facts, bringing the total pool to 1223. Recall is based on 198 facts limite-base got right. Stated facts are 300 random facts from a pool of 1223 total facts, whether the model knows them or not, with the true fact written into the prompt, meant to test readout of facts. Made-up people are 400 random stories generated by a script, which I figured may be easier than the stated facts section because there is almost no no real-world knowledge tied to them at all.
(You can check out all three categories' data here!)
| Host + swapped part | Recall | Stated fact | Made-up people |
|---|---|---|---|
| Limite, unchanged | 0.99 | 0.94 | 0.71 |
| + soup's table | 0.95 | 0.94 | 0.70 |
| + Violetto's table, rows rescaled to Limite's norms | 0.81 | 0.94 | – |
| + Violetto's table | 0.69 | 0.94 | 0.67 |
| + own table, rows shuffled | 0.07 | 0.78 | 0.56 |
| + Violetto's layer-46 attention | 0.41 | 0.90 | 0.57 |
| + Violetto's table and layer-46 attention | 0.33 | 0.91 | 0.57 |
| Host + swapped part | Recall | Stated fact | Made-up people |
|---|---|---|---|
| Violetto, unchanged | 0.05 | 0.45 | 0.52 |
| + Limite's table | 0.02 | 0.32 | 0.45 |
| + Limite's layer-46 attention | 0.07 | 0.46 | 0.56 |
| + Limite's table and layer-46 attention | 0.04 | 0.38 | 0.53 |
todo write up these
(damage exp)
| Limite with Violetto's… | Recall | Stated fact | Arithmetic |
|---|---|---|---|
| nothing | 0.99 | 0.94 | 1.00 |
| value-embedding table | 0.70 | 0.94 | 1.00 |
| MUDD weights | 0.44 | 0.78 | 1.00 |
| layer-0 attention | 0.19 | 0.55 | 1.00 |
| layer-36 MLP | 0.21 | 0.34 | 0.03 |
| layer-43 attention | 0.02 | 0.51 | 0.49 |
| layer 44–47 MLPs | 0.00–0.10 | 0.00–0.27 | 0.10–0.99 |
| any single soup part (control) | ≥ 0.92 (except the last two MLPs) | ≥ 0.91 | 1.00 |