Model

Nobody alive has heard Proto-Indo-European, and nobody who spoke it wrote any of it down. Every word is a reconstruction. This is how I taught a language model to read and write it anyway, in the scholars' own notation, better than the frontier models manage.

The result

On the project's benchmark the model scores 88.5 lenient and 86.2 strict. The best frontier runs I tested, Claude Opus 5.5 at its highest effort and GPT-6.1 Sol at high, score 86.0 and 84.4 lenient, then 50.0 and 47.0 strict. The lenient score forgives notation (accents, vowel length, ASCII spellings like h2 for h₂), so it asks whether the grammar is right; the strict score asks for the exact form, written the way the reconstruction writes it. The frontier models lose 36 and 37 points the moment the notation counts. This model loses 2.3.

86.2strict benchmark score, against 50.0 for Claude Opus 5.5 and 47.0 for GPT-6.1 Sol
98.8%of the cells in Wiktionary's inflection tables regenerated by the grammar engine, every miss explained
78 → 3English words the model could never produce in PIE, before and after the last training stages
127,896words of text composed through the engine and checked by it, in 4,755 records

That gap is the hard part of the whole project. There are no native speakers to learn from, no recordings and no text written by anyone who spoke the language. What exists is a body of scholarship that infers each word from its descendants and writes it in a notation full of laryngeals (h₁ h₂ h₃), three rows of back consonants (ḱ, k, kʷ), breathy-voiced stops, syllabic resonants and pitch accents, and the handbooks still disagree about details. A model can't pick that up from the internet the way it picks up French. It needed a lexicon, a grammar that inflects every word the same way every time, and a corpus written through that grammar, which is most of what this page is about.

Figure 1. The benchmark by segment, version 2. Solid bars are the strict score, the hatched extension the lenient one. The overall score weights English → PIE 30, inflection and PIE → English 20 each, paradigms and dialogue 15 each. Ours is Nemotron 3.5 Super at stage e3, run in bf16.

The lexicon

The lexicon holds 8,368 entries. 7,401 come from Wiktionary's reconstructions (roots, words and the derivatives in their descendant trees), 829 from LIV², the standard lexicon of PIE verbs, 135 from the Nomina im Indogermanischen Lexikon and 3 added by hand from the handbooks. LIV² and NIL don't exist as data, so I had them transcribed from page images: 1,172 roots from LIV², and 207 roots with 3,044 formations from all 737 pages of NIL, where overlapping transcriptions agreed 96% of the time.

A lexicon this size is wrong in places, and the project treats every error as something to fix at the source and record. 367 entries carry an override with its reason, usually a gloss that misled a writer or a stem the handbooks correct. Where Wiktionary gives no meaning, 119 glosses are confirmed by the descendants themselves (the word's reflexes agree on a meaning in at least two branches), and 3,745 more are composed from the root's meaning and the suffix's function, marked as approximate so the reviews can measure them separately. The NIL merge failed its first review (about a quarter of the new lexemes were wrong) and was held out of the corpus while it was fixed. Entry ids are frozen in a registry, so a rebuild never renames a word the corpus already uses.

The grammar engine

The engine regenerates 98.8% of the cells in Wiktionary's PIE inflection tables, 14,023 of 14,197, and none of the remaining mismatches is unexplained: each is traced to a cause (Wiktionary's own inconsistencies, such as a dropped laryngeal or an inconsistent delabialization, a partial table, or a lexical exception the engine still needs an override for), and a test fails the build if agreement drops below 98.5% or a mismatch appears that nothing explains. The canonical paradigms in my plan (pṓds, wĺ̥kʷos, dʰugh₂tḗr, ph₂tḗr, h₁ésti, bʰéreti and the rest, 11 of them) all pass, checked against Fortson and Ringe.

It works in two layers. The first takes a stem, its weak form and its accent class and builds every cell: nouns in all eight cases and three numbers across the acrostatic, proterokinetic, hysterokinetic and amphikinetic classes, adjectives in three genders, and verbs through the present, aorist and perfect with subjunctive, optative, imperative, middle and participles. The second guesses the stem and class for the words Wiktionary gives no table for, from the shape of the lemma. Every one of its rules is backtested on the words that do have tables, with the table hidden, and only a rule that matches at least 85% of the hidden cells may feed the corpus. A separate checker runs the lexicon forward through the sound laws into Vedic, Greek, Latin and Proto-Germanic as a warning system: 94.8% of 5,315 checks pass, and the rest point at entries worth a second look.

