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: status-2026-07-04.md | All docs: GitHub/docs