The NNUE-shaped survival leaf is accuracy-saturated at hidden width 64 on the existing corpus
web/content/research/TH-20260822-nnue-leaf-capacity-saturation-9c45e42e.mdx and it will appear here. The registered record is shown below.The registered record
Claim
On the existing 5.26M-record training corpus (runs/RUN-A51D-corpus/all.states, whole-origin split of dataset.py), the NNUE-shaped survival leaf's held-out lifetime correlation does not improve by more than 0.01 when hidden width is raised from 64 to 512, the middle layer from 32 to 64, epochs from 10 to 20, or the learning rate is changed: its accuracy is saturated by the feature space and the data, not by capacity or training length.
Mechanism
finding-08 reports held-out lifetime correlation 0.8564 for the 572k-parameter h64 student against 0.8646 for a 3.0M-parameter convolutional teacher, and concludes that 'the accuracy is not there to be had'. That conclusion rests on one pair of architectures. If the 135-active-feature first layer is the bottleneck, wider hidden layers and longer training will not move the held-out correlation; if the student is under-parameterised or under-trained, they will. Either answer is cheap (about 35 s of GPU per run) and neither requires a game.
What would prove it wrong
- The best sweep configuration's held-out lifetime Pearson exceeds the h64/m32/10-epoch/lr 3e-3 baseline by at least 0.02 and by more than three times the seed-to-seed spread of the baseline: the claim is not supported as tested (capacity or training length matters).
- A delta between max(0.005, 2 x seed spread) and that threshold: inconclusive at this corpus size.
- Out of scope: whether a more accurate leaf plays better. finding-08 already shows a 0.008 correlation gap did not separate the CNN from the student in play; a gameplay test is a separate preregistered experiment.
Experiments that test it
- Offline capacity and training sweep of the NNUE-shaped survival leaf on the existing corpusleafnet-capacity-grid vs fair-d4 · CHECK · preregistered
Results recorded against it
Offline capacity/training sweep of the NNUE-shaped survival leaf on runs/RUN-A51D-corpus/all.states (13 runs, same whole-origin test split, 486,819 held-out examples). Baseline h64/m32/e10/lr3e-3 held-out lifetime Pearson 0.8546 (finding-08 recorded 0.8564 on an earlier torch build); seed-to-seed spread 0.0023 over three seeds. Best configuration h64-m64-e10-lr3e3-s0 at 0.8568, delta +0.0022 <= max(0.005, 2 x spread): gate verdict supported-as-tested. Width hurts: Pearson by width (params, Pearson, final train loss) h32-m32-e10-lr3e3-s0 (286,447 params: 0.855, loss 0.5238); h64-m32-e10-lr3e3-s0 (572,367 params: 0.8546, loss 0.511); h128-m32-e10-lr3e3-s0 (1,144,207 params: 0.8543, loss 0.5006); h256-m32-e10-lr3e3-s0 (2,287,887 params: 0.8515, loss 0.4857); h256-m64-e20-lr3e3-s0 (2,296,591 params: 0.8446, loss 0.4596); h512-m64-e20-lr3e3-s0 (4,592,143 params: 0.8378, loss 0.4197). Training loss falls monotonically with width while held-out accuracy falls, i.e. larger students overfit this corpus; 20 epochs change nothing at h64 and hurt at h128/h256; lr 1e-3 and mid 16/64 are within spread. The accuracy of this feature space on this corpus is saturated near 0.855-0.857; it is not limited by hidden width, middle width, epochs or learning rate.
- ✓All 13 runs complete with finite metrics on the same split — observed: 13 rows, 0 FAILED lines in sweep.log
- ✓Gate verdict from summarize.py — observed: delta +0.0022 vs threshold max(0.005, 2 x 0.0023) -> supported-as-tested
- ✓Every number copied from the trainer's own <tag>.json output — observed: summarize.py reads heldOut/heldOutMirrored/history fields verbatim
Recorded metrics
- tag
- h128-m32-e10-lr3e3-s0
- hidden
- 128
- mid
- 32
- epochs
- 10
- lr
- 0.0030
- seed
- 42,282
- parameters
- 1,144,207
- lifetimePearson
- 0.8543
- mirroredPearson
- 0.8541
- lifetimeMAE
- 14.4423
- hazardAccMean
- 0.8387
- finalTrainLoss
- 0.5006
- trainWallSeconds
- 10.7382
- tag
- h128-m32-e20-lr3e3-s0
- hidden
- 128
- mid
- 32
- epochs
- 20
- lr
- 0.0030
- seed
- 42,282
- parameters
- 1,144,207
- lifetimePearson
- 0.8520
- mirroredPearson
- 0.8516
- lifetimeMAE
- 14.5026
- hazardAccMean
- 0.8374
- finalTrainLoss
- 0.4887
- trainWallSeconds
- 10.7461
- tag
- h256-m32-e10-lr3e3-s0
- hidden
- 256
- mid
- 32
- epochs
- 10
- lr
- 0.0030
- seed
- 42,282
- parameters
- 2,287,887
- lifetimePearson
- 0.8515
- mirroredPearson
- 0.8512
- lifetimeMAE
- 14.5446
- hazardAccMean
- 0.8365
- finalTrainLoss
- 0.4857
- trainWallSeconds
- 15.5636
- tag
- h256-m64-e20-lr3e3-s0
- hidden
- 256
- mid
- 64
- epochs
- 20
- lr
- 0.0030
- seed
- 42,282
- parameters
- 2,296,591
- lifetimePearson
- 0.8446
- mirroredPearson
- 0.8444
- lifetimeMAE
- 14.7638
- hazardAccMean
- 0.8322
- finalTrainLoss
- 0.4596
- trainWallSeconds
- 15.2548
- tag
- h32-m32-e10-lr3e3-s0
- hidden
- 32
- mid
- 32
- epochs
- 10
- lr
- 0.0030
- seed
- 42,282
- parameters
- 286,447
- lifetimePearson
- 0.8550
- mirroredPearson
- 0.8548
- lifetimeMAE
- 14.4879
- hazardAccMean
- 0.8384
- finalTrainLoss
- 0.5238
- trainWallSeconds
- 7.5850
- tag
- h512-m64-e20-lr3e3-s0
- hidden
- 512
- mid
- 64
- epochs
- 20
- lr
- 0.0030
- seed
- 42,282
- parameters
- 4,592,143
- lifetimePearson
- 0.8378
- mirroredPearson
- 0.8379
- lifetimeMAE
- 15.1885
- hazardAccMean
- 0.8256
- finalTrainLoss
- 0.4197
- trainWallSeconds
- 13.9648
- tag
- h64-m16-e10-lr3e3-s0
- hidden
- 64
- mid
- 16
- epochs
- 10
- lr
- 0.0030
- seed
- 42,282
- parameters
- 571,087
- lifetimePearson
- 0.8542
- mirroredPearson
- 0.8543
- lifetimeMAE
- 14.4476
- hazardAccMean
- 0.8388
- finalTrainLoss
- 0.5151
- trainWallSeconds
- 8.3707
- tag
- h64-m32-e10-lr1e3-s0
- hidden
- 64
- mid
- 32
- epochs
- 10
- lr
- 0.0010
- seed
- 42,282
- parameters
- 572,367
- lifetimePearson
- 0.8552
- mirroredPearson
- 0.8552
- lifetimeMAE
- 14.4757
- hazardAccMean
- 0.8386
- finalTrainLoss
- 0.5219
- trainWallSeconds
- 3.2629
- tag
- h64-m32-e10-lr3e3-s0
- hidden
- 64
- mid
- 32
- epochs
- 10
- lr
- 0.0030
- seed
- 42,282
- parameters
- 572,367
- lifetimePearson
- 0.8546
- mirroredPearson
- 0.8546
- lifetimeMAE
- 14.4145
- hazardAccMean
- 0.8390
- finalTrainLoss
- 0.5110
- trainWallSeconds
- 8.5447
- tag
- h64-m32-e10-lr3e3-s1
- hidden
- 64
- mid
- 32
- epochs
- 10
- lr
- 0.0030
- seed
- 42,283
- parameters
- 572,367
- lifetimePearson
- 0.8567
- mirroredPearson
- 0.8565
- lifetimeMAE
- 14.4525
- hazardAccMean
- 0.8391
- finalTrainLoss
- 0.5114
- trainWallSeconds
- 7.2195
- tag
- h64-m32-e10-lr3e3-s2
- hidden
- 64
- mid
- 32
- epochs
- 10
- lr
- 0.0030
- seed
- 42,284
- parameters
- 572,367
- lifetimePearson
- 0.8569
- mirroredPearson
- 0.8569
- lifetimeMAE
- 14.4411
- hazardAccMean
- 0.8391
- finalTrainLoss
- 0.5131
- trainWallSeconds
- 8.8389
- tag
- h64-m32-e20-lr3e3-s0
- hidden
- 64
- mid
- 32
- epochs
- 20
- lr
- 0.0030
- seed
- 42,282
- parameters
- 572,367
- lifetimePearson
- 0.8564
- mirroredPearson
- 0.8563
- lifetimeMAE
- 14.4448
- hazardAccMean
- 0.8389
- finalTrainLoss
- 0.5051
- trainWallSeconds
- 8.4661
- tag
- h64-m64-e10-lr3e3-s0
- hidden
- 64
- mid
- 64
- epochs
- 10
- lr
- 0.0030
- seed
- 42,282
- parameters
- 574,927
- lifetimePearson
- 0.8568
- mirroredPearson
- 0.8567
- lifetimeMAE
- 14.4299
- hazardAccMean
- 0.8391
- finalTrainLoss
- 0.5097
- trainWallSeconds
- 5.2192
- Offline diagnostic on teacher labels from already-played games; says nothing about playing strength (finding-08: a 0.008 Pearson gap did not separate two models in play).
- Single corpus (5.26M records, whole-origin split); a corpus several times larger could move the saturation point and is the natural follow-up, since the wider models overfit rather than underfit.
- Per-board inference cost was not measured; irrelevant to the verdict because no wider model won.
- GPU ran concurrently with a 30-thread CPU evolution; wall times are not timing-grade; metrics are unaffected.
- The baseline reproduction differs from finding-08's 0.8564 by 0.0018 on a newer torch build; within the measured seed spread.