Figure 2. The share of Wiktionary's table cells the engine regenerates exactly, for the noun and adjective classes, once the mismatches had been triaged (2026-10-23, 11,136 of 11,255 cells in scope, the first verb tables included). The middle, subjunctive, optative and participles came later and bring the whole to 14,023 of 14,197.

The corpus

The corpus is 5,230 records in four tiers, and almost all of it was written through the engine. Tier 1 is the scholars' own text: 99 lines from 17 published versions of Schleicher's fable and "The King and the God", from Schleicher's 1868 original to Byrd, plus 7 reconstructed formulas from Watkins and West. Tier 2 is back-projection: 109 lines reconstructed from passages that the daughter traditions share (the Rigveda beside Homer, the Avesta beside the Edda), each with its attested witnesses. Tier 3 is where the volume is: 4,755 records, single sentences and connected texts, 127,896 words. Tier 3b is 260 records of everyday talk.

Tier 3 is never free-form PIE from a language model. A model writes the English and a structured plan (which lexeme, which case or tense, which person), the engine produces every form, the model may only reorder the words and choose particles, and the validator checks the result before it's kept. Whole genres go through this (epic, hymns, charms, laws, farm life, animal fables, speeches), and the coinages that modern talk needs are built from attested roots and productive suffixes only and logged with their derivations; they're 4% of the words in the training export, under a cap of 15%.

No batch reaches the training export without passing an adversarial review, with planted errors to check that the reviewer is paying attention. A review that finds a wrong record doesn't fix that record: it finds the cause in the engine, the classifier or the lexicon, fixes it there, and the whole tier is regenerated. Early batches came back 4% wrong; later ones 0 to 2 real errors in 20. The Tier 2 review rejected 10 lines and marked 70 as weak, and its claims of what is "secure" are now verified mechanically, never taken on trust.

Figure 3. The corpus by tier, in records and in words of PIE. Tier 1 is small because the scholarship is: 17 published versions of two short texts and a handful of formulas. Tier 2 is small because real parallels across the branches are rare.

Fine-tuning

Fine-tuning Nemotron 3.5 Super, NVIDIA's 120-billion-parameter mixture of experts (12 billion active), on the corpus gave the model of record, stage e3: 88.5 lenient and 86.2 strict, first on the benchmark overall. Getting there took three model families and one lesson that cost a night.

The training data is the corpus turned into conversations: 47,088 of them in the export the model of record's training mix was drawn from, beside a held-out test split of 713. About half are translations, set as an app session or as single sentences in either direction; the rest are dialogue in English and in PIE, interlinear glosses, single inflected forms, whole paradigms, reconstruction from cognates and the continuation of hymns and charms. Every conversation opens with the same system prompt, telling the model it is a speaker of the language who thinks in it and answers in it, and the loss falls on the model's own turns only.

Figure 4. The training conversations by kind, in the export the model of record's training mix was drawn from (export 5b754f0, 47,088 conversations).

I started small, with Qwen3-4B on a single RTX 5090, to learn what the data does. The first lessons were mechanical and expensive to find. A base model under LoRA never learns the end-of-turn token of a chat template it was never trained on, so it runs past every answer into junk; it needs a format whose stop token it already knows. And two epochs were enough for a 4B model: held-out loss bottomed at the second and rose at the third while the training loss kept falling. Then Qwen3.6-35B, trained on Tinker: after one epoch it beat the 4B's second epoch on every measure but one, with regular paradigms nearly solved (95% of cells) and the ablauting ones, where the stem changes its vowel, still the gap.

For Nemotron I swept the learning rate and optimizer first: six short probes, scored by held-out loss. Dimuon at 8e-3 won, 40 times the AdamW rate, and rank 32 was no better than rank 16. The full run went three epochs, 2,514 steps in about five hours. Here's the night's lesson. Held-out loss bottomed in the first epoch and rose after it, which by the usual rule says stop at epoch one, but the third epoch won the benchmark, best on every segment except English → PIE, where it tied the first. For this corpus held-out loss isn't a stopping signal, so every epoch gets judged. Quantized to 5 bits to run on my Mac, it scores within noise of the full-precision model.

