Offline capacity and training sweep of the NNUE-shaped survival leaf on the existing corpus
web/content/research/EX-20260822-nnue-leaf-capacity-sweep-79632fd9.mdx and it will appear here. The registered protocol is shown below.The registered protocol
Training approaches/lifetime-objective/learned-leaf/train_leaf.py unchanged on runs/RUN-A51D-corpus/all.states (explored == 0 records, whole-origin split seed 0x59117000) over the 13-configuration grid in sweep.sh — hidden 32/64/128/256/512, mid 16/32/64, 10 or 20 epochs, lr 1e-3 or 3e-3, plus three training seeds at the baseline — yields a best held-out lifetime Pearson within 0.01 of the h64/m32/e10/lr3e-3 baseline (finding-08 recorded 0.8564 on the same split).
approaches/lifetime-objective/leaf-capacity-sweep/sweep.shapproaches/fair-expectimax/reference/fair-only-depth4.cppPrimary metric
held-out lifetime Pearson correlation on the whole-origin test split (486,819 examples), best configuration minus baseline
Statistical unit: whole-origin
Pass criteria, fixed in advance
- All 13 runs complete with finite metrics on the same split (summary.json lists 13 rows).
- Gate verdict from summarize.py: supported-as-tested if delta <= max(0.005, 2 x seed spread); not-supported-as-tested if delta >= 0.02 and delta > 3 x spread; otherwise inconclusive.
- Every reported number is copied from the trainer's own <tag>.json output; nothing is recomputed.
On pass: Record valid + pass (saturated); the next learned-leaf experiment must change the target or the feature space, not the width.
On fail: Record valid + fail (capacity or training length does matter offline); register a separate gameplay experiment before any strength claim; do not adopt any model.
Data and reuse
Reads only the existing training corpus runs/RUN-A51D-corpus/all.states (SEEDLEASE-A52 training ranges 0xa5200000-0xa52152ff as recorded in runs/RUN-A51D-corpus/gen.sh; the same file finding-08 trained on). No seed is opened and no game is played. Held-out metrics use the corpus's own whole-origin test split, which finding-08 also reported on; they are diagnostic, never strength evidence.
seed leases: none
What happened
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.