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.

Explore every file View the full foundry

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.pyc
  • app.py
  • artifacts/microzero/evaluation.json
  • artifacts/microzero/model.safetensors
  • game.py
  • mcts.py
  • model.py
  • requirements.txt
  • train.py