Status Report ā July 2026
DRAM-native Classification via Bit-Logic Operations
- 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,colswappipe 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.execompiled without-fopenmp,-O3ā 175s instead of 1.75s (100Ć slower). Fixed inmnist-1/Makefile. - Bug Fix: member.out contained wrong members ā
best_usedtracking 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.hused=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) Makefilefor proper dependency tracking.
- maj=1 is now Default ā The old
--maj 3tree was not a separate algorithm ā it was--maj 1with effective threshold ~52.7% (135/256).--maj 1is 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-gbshows 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@idstaysrot0@id). - Xform Duplicates Preserved ā
--xform id,rot45,rot90,id,rot45,rot90creates 6 members with independent W0 seeds. - run-research.sh --trace ā
perf record -gis automatically prepended. Enables profiling without manual perf invocation. - BitVoting Baseline Extended ā
--encoding-sizeN 0confirms: without W0 bottleneck, accuracy scales linearly with member count.
- Pixel Shuffle Xform ā New xform type:
--xform shuffle1..shuffle10performs 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
- 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 bitvotetarget +run-bitvoting-checkscript for automated sweeps
- 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 ā
- 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):
| Init | Description |
|---|---|
| Bayesian | build_target() computes log-odds from class frequencies, logit_convert() + center_target() |
| Random | target_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?
| Mode | Description |
|---|---|
| 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
| Approach | Encoding | Accuracy | Note |
|---|---|---|---|
| Otto Score | raw, down, sig, lin8, exp | 97.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
| Encoding | Approach | Members | Accuracy | Note |
|---|---|---|---|---|
| Raw (R|G|B plane) | Hebbian | 1 | 10.0% | Random ā no bit-level structure |
| exp8 on RGB | Hebbian | 1 | 23.1% | Encoding creates structure |
--encoding latest | Hebbian | 11 | 32.4% | Multi-member vote |
--encoding latest | Otto Score | 11 | 55.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
- Every trainer binary doubles as inference via
--importā no separate IFC source files - Encoding infrastructure in
lib/ki-encoding.hā self-contained, noki_Argsdependency - Hebbian uses the same multi-member architecture as Otto Score
- All 6 approaches are comparable at equal H and epochs
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
- 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%
- 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
- Target init invariance: Bayesian, random ā all converge to same ceiling
- Comparison with published results >60%:
| Source | Accuracy | Note |
|---|---|---|
| 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:
- Multiple passes over the data (backprop through W0)
- Data augmentation (random crops, flips, color jitter)
- Dataset-specific channel normalization
- Transfer learning from larger datasets (ImageNet)
- Batch normalization or similar adaptive scaling
- These techniques encode prior knowledge about natural images
Why 60% is the wall
- CIFAR-10 has 10 classes with 6000 images each
- A frozen random projection + MAJ3 + linear classifier has ~500K parameters
- The random projection destroys fine-grained spatial information
- MAJ3 further compresses 768 containers to 32 bits per neuron ā severe information loss
- Without dataset-specific preprocessing, the model cannot distinguish classes that share coarse color/texture statistics
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:
- All member scores (
int64[n_test Ć n_classes]) - Ground truth labels (
uint8[n_test]) - Configuration parameters (H, epochs, VN, seed, etc.)
- Per-member encoding metadata (color channel, encoding type/width)
- Embedded creation timestamp + ensemble eval accuracy
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:
- Parallel execution: N seeds can run simultaneously on N machines/cores ā no shared state
- Incremental accumulation: Add more seeds days or weeks later ā old archives are still valid
- Subset evaluation:
--filter eval gt 58excludes low-quality runs (text operators: gt, lt, ge, le, eq);--filter "GB=sig8"selects specific encoding channels - Sorting flexibility:
--sort seedor--sort ctimechanges the EN curve interpretation - Curve export:
--save FILEproduces plot-ready data for analyzing the EN accuracy saturation
5.3 Archive Versioning
| Version | Added | Contents |
|---|---|---|
| v1 | ā | Bare scores + labels |
| v2 | 2026-07 | Per-member encoding metadata (color, enc_type, enc_width) |
| v3 | 2026-07 | Embedded int64 timestamp in header (independent of filesystem mtime) |
| v4 | 2026-07 | Ensemble 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
| Finding | Status |
|---|---|
| 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)