tedunderwood commited on
Commit
3f00653
·
verified ·
1 Parent(s): dabf85c

Add model card

Browse files
Files changed (1) hide show
  1. README.md +237 -0
README.md CHANGED
@@ -1,3 +1,240 @@
1
  ---
2
  license: mit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: mit
3
+ base_model: microsoft/deberta-v3-large
4
+ library_name: transformers
5
+ language: en
6
+ pipeline_tag: text-classification
7
+ tags:
8
+ - digital-humanities
9
+ - historical-text
10
+ - ai-text-detection
11
+ - deberta-v3
12
+ - chronologic
13
+ metrics:
14
+ - accuracy
15
+ - f1
16
+ - roc_auc
17
+ widget:
18
+ - text: "One evening of late summer, before the nineteenth century had reached one-third of its span, a young man and woman, the latter carrying a child, were approaching the large village of Weydon-Priors, in Upper Wessex, on foot."
19
+ example_title: "Authentic (Hardy, 1886)"
20
+ - text: "The fog clung to the cobblestones like a shroud, and I could not shake the feeling that the very gaslights were watching my every step as I hurried toward the old manor."
21
+ example_title: "Pastiche"
22
+ model-index:
23
+ - name: chronologic-authenticity-deberta
24
+ results:
25
+ - task:
26
+ type: text-classification
27
+ name: Authentic period prose vs. LLM imitation
28
+ dataset:
29
+ type: chronologic-authenticity-test
30
+ name: Held-out test split (grouped by volume and author)
31
+ metrics:
32
+ - type: accuracy
33
+ value: 0.881
34
+ - type: f1
35
+ value: 0.875
36
+ - type: roc_auc
37
+ value: 0.941
38
+ - task:
39
+ type: text-classification
40
+ name: Authentic period prose vs. LLM imitation
41
+ dataset:
42
+ type: chronologic-authenticity-holdout
43
+ name: Cross-generator holdout (5 unseen models, length-matched)
44
+ metrics:
45
+ - type: accuracy
46
+ value: 0.901
47
+ - type: f1
48
+ value: 0.901
49
+ - type: roc_auc
50
+ value: 0.964
51
  ---
