From 220a4b79e4b6d742a9ca7c278a1962b870500fbc Mon Sep 17 00:00:00 2001 From: tslil Date: Thu, 10 Sep 2026 14:12:41 +0100 Subject: credit Mitchell Riley: we can drop 65 parameters for about the same strength; also train for longer The idea is that the current model is M_theta(board, ply) = "score for player 0", but we can instead create a different model M'_theta(board) = "score for player 0 assuming that it's player 0's move" and for a certain pair of functions sigma, normalise, recover M_theta(board, ply) = sigma(ply) M'_theta(normalise(board, ply)). This pair of functions is sigma(ply) = +/- 1 (parity), and normalise being a conditional interchange of pieces on the board depending on the parity of the ply. The only things stopping this from being completely straightforward is that nn_train.py evaluates M'_theta itself so we need to pass sigma(ply) to the training loop. 6x6 is still untrained. --- include/pv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include/pv.c') diff --git a/include/pv.c b/include/pv.c index 94c00d1..fb5f181 100644 --- a/include/pv.c +++ b/include/pv.c @@ -44,7 +44,7 @@ void pv_capture_leaf(pv_leaf_t *leaf, tak_state_p state, nn_cell_idxs(leaf->cells, state); for (uint8_t loc = n_cells; loc < PV_MAX_CELLS; loc++) leaf->cells[loc] = 0; - leaf->current_colour = (uint8_t)state->current_colour; + leaf->parity_sign = (state->ply & 1) ? 1.0f : -1.0f; leaf->terminal = (uint8_t)(winner < 0xFF); leaf->terminal_value = leaf->terminal ? terminal_value(winner) : 0.0f; } -- cgit v1.3.1