Value99 β€” 24Γ—576 scalar value net (ChessFENS)

From-scratch 98,920,577-parameter value transformer. No policy head, no recurrence, no pretrained trunk.

V(s) ∈ [-1, 1] is side-to-move P(win) βˆ’ P(loss) after the board is canonicalized so STM is White. A move is scored as βˆ’V(child) (one ply, no search).

Training

  • Data: Maxlegrec/ChessFENS 0d8d4e6bbda49d42e84c3272be026701659a457c (LC0 STM WDL). One pass; this file is step 27324 / 13,989,888 positions (batch 512, microbatch 64).
  • Arch: 24 layers, width 576, 8 heads, SwiGLU-ish FFN inner 1584, square value mixer 128.
  • Optimizer: Polar-NorMuon (2D) + AdamW (norms), torch.compile, bf16, gradient checkpointing.
  • Not Stockfish official WDL. LC0 and SF19 WDL are different teachers.

Play strength (one-ply)

Search-free argmax of βˆ’V(successor) vs Stockfish 19 UCI_LimitStrength. Step 22000 screen: ~1320 UCI_Elo, bracketed 1320–1450 (16 games/level, 8 openings Γ— both colors). Not FIDE / Lichess Elo.

Files

  • latest.pt β€” inference weights + config at step 27324 (no optimizer).
  • model_config.json
  • chess_value99.py β€” architecture + pack_board / score_legal_moves
import torch
from chess_value99 import ValueConfig, ValueTransformer, score_legal_moves

ckpt = torch.load("latest.pt", map_location="cpu", weights_only=False)
model = ValueTransformer(ValueConfig(**ckpt["config"]))
model.load_state_dict(ckpt["model"])
model.eval()

Paused mid-run to start ChessBot PPO. Not a finished epoch.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support