YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
tiny-math
How small can a model be and still learn arithmetic? β answered.
| smallest that passes (β₯95% on 4-digit addition) | accuracy | |
|---|---|---|
| From-scratch (digit vocab) | 805,632 params | 100.0% (5000/5000) |
| Real pretrained LLM (fine-tuned, minimal tokenizer fix) | TinyStories-1M, 3.75M params | 99.7% (n=2000) |
| Real pretrained LLM (native BPE, no tokenizer change) | pythia-14m, 14.1M params | 99.8% (n=2000) |
The closing experiment: a one-rule tokenizer ablation moved TinyStories-1M
from 0.2% β 99.7% β same weights, same data, same recipe; only change:
number runs tokenize per digit instead of inconsistent chunks
(1842 β ['18','42'] native vs ['1','8','4','2'] fixed), same 50,257
vocab, no new tokens. The BPE floor was never about capacity β it was the
tokenizer's chop points. Zero-shot, every real LLM up to 134.5M still
scores 0%. Full story: VERDICT.md.
Three structural findings: (1) capacity buys sample efficiency and the transition is a cliff (0.81M: 0.2% β 100% between 357k and 1.78M problems); (2) in-distribution perfection β algorithm learning β 100% at the trained digit-length, 0% at every other length, with example answers showing fixed-slot positional choreography; (3) pythia-14m's 99.8% trained only its 1.19M transformer blocks (vocab frozen) β nearly the same trainable capacity as the from-scratch winner.
Model + full results on Hugging Face
Headline from-scratch results
| model (actual params) | 71k problems | 357k problems | 1.78M problems |
|---|---|---|---|
| 0.81M | 0.0% | 0.2% | 100.0% |
| 3.58M | 0.0% | 95.7% | 100.0% |
| 6.34M | 0.0% | 98.8% | 100.0% |
Baselines (bigram count model, untrained model): 0.0% β the floor is zero; everything above it is learned.
Layout
VERDICT.md # the final answer: tables, chart, disclosures
train.py # tokenizer + data gen (3 formats) + TinyGPT + train/eval loop
baselines.py # bigram count model + untrained-model baselines
verdict.py # combines ALL results -> verdict.json + verdict_chart.png
make_kernel.py # builds single-file Kaggle kernels (no sibling imports)
nan_autopsy.py # fp16/AdamW NaN forensics (the pythia-14m saga)
MODEL_CARD.md # honest report for the from-scratch model
STATUS.md # full session log: bugs found, decisions, pre-committed rules
kernels/ # every GPU run: bakeoff, sweep, extrapol, quiz, stageb2-6
results/ # all raw results + charts
Methodology notes (the parts that matter)
- Contamination prevented by construction: eval sets built before training streams; streams reject any eval pair; extrapolation control excludes train-seen pairs by exact RNG replay.
- Exact match only, never training loss or shaped rewards.
- Format chosen by measurement (3-format bake-off), not taste.
- Independent tuning vs final eval sets with overlap asserts.
- Eval sizes stated per table (n=5000 from-scratch, n=2000 LLMs).
- One seed per cell; disclosed. Six training rounds for the LLM arm β
every null result, bug, and fix is in
STATUS.md. Nothing was dropped for being inconvenient.
Citation
@misc{atharvagupta123-tiny-math,
title = {tiny-math: the smallest model that can do arithmetic (0.81M from scratch; 14.1M as a pretrained LLM)},
author = {Atharva Gupta},
year = {2026},
howpublished = {\url{https://github.com/Its-Atharva-Gupta/tiny-math}}
}
