Triumviratus is a strong, UCI-compliant chess engine written in C++.
Author: Francesco (fraTorsello)
Triumviratus 5.0 what's new?
Triumviratus 5.0 is the first release built on the threats-based SFNNv13 NNUE, and the first to ship
the project's second own-lineage network, rubicon-alea-v1 — trained from scratch, with no Stockfish
network shipped. In internal self-play (20+0.2) it measures ≈ +50 Elo over 4.2.
The threats architecture (SFNNv13)
The evaluation is a NNUE with the feature set Full_Threats + HalfKAv2_hm^:
HalfKAv2_hm^ — the standard king-bucketed input: every piece is encoded as a
(king square, piece, square) feature, so the network sees each piece relative to its own king.
The ^ marks the factorized variant used during training.
Full_Threats — the new part. On top of the piece-square features, the network is fed explicit
threat features: pairs Piece(square) → Piece(square) where the second piece lies in the
attack set of the first ("who is attacking whom"). This hands the evaluation the tactical
relationships of the position directly, instead of forcing it to re-derive them from raw piece
placement — which is why threats-based nets evaluate sharper, deep-friendly positions better.
Network shape: L1 = 1024, L2 = 31, L3 = 32, with 8 output buckets (selected by piece count).
Inputs are sparse (only the active features fire), and the first layer is updated incrementally as
moves are made/unmade — the "efficiently updatable" in NNUE.
How rubicon-alea-v1 was trained
Trainer: nnue-pytorch (Stockfish's official trainer), following the threats.yaml recipe.
Training was staged, exactly how Stockfish trains its own networks — strong synthetic data first,
then human-like self-play data, with the learning rate and the loss-blend λ annealing down:
Stage Data lr λ (start → end) ~epochs
1 Stockfish-generated 5000-node positions (public vondele packs, ~136 GB) 1.5e-3 1.0 → 0.75 250
2 Leela Chess Zero self-play (test79 / test80, 2023–2024) 1.3e-3 0.74 ~600
Other key settings: batch 65536, optimizer rangerlite, one-cycle LR schedule, factorized weight-decay,
early/random fen-skipping. Stage 2 resumes from the Stage-1 weights. Trained on a single
GCP g4 (NVIDIA RTX PRO 6000 Blackwell).
Trajectory (measured directly against the strongest current Stockfish network, at long time control):
End of Stage 1: −84 Elo vs the Stockfish net.
Final (after Stage 2's anneal): −40 Elo — the gap halved.
Own-lineage networks plateau below the Stockfish net (this is expected — even Leela's pure-RL net sits
well under Stockfish); −40 from scratch is a strong result. What matters for the engine: 5.0 with
rubicon-alea-v1 is ≈ +50 Elo over 4.2 (whose own net, rubicon-v1, was an older non-threats build).
What "own-lineage" means
The network weights are the project's own — trained from our own data pipeline, with no Stockfish
network used as a seed. The NNUE inference code and the architecture are Stockfish's (GPLv3), and
the trainer is Stockfish's nnue-pytorch. So Triumviratus is GPLv3 and preserves Stockfish's
copyright notices — the evaluation values are ours, the evaluation machinery is honestly credited to
Stockfish.
Search & engine
An original, heavily SPSA-co-tuned alpha-beta search (PVS, iterative deepening, aspiration windows;
NMP, LMR, reverse-futility / futility, razoring, LMP, SEE pruning, capture-futility, singular / double /
triple extensions, multi-cut, ProbCut, correction & continuation history, threat-aware move ordering),
multi-threaded Lazy SMP, and Syzygy tablebases via Fathom. Release binaries are clang PGO-built.
Comments
Post a Comment