soup_30: composite=89.45 — see model card for benchmark deltas vs v45
Browse files- README.md +11 -26
- model.safetensors +1 -1
README.md
CHANGED
|
@@ -18,7 +18,7 @@ datasets:
|
|
| 18 |
- juanquivilla/sotto-transcript-cleanup
|
| 19 |
---
|
| 20 |
|
| 21 |
-
# SottoASR Transcript Cleanup — LFM2.5-350M (Full Precision,
|
| 22 |
|
| 23 |
[sottoasr.app](https://sottoasr.app) · [MLX 5-bit (recommended)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit) · [MLX 4-bit (smaller)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-4bit) · [Training Dataset](https://huggingface.co/datasets/juanquivilla/sotto-transcript-cleanup)
|
| 24 |
|
|
@@ -26,9 +26,9 @@ datasets:
|
|
| 26 |
|
| 27 |
Full-precision bf16 fine-tune of [LiquidAI/LFM2.5-350M-Base](https://huggingface.co/LiquidAI/LFM2.5-350M-Base) for on-device speech-to-text transcript cleanup. This is the **training artifact** — for on-device deployment on Apple Silicon, use the [5-bit MLX variant](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit).
|
| 28 |
|
| 29 |
-
## What's new in
|
| 30 |
|
| 31 |
-
|
| 32 |
|
| 33 |
- **Multi-number sentences** ("the score was 21 to 14")
|
| 34 |
- **Year-with-context drift** ("twenty eighteen and twenty twenty seven" → preserve both years)
|
|
@@ -42,18 +42,16 @@ evaluation.
|
|
| 42 |
|
| 43 |
## Headline numbers
|
| 44 |
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
| Capability | v36 | v45 | **v55 (this model)** |
|
| 48 |
|---|---:|---:|---:|
|
| 49 |
| Number accuracy (171-sample stratified val) | 12.9% | 95.9% | **96.5%** |
|
| 50 |
| 66-case adversarial benchmark (greedy) | n/a | 76% | **86%** |
|
| 51 |
-
| 66-case adversarial benchmark (temp 0.7 × 4) | n/a | 77% | **
|
| 52 |
-
| Loops on 264 sampling-mode probes | n/a | 0 | **
|
| 53 |
-
| Filler-free on 241 long inputs | 67.2% | 68.0% | **73.
|
| 54 |
-
| Sub-deletion >15% on 241 long inputs
|
| 55 |
|
| 56 |
-
Composite score (0.35×num + 0.30×bench_greedy + 0.15×bench_sample + 0.10×filler_long + 0.05×(1-sub15) + 0.05×(1-loops/N)): **89.
|
| 57 |
|
| 58 |
## Training pipeline
|
| 59 |
|
|
@@ -63,7 +61,7 @@ LiquidAI/LFM2.5-350M-Base
|
|
| 63 |
→ GRPO v36: full FT with substantive-deletion-aware reward
|
| 64 |
→ SFT v39: + 12.7K augmented number examples (ITN)
|
| 65 |
→ GRPO v40-v45: chained refinement, fixed reward + amplified filler penalty
|
| 66 |
-
→ SFT/GRPO
|
| 67 |
disconnected, duplicates, long-form), Qwen-audited and cleaned
|
| 68 |
```
|
| 69 |
|
|
@@ -84,26 +82,13 @@ prompt = f"### Input:\n{text}\n\n### Output:\n"
|
|
| 84 |
|
| 85 |
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
| 86 |
with torch.no_grad():
|
| 87 |
-
out = model.generate(
|
| 88 |
-
**inputs,
|
| 89 |
-
max_new_tokens=max(512, int(len(text.split()) * 1.5)), # ≥1.5× input word count
|
| 90 |
-
do_sample=False,
|
| 91 |
-
repetition_penalty=1.05, # LFM2.5 official default
|
| 92 |
-
)
|
| 93 |
output = tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
|
| 94 |
if "###" in output:
|
| 95 |
output = output[:output.index("###")]
|
| 96 |
print(output.strip())
|
| 97 |
```
|
| 98 |
|
| 99 |
-
### Inference recommendations
|
| 100 |
-
|
| 101 |
-
Use these generation settings to match the production deployment:
|
| 102 |
-
|
| 103 |
-
- **`repetition_penalty=1.05`** — LFM2.5's official default. **Critical** for long inputs: prevents the rare voicemail-style 5-gram loops that can occur with `repetition_penalty=1.0`.
|
| 104 |
-
- **`max_new_tokens >= 1.5 × input_word_count`** (or 600 minimum) — long inputs (>200 words) need headroom; truncating mid-output looks like content deletion.
|
| 105 |
-
- **`do_sample=False`** (greedy) for deterministic output. If sampling is needed, use `temperature=0.1, top_k=50`.
|
| 106 |
-
|
| 107 |
## All Variants
|
| 108 |
|
| 109 |
| Variant | Size | Use Case |
|
|
|
|
| 18 |
- juanquivilla/sotto-transcript-cleanup
|
| 19 |
---
|
| 20 |
|
| 21 |
+
# SottoASR Transcript Cleanup — LFM2.5-350M (Full Precision, soup_30)
|
| 22 |
|
| 23 |
[sottoasr.app](https://sottoasr.app) · [MLX 5-bit (recommended)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit) · [MLX 4-bit (smaller)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-4bit) · [Training Dataset](https://huggingface.co/datasets/juanquivilla/sotto-transcript-cleanup)
|
| 24 |
|
|
|
|
| 26 |
|
| 27 |
Full-precision bf16 fine-tune of [LiquidAI/LFM2.5-350M-Base](https://huggingface.co/LiquidAI/LFM2.5-350M-Base) for on-device speech-to-text transcript cleanup. This is the **training artifact** — for on-device deployment on Apple Silicon, use the [5-bit MLX variant](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit).
|
| 28 |
|
| 29 |
+
## What's new in soup_30
|
| 30 |
|
| 31 |
+
soup_30 extends v45 with targeted training data covering five failure modes observed on real production transcripts:
|
| 32 |
|
| 33 |
- **Multi-number sentences** ("the score was 21 to 14")
|
| 34 |
- **Year-with-context drift** ("twenty eighteen and twenty twenty seven" → preserve both years)
|
|
|
|
| 42 |
|
| 43 |
## Headline numbers
|
| 44 |
|
| 45 |
+
| Capability | v36 | v45 | **soup_30 (this model)** |
|
|
|
|
|
|
|
| 46 |
|---|---:|---:|---:|
|
| 47 |
| Number accuracy (171-sample stratified val) | 12.9% | 95.9% | **96.5%** |
|
| 48 |
| 66-case adversarial benchmark (greedy) | n/a | 76% | **86%** |
|
| 49 |
+
| 66-case adversarial benchmark (temp 0.7 × 4) | n/a | 77% | **85%** |
|
| 50 |
+
| Loops on 264 sampling-mode probes | n/a | 0 | **2** |
|
| 51 |
+
| Filler-free on 241 long inputs | 67.2% | 68.0% | **73.0%** |
|
| 52 |
+
| Sub-deletion >15% on 241 long inputs | 13.3% | 13.7% | **4.6%** |
|
| 53 |
|
| 54 |
+
Composite score (0.35×num + 0.30×bench_greedy + 0.15×bench_sample + 0.10×filler_long + 0.05×(1-sub15) + 0.05×(1-loops/N)): **89.45**
|
| 55 |
|
| 56 |
## Training pipeline
|
| 57 |
|
|
|
|
| 61 |
→ GRPO v36: full FT with substantive-deletion-aware reward
|
| 62 |
→ SFT v39: + 12.7K augmented number examples (ITN)
|
| 63 |
→ GRPO v40-v45: chained refinement, fixed reward + amplified filler penalty
|
| 64 |
+
→ SFT/GRPO soup_30: + 5.5K gap-filling examples (multi-number, year-context,
|
| 65 |
disconnected, duplicates, long-form), Qwen-audited and cleaned
|
| 66 |
```
|
| 67 |
|
|
|
|
| 82 |
|
| 83 |
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
| 84 |
with torch.no_grad():
|
| 85 |
+
out = model.generate(**inputs, max_new_tokens=512, do_sample=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
output = tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
|
| 87 |
if "###" in output:
|
| 88 |
output = output[:output.index("###")]
|
| 89 |
print(output.strip())
|
| 90 |
```
|
| 91 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
## All Variants
|
| 93 |
|
| 94 |
| Variant | Size | Use Case |
|
model.safetensors
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 708984464
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6e96eeffdcdd60f881e13eb2019b339b39d1a74951446f062e7e641a82f6422e
|
| 3 |
size 708984464
|