Chance-state NNUE
rejectedevidence: task-record onlypublic informationJudge the board at the moment just before the next disc is dealt, so the value never has to be split seven ways.
Every learned evaluator has to decide when it looks at the board. If it looks after the next disc is known, it has to learn seven different opinions about essentially the same position. This model looks at the moment in between — the board plus how many drops remain before the row rises — and lets the average over incoming discs take care of itself.
The network only ever sees a public board and the rise clock. One of its two training modes reads a curriculum harvested from privileged oracle games, which is legal for producing training labels but means those labels are teacher-derived and could not have been generated by a legal player. The verdict — that it plateaued well below fair search — is a task record only: there is no ledger section, protocol, artifact hash, or per-game data behind it anywhere in the repository.
The intuition
Consider the position after your disc lands but before you are told what comes next. That is the chance state: a board, and a number saying how many drops until the covered row rises. It is a genuine moment in the game, and it is the last moment at which nothing is yet random.
Why this helps: value learning wants to compare positions with each other, and positions that differ only in which disc is about to arrive are not really different positions — they are the same position under seven different rolls of the dice. A model asked to score "this board with a 3 coming" separately from "this board with a 5 coming" spends a seventh of its data on each case. A model that scores the board alone gets all of it, and the averaging over the incoming disc happens where it belongs: over the many trajectories that pass through that board.
The visible disc is not thrown away — it is used at decision time, where it must be. The policy places the disc it can actually see, and then compares the chance-state values of the seven boards that placement could produce. That is also, precisely, the afterstate idea that the newer afterstate-learning family later formalised.
How it works, step by step
- Define the value on the right object. The learned function is
U(board, moves-until-rise). It deliberately has no input for the next disc. - Play, and learn from what follows. Training is fitted multi-step temporal-difference learning over self-played trajectories, mixing a bootstrapped n-step target with a Monte Carlo return, with replay.
- Score the alternatives at decision time. For the disc actually visible, each legal column is placed and the resulting chance state is evaluated; seven chance samples exactly stratify the first hidden reveal so the seven comparisons face the same spread of luck.
- Fold mirror images together. Positions are canonicalised, so a board and its mirror image share one representation and one set of weights.
- Optionally, learn from a curriculum. A second training mode reads a dataset of states drawn partly from privileged oracle games and partly from ordinary play, bucketed by rise phase. It regresses remaining moves with a Huber loss and adds a margin-ranking term that pushes long-lived oracle states above matched shorter-lived ones, but only when the two differ by more than 25 moves of lifetime.
What happened
The learner trained, and its play settled well below the fair search it was meant to rival. It was retired at that point.
That is genuinely all that survives. The experiment index carries the verdict — "the learner plateaued well below fair search" — and marks it task-record only; the exploratory audits confirm that no ledger entry exists for this source file. There is no retained number for this approach: not a mean score, not a mean lifetime, not a held-out correlation, not a cohort size, not a training-transition count. Nothing on this page should be read as a measured comparison, because none is available to quote.
The technical record
Source: nnue-value.cpp. Status rejected, evidence task-record only
(experiment index, Value and policy learning
table). No section of the full ledger covers it; the
audit in
audit-05 states plainly
that "no ledger entry exists", and
audit-04 lists it among the 30
sources whose rejection "cannot be re-derived".
Configuration below is read from the source file, not from any result
record: two hidden layers of 32 and 16 units over a sparse feature set (cell
occupancy, rise phase, column and row shapes, count features, and horizontal /
vertical pair placements); discount 0.999; learning rate 3e-4; replay ratio
0.5; Monte Carlo weight 0.35; seven chance samples; curriculum mode 120 epochs,
Huber threshold 20 moves, ranking weight 20.0, ranking margin scale 0.25,
ranking pairs formed only where the lifetime gap exceeds 25 moves. Training
seeds start at 0x3d700000; the curriculum probe is asserted to lie inside the
0x4d70 partition. Modes: --self-test, --gradient-check, --train,
--evaluate, --train-curriculum.
What this taught us, and what is still open
The mechanism did not die with the experiment. Valuing the board before chance speaks — one evaluator, no action input, no seven-way split — is the same structural choice the repository's current registered theory rests on, and the afterstate family has since taken it much further with successor-closed labels and preregistered gates.
What this attempt was missing is visible in hindsight from the sibling trap: the value was learned from trajectories the training policy actually walked, so the seven boards compared at decision time were still, mostly, boards it had never been trained to distinguish. Being on the right object does not by itself fix being trained on the wrong distribution.
The honest open item is smaller and more procedural: because nothing was retained, this configuration cannot be checked, and re-running it would be a new experiment rather than a reproduction.
Sources
nnue-value.cpp— feature set, TD training, curriculum mode, and self-tests.
Source files
README.mdxnnue-value.cpp