# Real-model setup — DistilGPT-2 (82M) on Stanford Human Preferences ## Model and objective The policy is `distilgpt2` (**82M parameters**) and the reference is a frozen copy of the same checkpoint. The true DPO objective uses `β=0.1`: ```text loss = −log sigmoid(β[(log π(yw|x)−log πref(yw|x)) −(log π(yl|x)−log πref(yl|x))]). ``` Log probabilities are summed over completion tokens only; prompt tokens are masked. Every local update uses batch size 4 and learning rate `2e−5` unless a decaying schedule is stated on the claim page. ## Data and clients Pairs are streamed from `stanfordnlp/SHP`, ordered by the recorded preference label, tokenized jointly to 128 tokens, and split by domain into five non-IID clients: `askacademia_train`, `askanthropology_train`, `askbaking_train`, `askcarguys_train`, and `askculinary_train`, 90 pairs each. The domain split is the source of the client heterogeneity used in the bounds. ## Independent controls | stream | seed | isolated quantity | | --- | ---: | --- | | client batch order | `777+i` | fixed data order within client i | | client sampling | `10000+s` | participation variance across runs | | stale-delay draws | `50000+s` | asynchronous delay variation | With full participation, all client batch streams are fixed and the three seeds return final loss `0.6318` to four decimals. The claim pages report the exact number of clients, pairs, rounds, local steps, denominators, and seed counts for each experiment.