HexN≥brsm.dev

· the week of 25 Sep – 1 Oct

Search Party

A 128-simulation search over our best four-player network became the strongest player we have.

This week found that self-play had stalled for a reason other than gradient noise, and that a search over our best four-player network is now the strongest player we have: a 128-simulation MCTS over it50, one seat against three Heximax, wins 55.80% of 2,000 games where fair share is 25%. Brackets are 95% intervals.

The plateau that wasn’t noise

Last week’s PPO run had stopped improving at its final checkpoint, it400. Measured again against three Rehex over 4,000 games each, its checkpoints from iteration 200 to 400 sit flat between 56.0% and 57.5%. Brian had set the bar at beating Rehex 99% of the time at 1v1, since the best human players stand about that far above it: a gap in skill, not a limit set by luck.

My first diagnosis was that the step size was too small. A run with three times the learning rate, no tether and a reward for winning early lost about 15 pp against three Rehex. One-factor sweeps of learning rate, batch, epochs, discounting, a reward per victory point, a wider trunk and a varied pool all landed within about 2.7 pp of the start. The value head explained about 0.25 of outcome variance however it was fitted. I called it a local optimum; Brian asked for a principled analysis instead of more knobs, and I conceded the phrase claimed more than the data showed.

The gradient noise scale of it400’s self-play policy gradient is about 1.22 million positions. Last week’s run stepped on minibatches of 4,096 rows, so roughly 94% of each step was noise. Brian proposed an opponent that knows the dice, so that losses to luck would stop teaching the policy anything. Two independent reviews disagreed. One endorsed it. The other argued that an all-knowing opponent leaks the future through its moves, and that the dice belong in the critic instead. That second answer was tested. A critic shown the next rolls and every hidden hand gained 0.016 explained variance [+0.002, +0.028] against a 0.05 bar set before the run. All of that gain came from the dice, and the hands added nothing. Most of what the value head misses is luck no seat could know.

So the next run stepped at twice the measured noise scale: 8,530 games, about 2.4 million positions, per update. From here we count training in updates, one collect-and-train cycle each, which earlier posts called iterations; it50 is this run’s checkpoint after update 50. The policy moved +2.8 pp [+0.6, +5.0] against three held-out Heximax with the Heximax gate and +3.3 [+1.1, +5.5] with trading off. All of the gain arrived in the first 25 updates. By its own pre-set rule it stopped at update 50. A five-update probe with the tether removed moved no faster per step.

The portable lesson: measure the noise scale before you blame noise. Here it ruled out the batch and the tether, and left the objective. Self-play among near-equals, with a critic at 0.25, has little left to teach this network.

Search is the teacher

I proposed adding a stronger fixed opponent to the training table, such as a network trained only against Rehex. Brian vetoed it: an opponent we train against stops being a fair benchmark, and it50 is already the strongest automated player we have, so the only stronger opponent is a search over it50. We measured whether it is, against it50’s own games on the same seeds.

What each step bought, one network against three Heximax95% intervals on paired differences; n = games per cell. Big batch is it50 against it400; each search is over it50 against raw it50What each step bought, one network against three Heximax-202468paired gain in win rate over the network it started frombig batch, 50 updatesbig batch, 50 updates: 2.8 pp [0.6 pp, 5 pp], n = 4,0002.8 ppsearch, 32 simssearch, 32 sims: 1.3 pp [-0.67 pp, 3.27 pp], n = 2,0001.3 ppsearch, 64 simssearch, 64 sims: 1.65 pp [-0.37 pp, 3.67 pp], n = 2,0001.65 ppsearch, 128 simssearch, 128 sims: 5.05 pp [2.83 pp, 7.27 pp], n = 2,0005.05 ppsearch, 512 simssearch, 512 sims: 3.65 pp [1.23 pp, 6.07 pp], n = 2,0003.65 pp
In the configuration we serve, with the Heximax gate, 50 updates of clean self-play bought under 3 pp; a 128-simulation search over the result buys 5 pp, and more or fewer simulations buy less.
Table
estimatelowhighn
big batch, 50 updates2.80.65.04000
search, 32 sims1.3-0.673.272000
search, 64 sims1.65-0.373.672000
search, 128 sims5.052.837.272000
search, 512 sims3.651.236.072000

95% intervals on paired differences; n = games per cell. Big batch is it50 against it400; each search is over it50 against raw it50

At 128 simulations the search beats raw it50 in every configuration, each one seat against three. The gain is largest with the Heximax gate: +5.05 pp [+2.83, +7.27]. 512 simulations did no better, at +3.65. 64 simulations gave +1.65 and 32 gave +1.30, both inside their intervals. With trading on the search gains more than without (+5.1 against +2.6 on Heximax): search and trading compound.

That search is now the expert for expert iteration, reopened untethered on the last day. Two of the earlier attempts’ failure causes are closed: the search plays from the mover’s own beliefs, not the true hidden state, and each cycle trains on 2,000 games rather than 64. The third reason is still open: the search agrees with the network’s own first choice on 95–96% of decisions, so the whole signal is in the 4–5% it overrules. The bar for the first cycle was +2.5 pp for the raw network over it50, one seat against three Heximax with the Heximax gate. It came in late on the last day at −1.63 pp [−3.27, +0.02] over 4,000 games, well short.

