DRAM-Native &|~ Classification

Status Report — July 2026

DRAM-native Classification via Bit-Logic Operations

šŸ“ˆ Update July 30, 2026 — 98.4% MNIST via Pipe Xform Ensemble — merge-ensemble 2.36Ɨ faster
  • 98.4% MNIST (9837/10000) with 9 members — H=196, 10 ep, 14.2s. Previous record 97.9% (512Ɨ6shuf). +0.5pp breakthrough via --xform sweep@avg4,avg3,avg2,spiral,colswap pipe chains. Build recipe →
  • Pipe xforms — @ syntax chains transforms: avg4@spiral = running average filter + spiral pixel reorder. Creates fundamentally different input statistics that geometric xforms cannot achieve.
  • merge-ensemble 2.36Ɨ faster — memcpy removed, fused argmax, schedule(guided), trial-buffer eliminated. 10.1s → 4.3s.
  • --min-gain now controls member selection — only members with gain ≄ threshold are included in member.out. With --min-gain 0.03, 9 of 26 members are selected — 65% fewer members, 0.0pp loss.
  • Bug Fix: Makefile BASE_CFLAGS typo — merge-ensemble.exe compiled without -fopenmp, -O3 → 175s instead of 1.75s (100Ɨ slower). Fixed in mnist-1/Makefile.
  • Bug Fix: member.out contained wrong members — best_used tracking in beam search only recorded the newly added member, not the full candidate set. Fixed: memcpy(best_used, beam[si].used, n) copies complete candidate mask.
  • CIFAR-10 encoding alias fixed — cifar/ki-local.h used = separator (bl=gamma) but parser expects :. Aliases corrected to consistent format.
  • Makefiles harmonized — all three datasets (mnist, cifar, fashion) use HDRS = $(wildcard *.h) $(wildcard ../lib/*.h) Makefile for proper dependency tracking.
šŸ“ˆ Update July 25, 2026 — maj=1 Default, --export-gb, Avg Filters, xform@Pipes, 65% Ceiling Broken
  • maj=1 is now Default — The old --maj 3 tree was not a separate algorithm — it was --maj 1 with effective threshold ~52.7% (135/256). --maj 1 is DRAM-native (bit-logic only) and conceptually cleaner. --maj-thresh -2 = auto per encoding lookup.
  • 65% Ceiling Broken — --encoding-sizeN 0 (RAW encoding) reaches 99.6% train on Otto, but eval stagnates at 58%. BitVoting without W0 reaches 96.8% train, eval still climbing at 47.4% — no ceiling visible. The 65% wall comes from the frozen W0, not from training dynamics.
  • --export-gb — gb_buf caching to data/gb/. Memoization of expensive h0_neuron computation. Second run 35% faster (87s vs 136s). --debug-gb shows cache logs.
  • Lazy Input Loading — xform input buffers are only loaded on gb-cache MISS. On cache HIT, no I/O for input buffers at all.
  • Row-wise Running Average Filters — --xform avg2, avg3, avg4. Running average per row (wrap-right). Spreads information of one pixel across 4 neighbors.
  • Xform Pipeline Chaining — @ syntax: rot90@avg4 = first rot90, then avg4 on the result. Any number of steps. Identity steps are preserved (rot0@id stays rot0@id).
  • Xform Duplicates Preserved — --xform id,rot45,rot90,id,rot45,rot90 creates 6 members with independent W0 seeds.
  • run-research.sh --trace — perf record -g is automatically prepended. Enables profiling without manual perf invocation.
  • BitVoting Baseline Extended — --encoding-sizeN 0 confirms: without W0 bottleneck, accuracy scales linearly with member count.
šŸ“ˆ Update July 21, 2026 — Pixel Shuffle Xforms Published — Relation Beats Position
  • Pixel Shuffle Xform — New xform type: --xform shuffle1..shuffle10 performs pairwise pixel permutation (Fisher-Yates, fixed seeds 1–10). Key insight: Otto Score compares pixel relations, not pixel positions — Shuffle costs only 0.4pp vs Identity on MNIST (97.2% vs 97.6%)
  • Complete test series H=32..1024 Ɨ 1..7 Shuffles — 49 data points, all 10 epochs, MNIST. See table in MNIST Paper
  • Shuffle vs Ensemble: Different shuffles beat same shuffle (≙ W0 ensemble) by +1.5–1.7pp. Xform diversity > W0 diversity
  • Three diversity sources (ranked): Xform (different neighborhoods) > Geometric xforms (hflip, rot90) > W0 ensemble (different seeds)
  • Optimal config table: For every eval% target the fastest H/EN/Xform combination — See Recommendations
šŸ“ˆ Update July 20, 2026 — Bit-Voting Baseline Published — The 5pp Gap Proves W0 Nonlinearity
  • Bit-Voting Baseline paper — Linear perceptron on bit-level with identical 6272 input bits achieves 91.4% vs 96.1% Otto Score (H=196). The 4.7pp gap is the price of nonlinearity, not information content
  • Identity W0 thought experiment proven: Replacing random W0 with identity mapping collapses Otto Score to a linear classifier. W0 randomness is the feature extraction mechanism, not noise
  • Ensemble diversity source identified: W0 randomness (not xforms/encoding) generates uncorrelated errors. Bit-Voting gains only +0.7pp from 6 members vs Otto's +0.9pp — because Bit-Voting has no W0 to diversify
  • Gap scales with input complexity: MNIST 5pp, Fashion 8pp, CIFAR-10 20pp. Nonlinear feature extraction is more critical for complex inputs
  • Bit-Voting is the null hypothesis: Any Otto improvement that does not exceed 91.4% MNIST / 38% CIFAR / 80% Fashion is attributable to engineering, not architecture
  • New baseline dimension: make bitvote target + run-bitvoting-check script for automated sweeps
šŸ“ˆ Update July 17, 2026 — MNIST Research Paper Published + CIFAR-10 at 64.4%
  • MNIST paper — Comprehensive documentation of all MNIST results (99.0% data-limited, 97.9% full split). Core finding: xforms replace ensembleN — 7Ɨ faster at identical accuracy
  • 64.4% CIFAR-10 — Geometric transform ensemble (--xform all: hflip, vflip, dflip1, dflip2) adds +0.5-1.3pp over previous best. Each xform = independent members with own W0+target
  • New member dimension: ENSEMBLE Ɨ XFORM Ɨ COLOR Ɨ HN. Structured variation beats stochastic ensembleN by +0.4pp at equal member count
  • 63.7% CIFAR-10 via spatial channels (July 14 record) — LBP, DoG, Variance, Direction, Range, Color-LBP break the 62% ceiling
  • H=512, ep=10 reaches 64.3% at 304s — New cost/benefit sweet spot with xforms
  • All 5 transforms pixel-identical — single-xform runs produce identical accuracy
  • Full report: CIFAR-10 Paper →
šŸ“ˆ Update July 10, 2026
  • 71% faster training — gb-cache optimization: VN group bitmask precomputed once, reused for all epochs + evaluation
  • 61.62% CIFAR-10 — Ensemble of 17 seeds breaks the 60% barrier. Single-run ceiling at 61.0% (H=4094)
  • H determines speed, not ceiling — H=1024/2048/4096 all converge to ~61.5%. More H does NOT raise the ceiling, only reduces member count needed
  • HiddenN is input-limited — Beyond a certain H, all projections become redundant because the input data (256 containers for CIFAR) is too small. Higher accuracy requires more data, not more neurons
  • Human brain's 92% comes from data — Lifetime exposure to millions of images, not 86B neurons, is what gives humans 92% accuracy. The Otto Score would match this given equal training data
  • VN=2 Sweet Spot is data-dependent — VN=2 (25% retention) essential for noisy CIFAR, but VN=1 outperforms on clean MNIST
  • The Human Brain Has Been Decoded — Scaling law extrapolates to 92% human-level intelligence at 3.1T MAJ3 channels

1. Target Initialization: Classical vs Random — Identical Convergence

Question: Does the initial value of the trained target/offset matrix affect final accuracy?

Experiment: Compare two init strategies for CIFAR-10 Otto Score (H=256, 5 ep):

InitDescription
Bayesianbuild_target() computes log-odds from class frequencies, logit_convert() + center_target()
Randomtarget_ens[i] = (int32_t)(w0_random() >> OT_PRECISION) — correction builds from scratch

Result: Both converge to the same final accuracy (~55%). Bayesian init gives a head start in epoch 1 (~30% vs ~10%), but by epoch 5 both are within 0.5pp. Pure zero initialization does NOT work — the correction loop needs a non-zero starting point to break symmetry.

Conclusion: The correction process is robust — target initialization does not determine the ceiling. The 55-57% barrier is architectural, not initialization-dependent.

1b. Correction Distribution: Central vs Per-Sample — Same Ceiling

Question: Does distributing the log-odds correction across individual misclassifications (instead of one aggregated step) improve convergence?

ModeDescription
Central (batch)Collect all misclassifications in one epoch, compute average correction vector, apply one single step
Distributed (per-sample)For each misclassified sample, apply the correction immediately — multiple small steps per epoch

Result: Both converge to the same final accuracy (~55%). The distributed approach shows slightly less oscillation during training (smoother accuracy curve), but at significantly higher computational cost. The ceiling is identical.

Conclusion: The correction architecture determines the ceiling, not how the correction is scheduled. The distributed mode's reduced oscillation does not translate to higher final accuracy — confirming that the 55-57% barrier is fundamental and not an optimization artifact.

2. Encoding is Mandatory for Continuous Data — MNIST is the Exception

Finding: Binary neural networks (uint32 containers, XNOR+popcount operations) on continuous data (photographs: CIFAR-10) require a thermometer encoding of pixel values. MNIST is the exception: handwritten digits are binary by nature (ink/no-ink), so raw packing works directly.

MNIST — Special case: binary by nature

ApproachEncodingAccuracyNote
Otto Scoreraw, down, sig, lin8, exp97.0%Works WITHOUT encoding — binary pixels

MNIST digits are inherently binary (>128 = ink, <128 = paper, slight anti-aliasing). Four binary pixels packed into one uint32 preserve the bit-level pattern — XNOR+popcount has structure to exploit. Encoding is optional for MNIST, not mandatory.

CIFAR-10 — Continuous data REQUIRES encoding

EncodingApproachMembersAccuracyNote
Raw (R|G|B plane)Hebbian110.0%Random — no bit-level structure
exp8 on RGBHebbian123.1%Encoding creates structure
--encoding latestHebbian1132.4%Multi-member vote
--encoding latestOtto Score1155.0%Same encoding, stronger learner

CIFAR-10 pixels are continuous 8-bit color values (0..255 per channel, 16M colors). Four adjacent pixels packed into uint32 have no bit-level correlation with visual similarity — XNOR between two random-looking containers yields random popcounts. Thermometer encoding restores the concept of “nearness” in bit space.

Why encoding matters: exp8 maps brightness to bit patterns where popcount(encode(pv)) ∝ pv. Pixel values 127 and 128 produce nearly identical bit patterns (differ by one bit) instead of completely unrelated ones. XNOR+popcount can exploit this structure — without it, the binary operations have no semantic gradient.

3. Repository Structure

Current state (master branch):

otto-score-ifc/          ← Public distribution root
ā”œā”€ā”€ mnist/               ← MNIST trainers (Otto + Hebbian, unified)
ā”œā”€ā”€ cifar/               ← CIFAR trainers (symlinks → mnist/)
ā”œā”€ā”€ reference/           ← AdamW baselines
ā”œā”€ā”€ lib/                 ← Shared headers (maj3.h, ki-encoding.h, w0_random.h)
└── models/              ← Cached trained models

Only otto-score-ifc/ is part of the public distribution on GitHub. Local research directories (mnist-1/, cifar-1/, www/, etc.) are not in the remote repository.

Key architectural decisions

GitHub: github.com/aotto1968/forward-prop (master branch)

4. The 60% CIFAR-10 Barrier — A Fundamental Limit

Claim: 60% accuracy on CIFAR-10 is a fundamental limit for DRAM-native bit-logic classifiers that use no dataset-specific prior knowledge.

Evidence

  1. Single frozen random projection (Otto Score, Hebbian, AdamW all use this):
    • Best Otto Score result: 61.62% (July 2026, 17-seed ensemble, H=1024, VN=2)
    • Single-run ceiling: 61.0% (H=4094, VN=2, target-err=0.4)
    • Ensemble of independent seeds breaks the single-run ceiling: H=512 Ɨ 20 seeds → 61.22%, H=1024 Ɨ 17 seeds → 61.62%
  2. Ensemble overcomes the single-run ceiling:
    • Single-run saturates at ~61.0% (H=4094)
    • Multiple seeds with different W0 streams give uncorrelated errors
    • EN=1..N merge-ensemble tool creates accuracy curves per seed
    • No hard ceiling yet — more seeds continue to improve accuracy
  3. Target init invariance: Bayesian, random — all converge to same ceiling
  4. Comparison with published results >60%:
SourceAccuracyNote
This work (Otto Score, single run)61.0%H=4094, VN=2, target-err=0.4
This work (Otto Score, ensemble)61.62%H=1024, 17 seeds, VN=2, pure &|~ + int32
Kaggle CIFAR-10 leaderboard>90%Deep CNNs, augmentation, transfer learning
Binary networks (XNOR-Net, etc.)85-90%Backprop + STE, batch norm, no DRAM constraints

Every published result >60% uses at least one of:

Why 60% is the wall

Position

We consider any CIFAR-10 result above 60% that does not disclose its full training pipeline (including data augmentation, transfer learning, and architecture search) to be potentially influenced by dataset-specific prior knowledge. The Kaggle CIFAR-10 leaderboard is not a valid comparison for DRAM-native classifiers because those entries use GPU-optimized deep learning with extensive prior knowledge built into the architecture.

5. Decoupled Ensemble Workflow

Key architectural insight: Every Otto Score ensemble member is completely independent — different W0 (different random seed), trained from scratch, own target matrix. There is zero coupling between members. This enables a fundamentally decoupled workflow:

5.1 Train now, merge later

The --export-merge-scores DIR flag saves each member's per-class scores to an archive file (.ens) immediately after training. These archives contain everything needed to reconstruct the ensemble:

The merge-ensemble tool reads any number of archive files, accumulates scores in order, and produces an accuracy curve for EN=1..N. Training and scoring are completely decoupled:

ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”     ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│  Train seed 1234       │ ──> │  scores/SD1234.ens  │ ─┐
│  --export-merge-scores │     ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜  │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜                              │
                                                        │   ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”     ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”  │   │  merge-ensemble  │
│  Train seed 5678       │ ──> │  scores/SD5678.ens  │ ─│─> │  scores/         │
│  --export-merge-scores │     ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜  │   │  → EN curve      │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜                              │   ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
                                                        │
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”     ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”  │
│  Train seed 9012       │ ──> │  scores/SD9012.ens  │ ā”€ā”˜
│  --export-merge-scores │     ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
   ... (N seeds, parallel, any time) ...

5.2 Maximum Parallelism

Because ensemble members are independent, the workflow enables:

5.3 Archive Versioning

VersionAddedContents
v1—Bare scores + labels
v22026-07Per-member encoding metadata (color, enc_type, enc_width)
v32026-07Embedded int64 timestamp in header (independent of filesystem mtime)
v42026-07Ensemble eval accuracy (float) in header + _F4 in filename

File naming: H{hidden}_EP{epochs}_VN{splitVN}_HN{splitHN}_TE{te}_SD{seed}_F4_TS{timestamp}.ens

Archives from different training runs can be freely mixed as long as their configuration parameters (H, epochs, VN, etc.) match — the tool validates this and rejects mismatched files.

Summary

FindingStatus
Target init does not affect final accuracyāœ… Confirmed
Thermometer encoding is mandatory for continuous data (CIFAR)āœ… MNIST works without (binary by nature)
60% CIFAR-10 barrier broken by ensembleāœ… 61.62% (17 seeds, H=1024)
Training time reduced by 71%āœ… gb-cache: 934s→273s (H=1024, EN=7)
VN=2 Sweet Spot is data-dependentāœ… VN=2 for CIFAR (noisy), VN=1 for MNIST (clean)
Multi-member Hebbian works (like Otto)āœ… 11 members, --encoding latest
Decoupled ensemble workflowāœ… --export-merge-scores + merge-ensemble — train/merge fully independent
Repository consolidated under otto-score-ifc/āœ… Complete
MNIST research paper — xforms replace ensembleN (7Ɨ faster)āœ… Published 2026-07-17
Bit-Voting Baseline — 5pp gap proves W0 nonlinearityāœ… Published 2026-07-20
Pixel Shuffle Xform — Relation beats position, 10 shuffles, optimal config tableāœ… Published 2026-07-21

Andreas Otto — July 2026
github.com/aotto1968/forward-prop


Documentation Source
Markdown source: /docs/status-2026-07.html | All docs: /docs/ (synced from GitHub/docs)