Egonyu/ateso-english-nllb
Ateso ↔ English (NLLB-200 fine-tune) — v1 · SUPERSEDED
## ⚠️ Use `Egonyu/ateso-english-nllb-v3` instead English → Ateso on this model does not produce Ateso. It produces Luganda, an unrelated Bantu language — fluently and confidently, which makes the failure easy to miss if you do not read Ateso. `` "The children are going to school." -> "Abaana bagenda ku ssomero." # Luganda "I am hungry." -> "Nnina enjala." # Luganda ``Ateso → English works on this model and is genuinely Ateso-aware. Only the reverse direction is affected.
Why it happened
The teo_Latn token does not exist in base NLLB-200, so it was added and its embedding initialised by copying the lug_Latn (Luganda) row. The model was then wrapped in LoRA targeting only q_proj, v_proj, k_proj, out_proj, fc1, fc2, with no modules_to_save.
That froze the embedding table. The Luganda seed was made untrainable and never moved across the whole training run:
torch.equal(emb[teo_id], emb[lug_id]) # True
(emb[teo_id] - emb[lug_id]).abs().max() # 0.000e+00
torch.equal(lm_head[teo_id], lm_head[lug_id]) # True (weights are tied)Since NLLB ties lm_head to the input embedding, forced_bos_token_id=teo_Latn was mathematically identical to forced_bos_token_id=lug_Latn. Ateso → English worked because the encoder learned Ateso; the decoder side was never trained.
The general lesson: if you add a new language token to a multilingual model and then fine-tune with LoRA, the new embedding is frozen unless you explicitly include it — via modules_to_save, or by unfreezing the embedding table. Training will complete, the loss will fall, and your new language will silently remain a copy of whatever you seeded it from.
Test for it directly. BLEU will not catch this — fluent output in the wrong language can score plausibly against nothing:
a = generate(text, forced_bos_token_id=new_lang_id)
b = generate(text, forced_bos_token_id=seed_lang_id)
assert a != b, "the new language token never separated from its seed"What v3 changed
Kept for the record
This model remains published because the failure is instructive and because Ateso → English still works. For anything practical, use v3.
Licence
cc-by-nc-4.0, inherited from facebook/nllb-200-distilled-600M. Non-commercial use only.
Citation
@misc{egonyu2026ateso,
title = {Ateso--English Neural Machine Translation},
author = {Egonyu, Daniel},
year = {2026},
howpublished = {\url{https://huggingface.co/Egonyu/ateso-english-nllb-v3}},
note = {Ateker Language Initiative}
}Built by Daniel Egonyu · Ateker Language Initiative
