Skip to content

Triumviratus 5.0

Latest

Choose a tag to compare

@Tors3 Tors3 released this 26 Jun 08:54
· 3 commits to main since this release

Triumviratus 5.0 — release notes

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.

Credits

  • Stockfish (GPLv3) — the SFNNv13 NNUE evaluation and architecture.
  • Fathom (MIT) — Syzygy tablebase probing.
  • Search and engine by Francesco Torsello.
  • Thanks to Maurizio Platino for the SPSA search-tuning and extensive testing throughout the project.