Predicting a win is not pricing it

Last week’s trade fix for Heximax ended in a hard refusal at ten points. Brian called that a hack: an evaluator that can’t see that handing a nine-point seat a settlement gives away the game is broken. My candidate was a trade gate that prices each seat’s race to ten. It forecasts the winner better, with a log loss of 1.2316 against 1.2460. In play it lost, 45.88% [44.86, 46.89] over 8,000 2x2 games, and handed opponents 961 game-winning trades to the shipped bot’s 522. The race model gives the current turn at most one building, and the trades that lose games complete two points at once. A model that forecasts the winner well can still price badly the small change a trade makes.

The same series corrected last week’s headline. Refusing at ten on top of the next-turn win pricing scores 49.95% [49.36, 50.54]. All of the +2.96 pp we credited to the line came from the pricing.

Brian then proposed counting every way the bot could tell it was about to win. That found 172 turns where Heximax’s own view said it could certainly win that turn and it didn’t. The win was really on the board in 169 of them, 112 of those through Longest Road, and the other side went on to win 45 of those games. Brian raised why it didn’t simply take the win, so we tested a rule that takes it: the week’s one clear Heximax gain.

Heximax changes against the shipped Heximax, two seats each95% intervals over board pairs; n = paired games per A/BHeximax changes against the shipped Heximax, two seats each-6-5-4-3-2-10123win share minus 50%play the held winplay the held win: 1.75 pp [1.17 pp, 2.33 pp], n = 8,0001.75 pprefuse at 10, on toprefuse at 10, on top: -0.05 pp [-0.64 pp, 0.54 pp], n = 8,000-0.05 pprace-to-10 trade pricerace-to-10 trade price: -4.12 pp [-5.14 pp, -3.11 pp], n = 8,000-4.12 pphidden VP, game still onhidden VP, game still on: 0.45 pp [-0.66 pp, 1.56 pp], n = 2,0000.45 ppVP cards by age keptVP cards by age kept: -0.23 pp [-1.48 pp, 1.02 pp], n = 3,506-0.23 ppprice by who takesprice by who takes: -0.8 pp [-2.21 pp, 0.61 pp], n = 2,000-0.8 ppask only what existsask only what exists: -0.05 pp [-1.49 pp, 1.39 pp], n = 2,000-0.05 pp
Taking the win the hand holds is the only change that clears zero; pricing the race to ten loses 4 pp, and the rest are not statistically significant.
Table
estimatelowhighn
play the held win1.751.172.338000
refuse at 10, on top-0.05-0.640.548000
race-to-10 trade price-4.12-5.14-3.118000
hidden VP, game still on0.45-0.661.562000
VP cards by age kept-0.23-1.481.023506
price by who takes-0.8-2.210.612000
ask only what exists-0.05-1.491.392000

95% intervals over board pairs; n = paired games per A/B

Games against people online supplied the cases. In one, Heximax couldn’t see that a single road joining two stretches takes Longest Road, and traded a partner into a win. In another, Heximax at eight points bought three development cards instead of a city. A one-in-nine chance of drawing the winning victory points had been averaged in raw evaluation units, and the win bonus swamped the mean. I said that fix had been tried and ruled out; Brian asked for the evidence; there was none beyond my own note. The search now averages win probabilities instead of raw scores. Replayed, it picks the city in the positions it had misplayed. No A/B has been run, so its effect on strength is untested.

Rehex learns to plan a road

Rehex got the week’s largest measured gain, from a game on our own server where Brian watched it build roads into dead ends. It scored a road only by a building spot one road away. Now a road is worth the best spot it can still reach with the roads left in its supply. One Rehex against three of the previous version wins 30.03% of 6,000 games against 24.88% before, +5.15 pp [+4.15, +6.15], building more settlements on fewer roads. Before that fix, Rehex had already gained 4 to 8 pp on AB:2 over last week’s version under standard rules: 70.50% [67.5, 73.5] at 1v1 against 66.12%, and 44.12% [40.7, 47.5] one against three against 35.88%. Last post’s 79.00% was under the duel variant, where it now scores 85.75%. Heximax still beats it 56.75% [53.9, 59.6] at 1v1 under the duel variant, down from 62.62%.

Last post’s predictions

Next, and what I expect

Where things stand

Bot Table Win rate
MCTS@128 over it50, Heximax gate one against three Heximax 55.80% of 2,000
it50, Heximax gate one against three Heximax 50.95% of 4,000
it50, trading off one against three Heximax 42.33% of 4,000
Heximax 1v1 against AB:2, standard rules 77.38% [74.4, 80.3] of 800
Heximax one against three AB:2 56.38% [53.1, 59.6] of 800
Heximax 1v1, outside neural bot (fast mode, 15 points, bank trades only) 13 of 99