Adam Atanas

Ongoing Research

Stockfish interpretation

Actively under development: methods, results and the atlas are still changing.

Actively under development. Known errors in some records are not yet corrected, and the criteria may change.

What is being interpreted

Stockfish 17.1 evaluates positions with NNUE (efficiently updatable neural network) nets. This writeup and the atlas cover the smaller of its two nets. King-relative piece-square inputs feed 128 accumulator neurons per side. Pair j (0 to 63) multiplies accumulator neurons Aj (neuron j) and Bj (neuron j + 64) after clipping each to the range 0 to 127. The pair values feed one of 8 layer stacks, chosen by piece count, each with fully connected layers fc0 and fc1 and a skip channel. That gives 576 units: 64 pairs, 128 factors (the A and B neurons), 120 fc0, 8 skip and 256 fc1. Of these, 19 fc1 units are dead (firing rate below 0.01%) and have no hypothesis, leaving 557 live.

The question is whether such a network can be read unit by unit. The work rests on an integer PyTorch replica that matches the engine exactly, at every intermediate value, on 10,000 test positions.

How the data was sourced

My first database took 62% of its positions from the Lichess analysis (evaluation) database. That source mixes real game positions with board-editor setups and records no provenance. Those positions dominated many units' extreme examples, so I rebuilt the database. It now has 3,215,779 positions, of which 2,897,376 are natural:

Natural sourcePositionsShare
Rated human Lichess games, September 20261,655,44757.1%
Official Lichess puzzles598,96720.7%
Stockfish 17.1 self-play, 2,000 nodes per move363,99312.6%
Stockfish 17.1 self-play, 50,000 nodes, from Lichess game openings230,1027.9%
Lichess games against engine (BOT) accounts48,8671.7%

The remainder is almost all synthetic (random moves added, pieces removed, positions just after random self-play openings) and is kept out of examples and tests, apart from a separately reported robustness check. The train/held-out split is drawn by game and leaves 291,874 natural held-out positions. The Lichess game and puzzle exports are released under the CC0 license, according to the Lichess open database page.

Concept probes: a baseline without language models

The baseline is a hand-coded library of 292 chess concepts (material, king safety, pawn structure, threats) plus 87 terms from Stockfish 15.1's classical evaluation. Each unit gets rank correlations and a sparse linear (Lasso) probe over these 379 features. These give any description something to beat.

How the agents form hypotheses

The method follows Nick Cammarata's "Neural networks are already clean" (Goodfire, October 2026).

One model, gpt-6-luna, wrote every hypothesis in the atlas. Its first prompt for a unit draws only on training positions and shows:

It returns a sentence saying what the unit distinguishes, plus a Python function f(board, perspective, c) whose output should rise with the unit's activation. Here board is the position, perspective the side the unit belongs to, and c the concept values. The code runs in a restricted sandbox.

How the hypotheses are tested

All tests use held-out natural positions:

A unit is solved if fidelity is at least 0.85, ρ is at least 0.3 and specificity is in the top 3. It is partial if fidelity is at least 0.70. A hypothesis that is not solved gets up to 3 revisions, each shown its scores and held-out boards and edits where it disagrees with the unit. The best round is then re-scored on a separate confirmation set that excludes the selection positions and the games of every board the explainer saw. The full run cost $7.00 over 2,618 model calls.

Results

146 of 557 live units (26%) are solved and 378 are partial. Factors do best (55 of 128) and pairs worst (9 of 64). Audits and controls lower that figure:

Activation fit is not behavioral fidelity

The clearest limitation appears when pairs are replaced by calibrated scorers and the rest of the network is run exactly. Variance retained is an R²-style measure on the positional output, over 20,000 held-out positions. Elo comes from matches at a search depth of 2 plies (one move by each side) against the original net over 100 opening pairs.

All 64 pairs replaced byPositional variance retainedElo (95% interval)
Concept probes0.257−104 (−149, −58)
LLM hypotheses0.161−207 (−266, −160)
A constant per pair−0.043−200 (−260, −149)

In these matches the hypotheses do no better than constants. They win on sparse, square-specific pairs (pair 37 reaches activation R² 0.64 against 0.04 for its probe). They lose on the material pairs that carry most of the variance. Fidelity correlates with activation R² (Spearman 0.47) but not with the advantage over the probe (−0.08), so a high atlas score does not predict good replacement. Two-ply Elo is coarse (a linear concept fit ties the net), so it is a sanity check, not a measure of strength.

Ablation by category is also inconclusive: zeroing the 286 units labeled "material" removes 91% of positional variance, but no more than random groups of the same make-up.

Other limitations

What is unfinished