File size: 8,356 Bytes
f9e4c79 08c6ae0 f9e4c79 08c6ae0 f9e4c79 d7f9523 f9e4c79 d7f9523 f9e4c79 08c6ae0 f9e4c79 d7f9523 f9e4c79 d7f9523 f9e4c79 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | ---
license: apache-2.0
base_model: convaiinnovations/laya
library_name: pytorch
pipeline_tag: text-classification
tags:
- calibration
- decision-making
- typed-decisions
- non-autoregressive
- modernbert
- proper-scoring-rules
datasets:
- LocalLLaMA/typed-decisions
language:
- en
metrics:
- accuracy
- brier_score
- nll
model-index:
- name: sev
results:
- task:
type: text-classification
name: Typed decisions
dataset:
type: LocalLLaMA/typed-decisions
name: LocalLLaMA/typed-decisions
split: test
metrics:
- type: accuracy
value: 0.7885
name: Accuracy
- type: brier_score
value: 0.0495
name: Brier (vs soft targets)
- type: nll
value: 0.8581
name: NLL (vs soft targets)
---
# Sev — typed-decisions, CE-only, 1024/256
A ModernBERT-large decision model fine-tuned on `LocalLLaMA/typed-decisions` with **plain cross-entropy** against the teacher's soft targets, at the documented 1024-token context / 256-token option budget.
It is the best-performing checkpoint from the **Sev** study (*Dissecting RLCD*), where I took apart the training method behind TypeSafe's Jev and its open reproduction, Laya. The short version of that study: Laya's RL term is a noise-smoothed cross-entropy gradient, and on this benchmark plain CE matches or beats it on every proper score.
**Test-set results (2,000 decisions, 400 cases):**
| Metric | Value |
|---|---|
| Accuracy (vs hard label) | **0.7885** |
| Brier (vs soft targets) | **0.0495** |
| NLL (vs soft targets) | **0.8581** |
| Soft accuracy | 0.5236 |
| Mean confidence | 0.6444 |
| Mean target max | 0.6589 |
| Score MAE (ordinal questions) | 0.2115 |
| Fitted temperature (choice / score / noul) | 1.116 / 1.070 / 1.120 |
For reference, the `laya-typed-decisions` checkpoint reports 0.766 accuracy and 0.062 Brier; TypeSafe's published Jev 1.13.0 figure is 0.727.
## Model description
A bidirectional encoder plus a small transformer head that reads one logit per masked option marker:
```
[CLS] <type> question: <instr> [SEP] [MASK] opt0 [MASK] opt1 ... [SEP] <state> [SEP]
|
ModernBERT-large encoder (bidirectional)
|
h += type_emb(qtype)
|
2 x TransformerEncoderLayer (pre-norm)
|
gather h at [MASK] positions -> scorer MLP -> 1 logit/option
```
One input row per typed question. Question types are `choice` (pick one of K named options), `score` (ordinal), and `noul` (binary yes/no). Option count is per-row, not fixed.
- Encoder: `answerdotai/ModernBERT-large` (395M)
- Head: 2 pre-norm transformer layers, dropout 0.1
- Scorer: LayerNorm, Linear, GELU, Linear(->1)
- Total: ~421M parameters
- Sequence budget: 1024 tokens total, 256 for the question + option block
The output is a probability distribution over the row's options. For the `score` type, the expected level is `sum i * p_i`.
## Intended use
Structured, closed-set probabilistic decisions over short English text: routing, triage, classification with calibrated confidence, and ordinal rating tasks where you control the option set.
**Out of scope:** open-ended generation (this model does not generate text), option sets larger than ~255, languages other than English (the base is English; a multilingual Laya variant exists), and any use where the option wording and the state distribution differ sharply from the training workflows.
## How to use
This is a custom architecture, not a `transformers` `AutoModel`. Load it with the code from the reproduction repo:
```bash
git clone https://github.com/LakoreAI/sev
cd rlcd-reverse-engineering && uv sync
```
```python
from pathlib import Path
import torch
from huggingface_hub import snapshot_download
import sys
sys.path.insert(0, "rlcd-reverse-engineering") # or pip install -e it
from src.pipelines.infer import load_model, infer
d = snapshot_download("LakoreAI/sev")
model, cfg, tokenizer = load_model(Path(d) / "model.safetensors", torch.device("cuda"))
result = infer(
Path(d) / "model.safetensors",
state='{"task": "triage", "ticket": "customer cannot log in after password reset"}',
question='{"type": "choice", "instructions": "Which queue should this go to?",'
' "criteria": {"billing": "payment or invoice", "auth": "login or account access",'
' "network": "connectivity"}}',
)
print(result["predicted_key"], result["probabilities"])
```
`load_model` reads `model_config.json` to rebuild the architecture and `temperatures.json` to apply the fitted per-(type, K-bucket) temperature at inference, so the reported probabilities are already calibration-scaled.
## Training data
`LocalLLaMA/typed-decisions` (Apache-2.0): 1,200 train cases and 400 test cases across four workflows (agent-trace observability, customer service, invoice processing, security incidents), flattened to ~5,400 training decisions. Targets are the dataset's soft teacher distributions, not the hard labels.
## Training procedure
- Initialised from `convaiinnovations/laya`.
- Loss: soft cross-entropy against the teacher distributions only (no RL term).
- 4 epochs, effective batch 64 (micro-batch 8 x 4 accumulation on a single 24 GB GPU), AdamW, lr 2.5e-5 encoder / 1e-4 head, weight decay 0.01, cosine decay to 1e-6, gradient clipping 1.0, bf16.
- No early stopping; the final-epoch weights are evaluated.
- Post-hoc temperature fitted per (question type, option-count bucket) by NLL on a held-out 10% slice of the training cases.
## Evaluation
Full test-set breakdown by question type (2,000 decisions):
| Type | n | Accuracy | Brier | NLL | Mean conf. | Mean target max |
|---|---|---|---|---|---|---|
| choice | 600 | 0.7550 | 0.0611 | 0.9818 | 0.6194 | 0.6345 |
| score | 800 | 0.7588 | 0.0511 | 1.0331 | 0.5817 | 0.5929 |
| noul | 600 | 0.8617 | 0.0356 | 0.5009 | 0.7532 | 0.7714 |
| overall | 2000 | 0.7885 | 0.0495 | 0.8581 | 0.6444 | 0.6589 |
**A calibration caveat that matters here.** On this benchmark the gold hard label is the teacher's argmax on 98.4% of rows, so hard-label ECE is not a valid calibration measure: a model that reproduces the teacher perfectly still scores 0.326 hard-label ECE, and over-sharpening *lowers* it. The raw hard-label ECE of this checkpoint is 0.144 (0.162 after temperature). Judge calibration against the soft targets instead, with Brier and NLL above. The fitted temperatures (all > 1) are the model's own signal that the raw logits were slightly over-sharp before scaling.
## Relation to RLCD
This checkpoint is deliberately RL-free. In the accompanying study, adding Laya's RL term (a score-function estimate of a noise-smoothed proper score) did not improve accuracy and made the fitted temperature rise with the training noise scale. CE-only was at least as good on every proper score. See the linked repo for the full ablation, the estimator derivation, and the per-run result files.
## Limitations
- Single benchmark; the four workflows are synthetic and teacher-generated.
- English only.
- Option sets above ~20 options degrade, because options share a fixed token budget.
- Accuracy differences of ~1 point are within seed noise on a dataset this size; three seeds gave 0.782 +/- 0.004 for the 512-token variant.
- The base checkpoint was already fine-tuned by the Laya authors; this model is a further fine-tune on the same benchmark's train split.
## Links
- Code, configs, and per-run results: [LakoreAI/sev](https://github.com/LakoreAI/sev)
- All ablation checkpoints and metrics: [minhleduc/rlcd-e2-checkpoints](https://huggingface.co/minhleduc/rlcd-e2-checkpoints)
- Base model: [convaiinnovations/laya](https://huggingface.co/convaiinnovations/laya)
- Dataset: [LocalLLaMA/typed-decisions](https://huggingface.co/datasets/LocalLLaMA/typed-decisions)
## Citation
```bibtex
@misc{leduc2026dissectingrlcd,
title = {Dissecting RLCD: What Reinforcement Learning Does (and Doesn't) Do for Calibrated Typed Decisions},
author = {Le Duc Minh},
year = {2026},
url = {https://github.com/LakoreAI/sev}
}
```
|