guychuk commited on
Commit
dcac0c1
Β·
verified Β·
1 Parent(s): 98e8032

Add README: product/launch tone, model family + lineage, compact results

Browse files
Files changed (1) hide show
  1. README.md +190 -0
README.md ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ base_model: Qwen/Qwen3-4B-Base
4
+ library_name: pytorch
5
+ tags:
6
+ - decision-model
7
+ - system-one
8
+ - calibrated-probabilities
9
+ - typed-decisions
10
+ - jev-like
11
+ pipeline_tag: text-classification
12
+ datasets:
13
+ - stanfordnlp/snli
14
+ - nyu-mll/multi_nli
15
+ - facebook/anli
16
+ - google/boolq
17
+ - cais/mmlu
18
+ - allenai/ai2_arc
19
+ - allenai/openbookqa
20
+ - tau/commonsense_qa
21
+ - allenai/sciq
22
+ - allenai/qasc
23
+ - jeggers/logiqa2_formatted
24
+ - deepmind/aqua_rat
25
+ - openlifescienceai/medmcqa
26
+ - cua-ai/cua-s1-forms
27
+ - dwidlee/systemone-lite-general
28
+ - MagaBitmex/jev-4b-distill-data
29
+ - Zhengping/UNLI
30
+ - metaeval/ambient
31
+ ---
32
+
33
+ # typical-medium
34
+
35
+ **Typical is an open System-One decision model family, built by OzLabs.**
36
+
37
+ Give it a state β€” a support ticket, a document, a form, a log line, any text β€” a question with its
38
+ rubric, and a label set defined at runtime, and it returns a calibrated probability over those
39
+ labels plus an explicit abstain option. One forward pass, no generated text to parse, about 57 ms
40
+ per decision on an H100. Every decision is one of three typed primitives: **Choice** (categorical),
41
+ **Score** (ordinal), **Noul** (yes/no, exactly order-invariant).
42
+
43
+ `typical-medium` is **Release 1 at 4B** (checkpoint `tm1b`): the same recipe as
44
+ [`typical-small`](https://huggingface.co/OzLabs/typical-small) β€” dedicated Score and Noul heads, the
45
+ hard curriculum, 1,024-token states β€” on a larger backbone. It is the knee of capability per
46
+ millisecond in the release ladder: +11 points of JevBench standard and +11 points of MMLU-Pro
47
+ among-K over `typical-small`, at 1.25x the per-decision latency.
48
+
49
+ ## Why it's different
50
+
51
+ - **The decision is read directly from the model's own candidate-conditioned computation.** The
52
+ state and candidates are encoded once; the answer is read off that computation instead of being
53
+ sampled one token at a time.
54
+ - **The state is KV-cached**, so asking many questions about one state is cheap β€” each additional
55
+ question is a short suffix against a cache that's already built.
56
+ - **Latency is flat up to ~64 options** (57 ms at K = 2, 58 ms at K = 32); 96 ms at K = 256 β€” the
57
+ state dominates until the rendered option list does.
58
+ - **Abstention is a first-class output**, not a parsed refusal: every decision carries a calibrated
59
+ P(βˆ…) alongside the label probabilities.
60
+ - **Probabilities, not verbalized confidence.** No "I'm 80% sure" string to parse β€” an actual
61
+ calibrated number.
62
+
63
+ ## Model family
64
+
65
+ | | [`typical-small-preview`](https://huggingface.co/OzLabs/typical-small-preview) | [`typical-small`](https://huggingface.co/OzLabs/typical-small) | **`typical-medium`** |
66
+ |---|---|---|---|
67
+ | Backbone | Qwen3-1.7B-Base | Qwen3-1.7B-Base | Qwen3-4B-Base |
68
+ | Tap layer | 20 / 28 | 20 / 28 | 26 / 36 |
69
+ | Per-decision latency, K=2 (one H100) | 45 ms | 45 ms | 57 ms |
70
+ | Peak memory, K=2 | 6.4 GB | 6.4 GB | 14.6 GB |
71
+ | JevBench standard / easy / hard | .750 / 1.00 / .387 | .694 / 1.00 / .432 | .806 / 1.00 / .423 |
72
+ | MMLU-Pro among-K | .330 | .343 | .458 |
73
+ | Held-out workflow noul / score | .699 / .498 | .715 / .520 | .811 / .528 |
74
+ | Calibration (typed-decisions NLL) | 2.06 | 1.25 | **1.18** |
75
+
76
+ Full ablations and matched-baseline tables: REPORT.md Β§3af.
77
+
78
+ ## Results
79
+
80
+ | | `typical-medium` (`tm1b`) |
81
+ |---|---|
82
+ | SNLI / MNLI / BoolQ / ANLI | .909 / .861 / .843 / .544 |
83
+ | CLINC-150 / TREC-fine / HWU64 / 20NG | .847 / .414 / .769 / .588 |
84
+ | Held-out workflow: noul / score / style | .811 / .528 / .859 |
85
+ | External floor: PagerDuty (floor .792) | **.838** |
86
+ | JevBench standard / easy / hard (Brier std / hard; ECE std) | .806 / 1.00 / .423 (.30 / .77; **.09**) |
87
+
88
+ **JevBench standard, same 231 public ids, next to the open field:**
89
+
90
+ | jeff (GLiFormer 400M) | Laya (ModernBERT) | **typical-medium** | open-alternative-jev (Qwen3.5-4B) | system-one-open (Gemma E2B LoRA) |
91
+ |---|---|---|---|---|
92
+ | .750 | .694 | **.806** | .833 | .931 |
93
+
94
+ Public-subset per-item comparison on the 231 public ids; not a ranked leaderboard entry.
95
+
96
+ ## Quickstart
97
+
98
+ ```bash
99
+ huggingface-cli download OzLabs/typical-medium --include "inference/*" --local-dir typical-medium
100
+ pip install -r typical-medium/inference/requirements.txt
101
+ ```
102
+
103
+ ```python
104
+ import sys; sys.path.insert(0, "typical-medium/inference")
105
+ from typical import Typical
106
+
107
+ m = Typical.from_pretrained("OzLabs/typical-medium", device="auto")
108
+
109
+ ticket = ("Customer reports repeated 500 errors on checkout after the last deploy; "
110
+ "asking for a refund.")
111
+ m.choice(ticket, "Which team should handle this?", ["billing", "infra", "support", "security"])
112
+ m.score(ticket, "How severe is this ticket?", ["1", "2", "3", "4"])
113
+ m.noul(ticket, "Does this ticket violate the refund-abuse policy (3+ refunds in 30 days)?")
114
+ ```
115
+
116
+ Verified: this exact sequence (download, install, run) works on CPU (checked against `typical-small`'s
117
+ identical inference package; `typical-medium` uses the same code path on a larger backbone).
118
+
119
+ `choice`/`score` return `{label: probability, ...}` plus `p_null`; `noul` returns `P(yes)`. `decide`
120
+ mirrors the internal `PCDMDecider.decide` exactly, including the runtime block (latency, `p_null`,
121
+ truncation flags) β€” see `inference/README.md` for the full API and `inference/example.py` for a
122
+ runnable script.
123
+
124
+ ## Training recipe
125
+
126
+ - **Data mix** E .40 / K .15 / W .35 / U .10 of every batch (evidence, knowledge-MCQ, rubric-
127
+ conditioned workflow, soft-target uncertainty), plus 15–20% null augmentation on W rows
128
+ (`--null_aug W:0.20`) so the model learns to abstain, not just choose.
129
+ - **1,024-token decision states**, so policy documents and multi-hop states are in-distribution.
130
+ - **Typed heads:** Score is K-way Choice trained with ordinal-smoothed targets (Ο„ = 0.7, zero head
131
+ code); Noul is a dedicated Bernoulli head, routed per row β€” only rows whose candidates are exactly
132
+ `{yes, no}` use it, every other 2-way set scores as ordinary Choice.
133
+ - **12,000 steps, effective batch 64** (`bs 64`, `grad_accum 4`), LoRA rank 16 on the top 8 layers of
134
+ a 26-of-36-layer truncated backbone.
135
+ - **Held-out by construction:** one rubric style and three whole domains of the hard curriculum
136
+ (`data_wh`), plus temporal/numeric/probability/trade-off composition (level 7), are eval-only β€”
137
+ never trained on.
138
+
139
+ **Data sources and licenses:**
140
+
141
+ | Source | Role | License |
142
+ |---|---|---|
143
+ | SNLI, MultiNLI, ANLI, BoolQ, MMLU-aux, ARC, OpenBookQA, CommonsenseQA, SciQ, QASC, LogiQA2, AQuA-RAT, MedMCQA | evidence + knowledge-MCQ | permissive research licenses (CC-BY-SA / MIT / Apache-2.0 family) |
144
+ | `cua-ai/cua-s1-forms` | workflow (GUI-form synth) | MIT |
145
+ | `dwidlee/systemone-lite-general` | workflow (rule-labeled typed decisions) | MIT |
146
+ | `MagaBitmex/jev-4b-distill-data` | workflow (programmatic gold) | Apache-2.0 |
147
+ | in-repo rubric-conditioned generator (`data_wf`, `data_wf_long`) | workflow | generated, no external license |
148
+ | in-repo rule-engine generator (`data_wh`, DecisionMix v2) | hard curriculum | generated, no external license |
149
+ | `Zhengping/UNLI` (validation split) | soft-target uncertainty | MIT |
150
+ | `metaeval/ambient` (ambiguous rows, trained on) | soft-target uncertainty | **license undeclared on its HF card β€” flagged, not asserted** |
151
+ | `metaeval/chaos-mnli-ambiguity` (eval-only, never trained on) | soft-target uncertainty | **license undeclared on its HF card β€” flagged, not asserted** |
152
+
153
+ Evaluation-only, never trained on: JevBench (public subset), `typed-decisions`, PagerDuty, tree-choice,
154
+ jevlogs (Loghub research license, caveated), Mind2Web.
155
+
156
+ ## Limitations
157
+
158
+ - Hard tier is .423 (chance .336, SE β‰ˆ .045 at n = 111) β€” the least reliable tier; the open field's
159
+ best is .73. The long-policy slice specifically is .21 β€” the weakest single family.
160
+ - TREC-fine regresses 10 points vs. `ladder_4b`, the same backbone trained without typed heads or
161
+ DecisionMix v2 (K = 50 fine-grained topics) β€” the one clear regression at this size.
162
+ - Held-out rubric styles and Noul accuracy give back a few points vs. that same untyped 4B baseline,
163
+ in exchange for the calibration and external-floor gains above.
164
+ - Inference code is included in this repo; training code release to follow.
165
+
166
+ ## License
167
+
168
+ Apache-2.0 (backbone `Qwen/Qwen3-4B-Base` is Apache-2.0; this release's weights are a LoRA adapter
169
+ plus small Choice/Score/Noul heads over that backbone). Training-data licenses above; JevBench
170
+ numbers are a public-subset run against `fstandhartinger/jevbench` v1.2.1, not a submitted or ranked
171
+ leaderboard entry.
172
+
173
+ ## Files in this repository
174
+
175
+ - `best.pt` β€” this checkpoint (`tm1b`).
176
+ - `results.json` / `eval_wf_full.json` / `probe_results.json` / `jevbench_summary.json` β€” full eval
177
+ suite, post-hoc held-out/external eval, probe results, JevBench run summary.
178
+ - `inference/` β€” the self-contained `Typical` inference package (see Quickstart above).
179
+ - `MANIFEST.json` β€” checksum + provenance record for this release.
180
+
181
+ ## Lineage
182
+
183
+ [`typical-small-preview`](https://huggingface.co/OzLabs/typical-small-preview) (Release 0) β†’
184
+ [`typical-small`](https://huggingface.co/OzLabs/typical-small) (Release 1 at 1.7B) β†’
185
+ **`typical-medium`** (Release 1 at 4B, this repo).
186
+
187
+ Coming: `typical-large` β€” a 14B ladder checkpoint scores JevBench .875/.468 (standard/hard), but
188
+ probability calibration at that size is not yet fixed (Β§3ab). Trained, not released.
189
+
190
+ Typical is built by [OzLabs](https://huggingface.co/OzLabs).