<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ctak, branch main</title>
<subtitle>An implementation of Tak and a computer opponent in C</subtitle>
<id>https://git.l-3.space/ctak/atom/?h=main</id>
<link rel='self' href='https://git.l-3.space/ctak/atom/?h=main'/>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/'/>
<updated>2026-09-16T20:02:53Z</updated>
<entry>
<title>fix tt issue for non-self-play</title>
<updated>2026-09-16T20:02:53Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-16T19:10:33Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=1898add0142b70b3fef5af78a6f3d7399a3f2cd5'/>
<id>urn:sha1:1898add0142b70b3fef5af78a6f3d7399a3f2cd5</id>
<content type='text'>
A little subtle, but in non-self-play games sharing tt entries is incorrect. We must therefore key additionally on the evaulation function itself.
</content>
</entry>
<entry>
<title>move data generation into the epoch loop</title>
<updated>2026-09-13T19:15:31Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-12T18:37:56Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=7f1566fb21dfe8c99bc770885cc2cc4e478e16b4'/>
<id>urn:sha1:7f1566fb21dfe8c99bc770885cc2cc4e478e16b4</id>
<content type='text'>
Previously we would spend all of the training epochs on making the network a better predictor of the *initial* TD-leaf values that we computed before the start of the first epoch. There's definitely something stale about this, given that the TD-leaf training targets involved the net evaluation at PVs. I'm not overly confident that this makes sense, but as a kind of compromise between fully on-line TD-leaf and the fully stale version we had before, we now recompute the TD-leaf values in each epoch with the fine-tuned net instead of the epoch 0 net.

Perhaps we were just lucky, but this seems to train a strong network under the default setting.

More experimentation is required.
</content>
</entry>
<entry>
<title>still observing non-monotonic improvements between training generations</title>
<updated>2026-09-12T14:54:20Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-12T14:51:16Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=f3ed463e8a215b0ca3219aebbb14c4a7073a0f9f'/>
<id>urn:sha1:f3ed463e8a215b0ca3219aebbb14c4a7073a0f9f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>flood fill for roads, fix dragon, memoise leaf eval, enable diagonal in nn_train.py</title>
<updated>2026-09-12T14:47:15Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-11T17:36:10Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=a361728f39812e25599323c52510c0eb3131bd90'/>
<id>urn:sha1:a361728f39812e25599323c52510c0eb3131bd90</id>
<content type='text'>
</content>
</entry>
<entry>
<title>move from single candidate td-leaf with gating to tournament of a population</title>
<updated>2026-09-11T16:00:18Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-11T11:56:12Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=6e90f1145b2c5c0f2dcc82d21ec45432274b8cad'/>
<id>urn:sha1:6e90f1145b2c5c0f2dcc82d21ec45432274b8cad</id>
<content type='text'>
The goal in this change was to overcome the rock-paper-scissors phenomenon that was happening in capability space by having on a single candidate learn to beat the most recent version of itself. In some sense this lead to rotating around in capability space instead of chasing monotonic improvements.

I hope that flipping to a system in which many (N=5) candidates play each other and learn from their own set of diverse games in this pool, combined with --replay-iters, will lead to a given network having to have a much more comprehensive understanding of the space of tactics. I haven't yet had time to train this thorougly, will run those experiments on my desktop computer.
</content>
</entry>
<entry>
<title>credit Mitchell Riley: we can drop 65 parameters for about the same strength; also train for longer</title>
<updated>2026-09-10T20:04:40Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-10T13:12:41Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=220a4b79e4b6d742a9ca7c278a1962b870500fbc'/>
<id>urn:sha1:220a4b79e4b6d742a9ca7c278a1962b870500fbc</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>use silu instead of relu with the intuition being that we avoid dead neurons</title>
<updated>2026-09-10T12:54:52Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-10T11:31:51Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=710d5a5225edb44d171ca9ac6345e9a61aa4f125'/>
<id>urn:sha1:710d5a5225edb44d171ca9ac6345e9a61aa4f125</id>
<content type='text'>
In a head-to-head this is +187 elo against the previous weights, although it trained more.
</content>
</entry>
<entry>
<title>~25% speedup in selfplay due to: incremental zobrist hashing, smarter road checking, re-using the input computed for the NN</title>
<updated>2026-09-09T20:45:17Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-08T10:55:28Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=1c9e266ae25f7f6067806d139e5971ce8513d2f6'/>
<id>urn:sha1:1c9e266ae25f7f6067806d139e5971ce8513d2f6</id>
<content type='text'>
</content>
</entry>
<entry>
<title>cleanup, match now plays pairs of symmetric games</title>
<updated>2026-09-07T18:58:03Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-06T16:24:44Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=7ef68374e8a58684b299b0f46f7ed850d5a87190'/>
<id>urn:sha1:7ef68374e8a58684b299b0f46f7ed850d5a87190</id>
<content type='text'>
</content>
</entry>
<entry>
<title>adding more thoroughly trained 6x6 weights, but it's clear that we're not scaling well to this size</title>
<updated>2026-09-05T18:06:27Z</updated>
<author>
<name>tslil</name>
<email>tslil@posteo.de</email>
</author>
<published>2026-09-05T17:41:27Z</published>
<link rel='alternate' type='text/html' href='https://git.l-3.space/ctak/commit/?id=f9f8f650dc557ea9dbb4652e48c5cdca7ea3c62c'/>
<id>urn:sha1:f9f8f650dc557ea9dbb4652e48c5cdca7ea3c62c</id>
<content type='text'>
</content>
</entry>
</feed>