52
+
53
+ # chronologic-authenticity-deberta
54
+
55
+ A DeBERTa-v3-large classifier that separates authentic English prose from 1831–1930
56
+ from language-model imitation of it. It is one of the two style instruments in the
57
+ [Chronologic-EN](https://github.com/Historical-AI-Lab/Chronologic-EN) benchmark.
58
+ The companion model is
59
+ [chronologic-date-deberta](https://huggingface.co/chronologic/chronologic-date-deberta).
60
+
61
+ **What the output means.** The model has a single logit. `sigmoid(logit)` is
62
+ P(synthetic), the probability that the passage was written by a language model. A low
63
+ score means the passage reads as genuine period prose. A high score means it reads as
64
+ machine imitation. The inference widget shows this as the `synthetic` label.
65
+
66
+ ## Intended use and out-of-scope use
67
+
68
+ This model is a **model-level benchmark instrument**. It measures how far a language
69
+ model's answers, taken together, sit from matched authentic prose. It is **not** a
70
+ passage-level AI-text detector. Don't use it to decide whether a single document, essay
71
+ or submission was machine-written. Single-passage scores are noisy. It flags about 9% of
72
+ genuine period prose as synthetic in some collections. And single-passage scoring is
73
+ exactly where fine-tuned models slip through (see Limitations).
74
+
75
+ **Raw outputs are not Chronologic scores.** The benchmark never reads this probability
76
+ as a verdict. It turns the probability into a percentile against a reference corpus of
77
+ authentic passages, and that step needs the code in the GitHub repository and the scored
78
+ reference corpus (the `CHRONOLOGIC_DATA` directory). A number you compute from this
79
+ model alone can't be compared with published Authenticity Fidelity scores.
80
+
81
+ ## How the benchmark uses it
82
+
83
+ Each answer's detector output is converted to a percentile among authentic passages
84
+ from within ±10 years of the question's target date, in the same length bin, scored by
85
+ the same frozen model. A model writing indistinguishably from period prose would
86
+ produce uniform percentiles. Authenticity Fidelity (0–100) is the mean percentile,
87
+ rescaled against the value that resampled authentic passages themselves produce
88
+ (a pseudo-model baseline). So 100 means indistinguishable from genuine prose of the
89
+ target period.
90
+
91
+ ## Training data
92
+
93
+ - **Positives:** passages of English prose published 1831–1930, drawn from the same
94
+ volume roster as [chronologic-date-deberta](https://huggingface.co/chronologic/chronologic-date-deberta),
95
+ whose card describes the sources (IDI, COHA, the Chicago Novel Corpus and others).
96
+ - **Negatives** are elicited *from the positives themselves*, so topic and content stay
97
+ roughly constant and style carries the signal. There are five elicitation modalities:
98
+ - 40% infill of a gap between real bookending sentences
99
+ - 20% continuation of a real passage
100
+ - 10% paraphrase
101
+ - 20% generation constrained by a title, a date and a one-sentence summary
102
+ - 10% few-shot imitation
103
+ - The pool holds 29,681 newly elicited generations. It also reuses earlier infill
104
+ generations and adds generations from Talkie, a model trained only on pre-1931 text,
105
+ run locally. Generators come from a deliberately diverse set of model families,
106
+ including base models.
107
+ - **Normalization.** Both classes go through the same typography folding (quotes,
108
+ dashes, whitespace), after side-specific cleaning: OCR repair on the historical side,
109
+ and Markdown/JSON stripping on the generated side. Without this the classifier learns
110
+ typography rather than style.
111
+ - **Length-matched.** A classifier given passage length alone scores 0.4875, which is
112
+ chance.
113
+ - **Size:** 58,006 passages, 29,003 per class. The splits are 46,644 train, 5,462
114
+ validation and 5,900 test, grouped by source volume and by author.
115
+ - **Cross-generator holdout.** Five models were held out of all three splits before
116
+ training: `gemini-3.1-pro-preview`, `gemma-4-31b-it`, `cohere/command-a`,
117
+ `amazon/nova-pro-v1` and `openai/gpt-5.6-sol`. Of their 1,854 frozen generations,
118
+ 1,766 survive length-matching and are paired with 1,766 authentic passages (n = 3,532).
119
+ Three of the five come from families absent from training entirely. So the transfer
120
+ claim is "held-out models, mostly held-out families".
121
+ - The benchmark's reserved source volumes are excluded from training.
122
+ - The training text is not redistributed, because some sources are still in copyright.
123
+
124
+ ## Training procedure
125
+
126
+ - `microsoft/deberta-v3-large` with `num_labels=1` and `BCEWithLogitsLoss`. It is a
127
+ one-logit binary classifier, not a regressor.
128
+ - 3 epochs, batch size 32, learning rate 2e-5, weight decay 0.01, warmup ratio 0.1,
129
+ max length 256 tokens.
130
+ - The checkpoint was kept at epoch 2 by validation accuracy (val accuracy 0.876, AUROC
131
+ 0.936).
132
+
133
+ ## Evaluation
134
+
135
+ | Evaluation | n | Accuracy | F1 | AUROC |
136
+ |---|---|---|---|---|
137
+ | Held-out test split | 5,900 | 0.881 | 0.875 | 0.941 |
138
+ | Cross-generator holdout, length-matched | 3,532 | 0.901 | 0.901 | 0.964 |
139
+
140
+ Accuracy on the test split's negatives, by elicitation modality:
141
+
142
+ | Modality | n | Accuracy |
143
+ |---|---|---|
144
+ | Constrained generation | 777 | 0.988 |
145
+ | Infill | 1,140 | 0.890 |
146
+ | Few-shot | 210 | 0.871 |
147
+ | Paraphrase | 304 | 0.694 |
148
+ | **Continuation** | 486 | **0.586** |
149
+
150
+ Accuracy on the test split's negatives, for selected generator families:
151
+
152
+ | Family | n | Accuracy |
153
+ |---|---|---|
154
+ | openai | 320 | 0.741 |
155
+ | meta-llama | 203 | 0.660 |
156
+ | **talkie** | 97 | **0.227** |
157
+ | **nousresearch** | 35 | **0.114** |
158
+
159
+ A check that the detector is not reading vocabulary coverage instead of style: the
160
+ within-class rank correlation between out-of-vocabulary rate and P(synthetic) is near
161
+ zero (ρ = −0.06 and −0.12).
162
+
163
+ ## Limitations and biases
164
+
165
+ - **Continuation and paraphrase are hard.** The detector is much better at recognising
166
+ text written to a prompt than text that continues or rewrites a real passage. The
167
+ headline accuracy reflects the modality mix of the training negatives.
168
+ - **Models trained on period text slip through.** Talkie, which is trained only on
169
+ pre-1931 text, is caught 23% of the time, and NousResearch fine-tunes 11% of the time
170
+ (n = 35). Per-passage detection is exactly where such models evade it.
171
+ - **False positives on genuine prose.** About 9% of authentic passages are flagged as
172
+ synthetic in the two large IDI collections, and 2–6% in the smaller COHA and fiction
173
+ samples.
174
+ - **Scope.** The model is trained on English prose from 1831–1930 and passages of
175
+ benchmark-answer length. Outside that period, language or length range its outputs
176
+ have not been validated.
177
+ - **Typography.** The training text was normalized. Unnormalized input (curly quotes,
178
+ em-dashes, line breaks) is out of distribution. Normalize first (see Usage).
179
+
180
+ ## A note on Goodhart's law
181
+
182
+ Publishing the judges makes them possible to train against. Any model trained, tuned,
183
+ RL'd or selected against these instruments, or against models derived from them, no
184
+ longer has valid Chronologic style scores. If you report Chronologic style scores for
185
+ such a model, say that it was optimized against the judges.
186
+
187
+ ## Usage
188
+
189
+ **(a) Pipeline.** Quick inspection only; this skips the normalization the model was
190
+ trained with.
191
+
192
+ ```python
193
+ from transformers import pipeline
194
+ clf = pipeline("text-classification", model="chronologic/chronologic-authenticity-deberta")
195
+ clf("It was a dark and stormy night; the rain fell in torrents.")
196
+ # [{'label': 'synthetic', 'score': ...}] score = P(synthetic)
197
+ ```
198
+
199
+ **(b) Explicit code.** Normalize first, using `normalize_typography` from
200
+ `stylejudge/normalize.py` in the [GitHub repository](https://github.com/Historical-AI-Lab/Chronologic-EN)
201
+ (standard library only):
202
+
203
+ ```python
204
+ import sys, torch
205
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
206
+
207
+ sys.path.insert(0, "Chronologic-EN/stylejudge") # path to your clone
208
+ from normalize import normalize_typography
209
+
210
+ repo = "chronologic/chronologic-authenticity-deberta"
211
+ tok = AutoTokenizer.from_pretrained(repo)
212
+ model = AutoModelForSequenceClassification.from_pretrained(repo).eval()
213
+
214
+ texts = [normalize_typography(t) for t in ["...your passages..."]]
215
+ enc = tok(texts, padding=True, truncation=True, max_length=256, return_tensors="pt")
216
+ with torch.no_grad():
217
+ p_synthetic = torch.sigmoid(model(**enc).logits.squeeze(-1))
218
+ ```
219
+
220
+ **(c) Benchmark scoring.** For real Chronologic scores, use `stylejudge/score_style.py`
221
+ (or the full `modelasjudge/run_pipeline.py`) from the GitHub repository. These apply the
222
+ percentile layer against the reference corpus.
223
+
224
+ ## Citation
225
+
226
+ Preprint forthcoming.
227
+
228
+ ```bibtex
229
+ @misc{chronologic2026,
230
+ title = {Chronologic-EN: Measuring the Ability to Represent the Past},
231
+ author = {Underwood, Ted and Qiu, Ziliang and Griebel, Sarah and
232
+ Nelson, Laura K. and Roland, Teddy and Shang, Wenyi and
233
+ Wilkens, Matthew},
234
+ year = {2026}
235
+ }
236
+ ```
237
+
238
+ ## Contact
239
+
240
+ Ted Underwood, University of Illinois Urbana-Champaign, tunder@illinois.edu.