Jacob Garcia · Hugging Face Model Foundry
Microzero Play
Playable neural MCTS Tic-Tac-Toe agent. This showcase backs up the trained artifacts, measured evaluation, and complete runnable source.
Verified project card
# MicroZero MicroZero is a tiny AlphaZero-style Tic-Tac-Toe agent. A shared neural trunk predicts both move priors and position value. Monte Carlo Tree Search converts those estimates into stronger self-play targets, while terminal outcomes supervise value learning. The training loop uses: - neural-guided PUCT search; - root Dirichlet exploration; - policy targets from MCTS visit counts; - terminal win/draw/loss value targets; - all eight square-board symmetries; - a bounded replay buffer. Evaluation alternates playing first and second against random and exact minimax opponents. ## Verified results - 7,626 trainable parameters; - 980 neural-MCTS self-play games; - 24,000-example bounded replay buffer after symmetry augmentation; - 384 wins, 16 draws, and zero losses over 400 games against random play; - 200 draws and zero losses over 200 games against exact minimax. The exact opponent is used only for final evaluation, not as a source of training targets. Full metrics and the per-iteration learning history are stored in `artifacts/microzero/evaluation.json`. ## Reproduce ```powershell uv run python projects/microzero/train.py ```
Evaluation snapshot
{
"model": "MicroZero",
"parameters": 7626,
"self_play_iterations": 14,
"self_play_games": 980,
"final_replay_examples": 24000,
"training_history": [
{
"iteration": 1,
"replay_examples": 4128,
"x_win_rate": 0.5428571428571428,
"o_win_rate": 0.14285714285714285,
"draw_rate": 0.3142857142857143,
"average_game_moves": 7.371428571428571,
"policy_loss": 2.1499555636854732,
"value_loss": 0.5162482239744243
},
{
"iteration": 2,
"replay_examples": 8128,
"x_win_rate": 0.5142857142857142,
"o_win_rate": 0.0,
"draw_rate": 0.4857142857142857,
"average_game_moves": 7.142857142857143,
"policy_loss": 1.9038925133645535,
"value_loss": 0.3203776921145618
},
{
"iteration": 3,
"replay_examples": 12328,
"x_win_rate": 0.42857142857142855,
"o_win_rate": 0.014285714285714285,
"draw_rate": 0.5571428571428572,
"average_game_moves": 7.5,
"policy_loss": 1.4543613067695074,
"value_loss": 0.26955098012576295
},
{
"iteration": 4,
"replay_examples": 16456,
"x_win_rate": 0.5142857142857142,
"o_win_rate": 0.0,
"draw_rate": 0.4857142857142857,
"average_game_moves": 7.371428571428571,
"policy_loss": 1.229265012878638,
"value_loss": 0.22285609325537314
},
{
"iteration": 5,
"replay_examples": 20952,
"x_win_rate": 0.2857142857142857,
"o_win_rate": 0.0,
"draw_rate": 0.7142857142857143,
"average_game_moves": 8.028571428571428,
"policy_loss": 1.1138035529633847,
"value_loss": 0.1854344406960214
},
{
"iteration": 6,
"replay_examples": 24000,
"x_win_rate": 0.3142857142857143,
"o_win_rate": 0.014285714285714285,
"draw_rate": 0.6714285714285714,
"average_game_moves": 7.957142857142857,
"policy_loss": 1.0146886479664357,
"value_loss": 0.15539901554980812
},
{
"iteration": 7,
"replay_examples": 24000,
"x_win_rate": 0.2571428571428571,
"o_win_rate": 0.0,
"draw_rate": 0.7428571428571429,
"average_game_moves": 8.085714285714285,
"policy_loss": 0.8795330280319174,
"value_loss": 0.11288299490796759
},
{
"iteration": 8,
"replay_examples": 24000,
"x_win_rate": 0.24285714285714285,
"o_win_rate": 0.0,
"draw_rate": 0.7571428571428571,
"average_game_moves": 8.314285714285715,
"policy_loss": 0.7982094690520712,
"value_loss": 0.09204166978993948
},
{
"iteration": 9,
"replay_examples": 24000,
"x_win_rate": 0.3,
"o_win_rate": 0.014285714285714285,
"draw_rate": 0.6857142857142857,
"average_game_moves": 7.985714285714286,
"policy_loss": 0.7609958442601752,
"value_loss": 0.09048273768077822
},
{
"iteration": 10,
"replay_examples": 24000,
"x_win_rate": 0.2857142857142857,
"o_win_rate": 0.0,
"draw_rate": 0.7142857142857143,
"average_game_moves": 8.17142857142857,
"policy_loss": 0.7380844823857571,
"value_loss": 0.08676699136799955
},
{
"iteration": 11,
"replay_examples": 24000,
"x_win_rate": 0.18571428571428572,
"o_win_rate": 0.0,
"draw_rate": 0.8142857142857143,
"average_game_moves": 8.371428571428572,
"policy_loss": 0.7269294456915653,
"value_loss": 0.074583658938633
},
{
"iteration": 12,
"replay_examples": 24000,
"x_win_rate": 0.3142857142857143,
"o_win_rate": 0.0,
"draw_rate": 0.6857142857142857,
"average_game_moves": 8.142857142857142,
"policy_loss": 0.7146875767948779,
"value_loss": 0.07327091548235175
},
{
"iteration": 13,
"replay_examples": 24000,
"x_win_rate": 0.22857142857142856,
"o_win_rate": 0.0,
"draw_rate": 0.7714285714285715,
"average_game_moves": 8.17142857142857,
"policy_loss": 0.7104355310823055,
"value_loss": 0.07133727120433717
},
{
"iteration": 14,
"replay_examples": 24000,
"x_win_rate": 0.2,
"o_win_rate": 0.0,
"draw_rate": 0.8,
"average_game_moves": 8.371428571428572,
"policy_loss": 0.7074488862714869,
"value_loss": 0.06895742299867437
}
],
"versus_random": {
"games": 400,
"wins": 384,
"draws": 16,
"losses": 0,
"win_rate": 0.96,
"non_loss_rate": 1.0,
"average_moves": 6.065
},
"versus_exact_minimax": {
"games": 200,
"wins": 0,
"draws": 200,
"losses": 0,
"win_rate": 0.0,
"non_loss_rate": 1.0,
"average_moves": 9.0
}
}
Backed-up artifact tree
README.md__pycache__/app.cpython-311.pyc__pycache__/game.cpython-311.pyc__pycache__/mcts.cpython-311.pyc__pycache__/model.cpython-311.pyc__pycache__/train.cpython-311.pycapp.pyartifacts/microzero/evaluation.jsonartifacts/microzero/model.safetensorsgame.pymcts.pymodel.pyrequirements.txttrain.py