juanquivilla commited on
Commit
9f2abdb
·
verified ·
1 Parent(s): 4424504

soup_30: composite=89.45 — see model card for benchmark deltas vs v45

Browse files
Files changed (2) hide show
  1. README.md +11 -26
  2. 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, v55)
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 v55
30
 
31
- v55 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,18 +42,16 @@ evaluation.
42
 
43
  ## Headline numbers
44
 
45
- Numbers below are at **`max_new_tokens=900`** to avoid mid-output truncation on long inputs (a 512-token cap inflates apparent deletion rate by ~3×). Use the same setting in production.
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% | **83%** |
52
- | Loops on 264 sampling-mode probes | n/a | 0 | **1** |
53
- | Filler-free on 241 long inputs | 67.2% | 68.0% | **73.4%** |
54
- | Sub-deletion >15% on 241 long inputs (max=900) | 13.3% | 13.7% | **3.7%** |
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.32**
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 v55: + 5.5K gap-filling examples (multi-number, year-context,
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:901c6b1aae01a90a2831d05a2f867c9de392dfae8aa944202959cd838bfc4235
3
  size 708984464
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6e96eeffdcdd60f881e13eb2019b339b39d1a74951446f062e7e641a82f6422e
3
  size 708984464