Figure 5. First: the learning-rate and optimizer sweep for Nemotron 3.5 Super, held-out loss after 100 steps (lower is better). Second: the full run's three epochs, held-out loss beside the benchmark score. The loss would have picked epoch 1; the benchmark picked epoch 3. Epoch 2 was benchmarked in the 5-bit quantization, the others in bf16.

Reinforcement learning

Reinforcement learning, with one supervised pilot in the middle, took the English words the model could never produce in PIE from 78 to 3, and brought its English → PIE translation back to within a point of its best. That's the end of eight stages; most of what came before taught me what not to do, and the notes are kept as carefully as the wins.

All of it ran on the Mac, with GRPO in mlx-lm-lora: for each prompt the model samples eight answers, and the ones that score above their group's mean are reinforced. The reward is local wherever the engine can decide. Inflections and paradigms are checked against the engine's cells; a translation scores zero for an empty answer, commentary, padding or any word the engine doesn't know, and one for a reference answer. Only what the local checks can't settle reaches a Claude judge: Haiku 5.5 screens, a second Haiku call re-checks what it flags, and an answer is wrong only if both say so, which came to about $1.36 per thousand judgments. Each kind of task has its own brief for the judge, tested against Opus before it goes into a reward; the dialogue brief agreed with Opus on 85% of 150 benchmark replies.

The first stages, on the 35B, ran into everything at once. A stage could lift dialogue and translation while inflection and paradigms slipped; one drifted after about 450 steps until its distance from the starting model (the KL) kept climbing past 0.3, which is now a stop signal; RL on top of two merged adapters degraded within 25 steps. On Nemotron, stage 5 found that its prompts were already memorized (the model reproduced 82% to 89% of them exactly), so it measured recall and moved very little. Stage 6 built prompts from text held out of every export and still moved little, because the eight answers in a group mostly scored alike and gave no signal. Stage 7 kept the prompts the model got right only sometimes (plus a third of those it never got right), which raised the signal and then went too fast, and I threw it away.

The words were the stubborn part: a word the model never produces can't be rewarded into existence. One pass of supervised training on them didn't do it either (three in four stayed never right). What worked was a vocabulary pilot that put each of 83 missing words into about seven sentences the engine wrote around it, in varied cases and tenses: never-right words fell from 78 to 2, and the words turned up in 79% of held-out sentences that needed them against 10% before. It cost four and a half points of English → PIE translation (78.8 to 74.3 chrF). Stage 8 went back to RL from that point, with the KL measured against the pilot's own weights rather than the bare model, so the new words weren't pulled back out. The words stayed (3 never right) and English → PIE came back to 78.6, against 78.8 before the pilot.

Figure 6. Stage 8 as it trained: the mean reward of the sampled answers, and the KL from the starting weights, which stayed far below the 0.3 that stops a run.
Figure 7. The last stages on the frozen test sets: v1 chrF over everything, English → PIE chrF alone, paradigm cells on the drill set, and of the 83 words the vocabulary pilot targeted, how many the model could never produce.

Stage 8 still trails the stage before the pilot by a point of v1 chrF and a little on paradigm cells, and that's where the work is now: blending the two sets of weights exactly (stacking the two adapters, so the result is a weighted sum of what each one changed) and measuring each blend against the same bar.

Measuring it

Every checkpoint is measured on the same frozen prompts, held out of all training and every RL set (a test checks that): 246 mixed prompts (v1) and 371 grammar drills. The automatic scores are chrF against the reference, exact match on single forms, the share of a paradigm's cells the model gets right, and the share of its PIE words the engine recognizes as real forms. They're quick, and they're the reason a regression gets caught the same night.

They also mislead. chrF against one reference punishes a different but correct translation, so the benchmark has the translations and dialogue judged: by Claude Opus 5.5 and by GPT-6.1 Sol, two vendors, so no vendor grades its own models alone, each with the engine and the corpus as tools and the reference beside the answer. Each item scores 1, 0.5 or 0, and separately for notation. The benchmark was registered before any contestant ran, the frontier models answered from their weights alone with no tools, and every change since is recorded as an amendment in its README.

Even the judged scores need care. A round judged by one model alone carries about a point of noise on the overall score, measured on answers that didn't change between rounds. And when stage 8 seemed to lose five points of dialogue chrF, Opus compared its replies with the earlier stage's one against the other on 104 dialogue items: stage 8 won 17 to 10 with 77 ties. The drop was two or three real failures inside the noise of a single reference.