Otto Score reaches 99.0% MNIST / 69.99% CIFAR-10 (ensemble beam-search). Read the August status report →
| Finding | Evidence |
|---|---|
| m1t is a per-member flag, never a global — the model file now carries the concrete maj1-half per member (v9 format). Internal sentinels (-2 auto) are hard-rejected on export. | model.otto v9: import == training, 97.82% MNIST zero-gap (was 86.54% — the import silently fell back to ki_default_half=107 while members trained with m1t=105) |
| m1t hybrid (mixing 103/105/107 thresholds) is refuted — file_eval-based mixing does NOT beat single-m1t pools; the 18% vote divergence is noise, not complement. | Hybrid 92.26–92.39% < single 105-only 92.84% (Fashion, H196); best-of-3 extract 92.81% at 125 members (bloat) |
| H-scaling peaks at H=392 (2×KI_NC) — more neurons beyond 392 DILUTE the ensemble; H512/H588/H784 are dropped. | Shared 12-member set: H392 92.32% > H588 92.04% > H784 91.95% (Fashion-OT8, --max 12 --eff) |
| Beam results are thread-count deterministic — cmp_exp tiebreak (lowest member/slot index) fixed the timing-dependent expansion order. | 12 vs 16 threads: identical eval (91.69% H196-BV8; 92.27% H392-OT8, 3× repeat) |
| W0 (Otto) beats Bit-Voting by ~0.4pp at equal H; H392-OT8 is the current Fashion sweet spot. | OT8 92.32% vs BV16 91.96% (H392, --max 12 --eff); --filter-bv measured neutral |
| Search precision: OP17 (fixed-point) is the binding constraint, NOT the counter width — int64 vs int32 width makes 0.00pp; the beam non-monotonicity (wider beam = worse) is OP17-inherent. | int64-OP17 == int32-OP17 == 90.91% greedy (BV8, 2026-08-25); int64-OP17 beam 10→20→30 = 91.68→91.49→91.47 (tips), int64-OP24 monotone 91.51→91.76→91.78; filter closes the gap (91.77 ≈ 91.76) |
| Training logit is now DRAM-native — LUT instead of float log() (PROMOTED 2026-08-28): the int64 LUT logit (65535×8B, ln(x)·2^40) is the STANDARD trainer — the SINGLE implementation. Float-only training was tested and brought nothing; the float path is archived. | Full H196 sweep: 0.539 s/member ≈ float (0.533); merge FIXED vs float = 0.00pp on 6 configs; score bytes identical (0/809863 diff) |
| More epochs keep paying — the training curve saturates at EP16 (BV8, H196): EP13 beats EP10 everywhere; the 16→19 gain collapses to +0.03pp (noise). **EP16 is the new BV standard (92.24%).** | --max 12 --eff (beam30, full pool): EP7 91.47% → EP10 91.85% → EP13 92.04% → EP16 92.24% → EP19 92.27%; training is linear (~9 min/EP); BV-EP16 closes the W0 gap to OT (0.18pp) |
| More epochs homogenize the member pool — the per-member eval spread shrinks and plateaus (span 31.86 at EP7 → ~29.85 from EP10); the weakest seeds rise +1.9pp while the top stays stable. | seed-sort max/min: EP7 87.95/56.09 → EP10+ 87.84-87.94/~58.0; per-member eval EP7 vs EP19 correlates r=0.9876; the biggest movers (+6pp) are all dog:log8 members |
| Filter note: eval gt66% is OT-specific — it helps OT (compact W0 information) but HURTS Bit-Voting (~0.2-0.25pp); BV must use the full pool (gt0%). | BV EP13: gt0% 91.91-92.22% vs gt66% 91.69-92.00%; OT: gt66% was the 92.32% best (H392) |
--beam 30 --max 12 --eff --filter m1th eq 105 --filter eval gt 66% → 92.32% Fashion (H392-OT8, 12 members).
Production default: --max 12 --eff drops the unproductive member mass.
| Report | Key result | Breakthrough |
|---|---|---|
| Fashion-MNIST 🆕 | 92.96% ceiling; 88.7–92.96% basin across all search strategies | Beam 20 --max + filter eval gt 20% → 92.96%; 221-member sweep in ~1 min |
| August 2026 | 66.88% beam-selected (M1-FLT32); IFC end-to-end 66.36% | Precision is the feature (float32 drift refuted); .ens v12/v13; IFC v7 heterogeneous ensembles |
| July 2026 | 64.4% CIFAR-10 (H=1024); 69.99% ensemble beam-search | Target-init invariance; 60% barrier; decoupled train/merge workflow |
| Otto Score | 98.1% MNIST / 92.96% Fashion / 64.4% CIFAR-10 | Frozen W0 + MAJ1; thermometer encoding; bit-density vs Bit-Voting |
| Bit-Voting Baseline | Linear floor: 91.4% MNIST, 88.9% Fashion, 55.2% CIFAR-10 | W0 = critical nonlinear ingredient (4–9pp); bit-density trade-off; IFC inference 14.7× faster |
Abstract
Every previous approach treated the MAJ1 output (uint32) as a number — comparing it as a uint32 or treating it as a scalar. All failed because the information is in the pattern of bits, not in the numeric value.
The Otto Score treats each of the 32 MAJ1 bits as an independent feature. For each class, neuron, and bit-position, it counts "how often is this bit = 1 for this class?" → Laplace-smoothed log-odds → Bayes log-Score. One pass of counting: 86.6%. No training, no float, no AdamW.
Iterative target-tuning (20 passes): 96.4%. Each iteration corrects log-odds for misclassified samples — a Perceptron-style correction in log-odds space. Still pure &|~ + int32. Beats AdamW (95.8%) with 0.6pp margin — the first DRAM-native path to 96%.
Otto Score 1-pass — 86.6%
No training, no float, no AdamW
- Random W0 → MAJ1 → Bayes log-Score
- 1× counting: Target[10][H][32] = log-odds
- Forward: &|~ + int32 addition
- 86.6% at H=2048, 4.8s on CPU
Otto Score Iterative — 96.4%
20 passes, beats AdamW
- Same forward: &|~ + int32
- log-odds correction (Perceptron-style)
- No float, no gradient, no AdamW
- Beats AdamW (95.4%) by 1pp
Results — MNIST 50K/10K, seed=42
Every result with pure bit-logic forward (&|~). No float, no int32 matmul.
| Procedure | Forward | Training | H | Eval | DRAM |
|---|---|---|---|---|---|
| Otto Score 1-pass ★ | MAJ1+int32 |
1-pass counting | 2048 | 86.6% | ✅ |
| Otto Score iterativ ★ | MAJ1+int32 |
20-pass correction | 2048 | 96.4% | ✅ |
| Float AdamW W1-Only (ref) | matmul+ReLU |
AdamW (20ep) | 2048 | 95.8% | ❌ |
| Otto Bridge+AdamW | Bridge+matmul |
AdamW (3ep) | 512 | 95.4% | ❌ |
Otto Score 1-pass — Scaling with H
| H (neurons) | Eval | Time | Bit-Mass | Note |
|---|---|---|---|---|
| 8 | 76.4% | 24ms | 207 Kbit | |
| 16 | 80.3% | 43ms | 414 Kbit | |
| 32 | 83.0% | 84ms | 829 Kbit | |
| 64 | 84.6% | 194ms | 1.6 Mbit | |
| 128 | 85.0% | 382ms | 3.2 Mbit | |
| 256 | 85.3% | 688ms | 6.4 Mbit | |
| 512 | 86.2% | 1.2s | 12.9 Mbit | |
| 1024 | 86.5% | 2.4s | 25.7 Mbit | Requires int64 class_offset |
| 2048 | 86.6% | 4.8s | 51.5 Mbit | Plateau — 86%-Wall |
How It Works — Bayes log-Score on MAJ1 Bits
Three insights that eliminated every non-bit operation from the classifier.
MAJ1 output is a bit-string, not a number
The uint32 from majority_tree1 encodes 32 independent yes/no decisions. Treating it as a number (uint32 comparison) loses the pattern. The information is in the bits, not in the value.
Per-bit log-odds extract the signal
Each MAJ1 bit is a weak class-predictor (~50% random, ~0.1% signal). Log-odds amplifies the signal by ~4× vs linear probability. The Bayes log-Score combines all 32 × H bits into a optimal class decision.
Random W0 is enough — frozen, never trained
The random projection W0 balances MAJ1 input at ~50% 1s. This is the only condition where majority_tree1 produces informative features. Training W0 would destroy the balance.
Explore — from catch to depth
Landed? Here is the smooth reading path: landing (hook) → papers (deep dives) → docs on GitHub (exact math). No duplication — single source of truth.
Otto Score — Method
Frozen W0 + MAJ1 + Bayes log-Score, terminology, parallelism, bit-mass. The architecture paper.
Fashion — Trap Broken
92.96% ceiling, 88.7–92.96% basin, beam-search, speed argument. Full leaderboard.
CIFAR-10 — 69.99% Ensemble
64.9% single-config, 69.99% beam-search over 19,707 archives, 66.88% 4-way.
Bit-Voting Baseline
Equal-H parity: BV ≈ W0 at same H, W0 = free width. IFC 14.7× faster.
DRAM-Native
Why &|~ + int32 only, energy 99.7% fewer bit-transfers, row-parallel members.
All Docs on GitHub
Workflow, Scores, Ensemble, Encoding, Bit-Mass, Majority-Vote — rendered Markdown, single source.
🧩 Open Challenge — Ensemble Subset Selection
NP-hard: find the best member subset for majority voting in a 30,240-member library. Corpora + tooling + reference results published; we invite better search algorithms.
Full journey, scaling argument, tech details and archive now live in their papers — this landing stays focused to catch you fast.