ParallaxOpen's picture
Upload README.md with huggingface_hub
912e0dd verified
|
Raw History Blame
3.12 kB
---
language: en
license: cc-by-nc-4.0
tags:
- chess
- chess-engine
- transformer
- from-scratch
- small-model
- mcts
---
# Parallax-Chess-Preview
A chess engine trained from scratch on a single laptop GPU (RTX 5060). Uses a 25.9M parameter transformer with Monte Carlo Tree Search (MCTS) for move selection.
## What's Inside
- **25.9M param transformer** trained on 200K+ positions with Stockfish evaluations
- **Policy network**: predicts best move from board state (4352-class output covering all possible moves)
- **Value network**: evaluates positions in centipawns (trained on Stockfish depth-10 evaluations)
- **MCTS search**: looks ahead multiple moves using the neural network for evaluation
- **Custom chess tokenizer**: no external tokenizer needed β€” pure chess-aware encoding
- **Tkinter GUI**: interactive chess board with click-to-move interface
## Performance
| Metric | Value |
|--------|-------|
| Parameters | 25.9M |
| Training data | 200K Stockfish-evaluated positions + 143K puzzles |
| Training time | ~2 hours on RTX 5060 |
| Policy loss | 8.47 β†’ 2.50 (4352-class prediction) |
| Speed (greedy) | ~19 moves/sec |
| Speed (MCTS 200 sims) | ~2 moves/sec |
| Estimated ELO | ~800-1000 (greedy), ~1200-1500 (MCTS) |
| Opens with | e2e4, Nf3, Ruy Lopez β€” real chess openings |
## Quick Start
### Greedy (fast, weaker)
```python
from train_v3 import ParallaxChessV3
import chess
model = ParallaxChessV3.load("model.pt")
board = chess.Board()
move = model.predict_move(board)
print(move.uci()) # e.g. "e2e4"
```
### MCTS Search (slower, stronger)
```python
from mcts_engine import ParallaxChessMCTS
engine = ParallaxChessMCTS("model.safetensors")
board = chess.Board()
move = engine.choose_move(board, n_simulations=200)
print(move.uci())
```
### Interactive GUI
```bash
python play_gui.py
```
Click pieces to select, click again to move. Legal moves shown as dots.
## Architecture
```
ParallaxChessV3(
board_encoder: Embedding(402, 512),
backbone: SmallLM(8 layers, 512 dim, 8 heads, GQA 4:2),
policy_head: Linear(512, 4352), # from_sq * 64 + to_sq
value_head: Linear(512, 256) β†’ Linear(256, 1) β†’ Tanh
)
```
## Training Details
1. **Data**: 200K positions from Stockfish self-play (depth 10) + 143K Lichess puzzles
2. **Policy target**: Stockfish best move as move index (from_square Γ— 64 + to_square)
3. **Value target**: Stockfish centipawn evaluation (scaled to [-1, 1])
4. **Optimizer**: AdamW (lr=1e-3, weight_decay=0.01, cosine schedule)
5. **Augmentation**: 50% horizontal board flip
## What This Proves
- A 25.9M param model can learn real chess openings from scratch
- Policy + value heads can be trained simultaneously on a single GPU
- MCTS search can boost a weak neural player to competitive play
- Custom chess encoding (no tokenizer dependency) works well
## Limitations
- ~1000-1500 ELO (intermediate club player)
- Weak in endgames (training data biased toward openings/middlegame)
- No opening book β€” learns openings from training data only
- MCTS adds ~10x latency per move
## License
CC BY-NC 4.0 (weights), AGPL-3.0 (code)