Corrected 512-wide NNUE — +22 ±6 Elo over the immediate pre-release engine
Measured directly: 3000 games, 10s+0.1s, 1 thread, paired colours from the 8moves_v3 opening book. The new network scored +987 −793 =1220, 1597/3000 (53.2%). Zero unfinished games.
This release also carries the search and lifecycle work merged since v1.0.53. Their measurements are reported separately below; Elo estimates from different experiments are deliberately not added together.
The new network
The NNUE hidden layer doubles from 256 to 512 neurons per perspective while retaining eight material-count output buckets. It was trained for 600 superbatches over the full Stockfish depth-9 corpus after every shard was validated and its white-relative WDL field corrected. Representative score/result coherence moved from roughly 4.5% to 95.5%.
This is the architecture retest made necessary by v1.0.53. The earlier 512-wide experiment scored −22.5 ±10.3 Elo, but that network was trained while the result and score components of the objective fought each other. On corrected labels, the same broad architecture direction is now +22 ±6 Elo despite its computational cost.
The cost of the wider network
Against the 256-wide engine at deterministic depth 12:
| 256-wide | 512-wide | change | |
|---|---|---|---|
| nodes | 2,626,054 | 3,027,236 | +15.3% |
| NPS | 2.031M | 1.845M | −9.2% |
| wall time | 1,293ms | 1,641ms | +26.9% |
The network wins the fixed-time match in spite of searching fewer nodes per second and inducing a larger tree. This is an evaluation-quality gain, not a speed gain.
Search changes since v1.0.53
- Root PVS. Later root moves are searched with a scout window and re-searched only when they raise alpha. The combined candidate measured +21 ±9 Elo over official v1.0.53 across 1500 games (
+459 −368 =673). The isolated razor-depth control was −22 ±9, showing that the result depends on the interaction; it is not valid to add this estimate to the NNUE result. - Safer razoring depth. Razoring is restricted to depth 1, and a sacrifice-first mate regression pins the reason. This mitigates the known unsoundness tracked separately; it does not claim razoring is fully solved.
- Learned tables now survive between moves. History, capture history, countermoves, follow-up history and correction history were previously discarded whenever a search thread joined. Thread 0 now moves those tables back into the master state. This is a lifecycle correction, measured neutral at +5 ±9 Elo over 1500 games rather than claimed as a strength gain.
- SEE no longer recursively copies full positions. The legality-aware exchange semantics and search topology are identical. Alternating AVX2 trials measured 0.92% faster at depth 12 and 1.86% faster at depth 13.
Diagnostics and safeguards
benchnow reports cutoff sources and positions, main-search versus quiescence nodes, TT effectiveness and contention, scout/re-search rates, and searched width. Its state is reset per position so repeated runs in one process are deterministic.- CI checks the live chess-compete SPSA LMP defaults for cross-repository drift.
- NNUE layout documentation is consistently STM-first and width-correct.
- NNUE output scaling now widens to i64 before multiplying by the centipawn scale. A synthetic boundary regression would overflow the old i32 expression.
- Golden evaluations are pinned for the exact NET-1095 network, and material-sign checks still guard against a transposed perspective layout.
Experiments rejected along the way
- A conventional pin-agnostic swap-list SEE improved raw NPS by 12–15%, but expanded the deterministic tree by 46.3% and made the benchmark 30.6% slower. It was rejected in favour of the topology-identical legality-aware refactor.
- The original 512-wide NNUE result is superseded, not hidden: it was −22.5 ±10.3 Elo on the internally contradictory training objective. Correcting the labels changed the conclusion.
Known limitations
Previous network files remain incompatible with this build. They were trained against the inverted-label/perspective cancellation fixed in v1.0.53 and can evaluate backwards while passing structural loading checks. Network width is also compile-time: this 512-wide build deliberately rejects 256-wide files rather than guessing a format.
The wider net is materially slower. The fixed-time Elo match says the quality gain is worth that cost at 10s+0.1s, but the trade-off may vary by hardware and time control.
Testing
- Full release suite: 171 passed, 0 failed, 3 ignored across 21 suites.
- Formatting, repository-standard Clippy, CI, and CodeRabbit review passed.
- Deterministic 512-wide depth-12 signature: 3,027,236 nodes.
- Production pre-push hook built the release binary and verified that it reports version 1.0.54.