Configuration
Table | |
|---|
| PEFT type | LoRA |
| Target modules | lm_head only |
| Rank (r) | 256 |
| Alpha | 256 |
| Dropout | 0.05 |
| Trainable params | about 842 MB in BF16 |
| Steps / epochs | 434 / 2 |
| Learning rate | 5.45e-05 (auto-scaled) |
| Final train loss | 2.065 |
| Preference pairs | 15,000 (12,000 lexical, 3,000 typography) |
Targeting lm_head alone is inherited from V1 and from the Antislop paper's
lm_head-only precedent on Llama-3.3-70B. FTPO adjusts final-token logits, so the output
projection is where the preference lives, and constraining training to it keeps the rest of
the model's capabilities intact. The same constraint caps achievable suppression, and — see
the merged card — it is also why the typography results are mixed.
Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base_id = "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16"
model = AutoModelForCausalLM.from_pretrained(
base_id, torch_dtype="bfloat16", device_map="auto", trust_remote_code=True
)
model = PeftModel.from_pretrained(model, "thoughtworks/Nemotron-3.5-30B-A3B-Antislop-FTPO-V2-LoRA")
model = model.merge_and_unload()
tok = AutoTokenizer.from_pretrained("thoughtworks/Nemotron-3.5-30B-A3B-Antislop-FTPO-V2-LoRA")
The tokenizer, chat template, and special-token map bundled here are byte-identical to the
base model's, included so the adapter is self-sufficient.
Merging without 66 GB of RAM
Because the adapter targets lm_head only, exactly one tensor changes. You do not need to
load the whole model: read the shard holding lm_head.weight, add (B @ A) * (alpha / r),
and copy or hardlink the rest unchanged. Accumulate the delta in float32 before casting
back — the per-element deltas are around 1e-05 and adding them in bf16 rounds most of them
to zero, silently discarding the fine-tune. A reference implementation is in the
project repo.
Headline result
Measured with the merged checkpoint on 952 held-out prompts across six domains, Antislop
sampler off:
Table with columns: Metric, Baseline, FTPO V2| Metric | Baseline | FTPO V2 |
|---|
| Banlist suppression (overall) | 0% | 43.21% |
| Banlist suppression (creative slice, n=388) | 0% | 67.78% |
| MMLU (600 q) | 0.7583 | 0.7567 |
| GSM8K (250 q) | 0.9040 | 0.9160 |
| Lexical diversity (index, baseline=100) | 100.00 | 99.98 |
Full tables, per-domain results, and the typography findings are in the
merged model card.
What the adapter suppresses
The 8,033-pattern banlist (4,342 n-grams + 3,990 slop phrases, plus typography regexes) is
measured from this model's own output against a human baseline, not hand-written. It is
1.9x the size of V1's 4,267.
Suppression by domain, sampler off:
Table with columns: Domain, n, Baseline /100k, V2 /100k, Suppression| Domain | n | Baseline /100k | V2 /100k | Suppression |
|---|
| creative | 388 | 218.13 | 70.29 | 67.78% |
| real_user | 275 | 199.10 | 142.56 | 28.40% |
| instruction_following | 71 | 49.80 | 36.00 | 27.71% |
Known limitations
Carried over from the merged card, because they matter before you use this:
- Unspaced em dashes get worse, not better (38.9x human to 52.3x). Features with an
exact substitute are learnable; features needing a structural rewrite are not.
- The banlist contains prompt echoes (character names, code tokens, non-English function
words) which understate true suppression.
- No writing-quality judge was run for V2.
Not included
The frozen FTPO reference adapter used during training (ref/) and the optimizer state are
not published here. Both are training-time artifacts with no inference use.
License
OpenMDW-1.1, matching NVIDIA's public Nemotron 3.5
Lightning releases. The Antislop framework is MIT-licensed.
Citation
The method was published at ICLR 2026:
@inproceedings{paech2026antislop,
title = {Antislop: A Comprehensive Framework for Identifying and Eliminating
Repetitive Patterns in Language Models},
author = {Paech, Samuel and Roush, Allen and Goldfeder, Judah and Shwartz-Ziv, Ravid},
booktitle = {The Fourteenth International Conference on Learning Representations},
year = {2026},
url = {https://openreview.net/forum?id=gLcyM1khyp},
eprint = {2510.15061},
archivePrefix = {arXiv},
primaryClass = {cs.CL}
}