Skip to content

アーキテクチャ

Manaka は CPU を主対象にした評価器です。設計上の中心条件は、ヘッドへ入る前の状態をトークンごとの寄与の和として表せることです。これにより、着手で変わった部分だけを加減算して評価器を更新できます。

エンジンと学習器は MNW1 重み形式を共有します。現在はバージョン 5。構成定義の正本は crates/manaka-core/src/params.rs、名前の構文は shape.rs です。

基本構造

局面をトークンへ変換し、2 つの視点で保持します。固有トークンでは、駒種・所有者・マスを 1 トークンで表し、持ち駒は単項状態を使います。

text
局面
  → トークン
  → 差分更新する集約値
      べき和 / 対称多項式
      任意のペア表
      任意の二次モーメント
      任意の盤面フィールド
  → W1 → ReLU [→ 任意の W2 → ReLU]
  → 価値
  → 方策 + 移動駒項 + 任意の移動先フィールド項

有効な各ブロックがトークン和として表せるため、アキュムレータは安く更新できます。和より後ろの部分は、評価ノードごとに毎回すべて計算します。

基準構成

歴史的な基準は pair16_d128_o3_h512 です。

  • 埋め込み幅 d=128
  • 対称多項式の次数 o=3
  • 隠れ幅 h=512
  • フルランクのペア表 pair=16
  • 第2隠れ層、モーメント、盤面フィールドなし

約4,580万パラメータで、大半はペア表です。現在の絶対速度は ベンチマーク を参照してください。

集約ブロック

べき和

トークン埋め込み e(z) に対し、

text
p_k = Σ e(z)^k

を保持し、Newton の恒等式から基本対称多項式を復元します。順序に依存しない高次相互作用を持ちつつ、差分更新できます。

split は集約境界だけを変えます。各視点で自分の駒と相手の駒を別々に集約しますが、埋め込みパラメータは共有します。現在は固有トークン空間だけで使えます。

ペア表

pairN は、順序なしトークンペアごとに学習ベクトルを持ち、局面中の有効行を加算します。基準構成では最大の容量を持つブロックです。pair0 で無効化します。

lseN は最後の N チャネルを log-sum-exp 読み出しへ振り替えます。表幅や更新量は増えません。指数は書き出し時に表へ織り込み、エンジン側は読み出し時に対数を取ります。

ks は RMS 正規化で捨てる大きさもヘッドへ渡します。

追加ブロック

構成トークンブロック目的
h2N第2隠れ層ヘッドを深くする
mN二次モーメント Σ vvᵀチャネル間相互作用
fN盤面フィールド Σ K[token,s]マス単位の文脈を残す

各機能は独立に有効化できますが、評価ノードごとの計算量は増えます。実測結果は ネットワークの変遷 を参照してください。

特徴量空間

特徴量空間は、上の演算とは独立した指定です。

接尾辞入力空間
なしManaka 固有トークン
kpYaneuraOu 互換 KP
halfkpYaneuraOu 互換 HalfKP

KP / HalfKP は、NNUE 型特徴量の効果を測るための比較用です。検証結果は NNUE特徴量比較 を参照してください。

HalfKP は自玉位置が全特徴 ID に含まれるため、玉移動時はアキュムレータ全体の再構築が必要です。4 トークンだけの差分更新では足りません。

nnue 演算

nnue 接尾辞は、Manaka 通常演算ではなく NNUE 書き出し互換の形へ切り替えます。RMS 正規化を外し、隠れ活性を クリップ し、価値出力を線形にします。NNUE 書き出しで表現できる構成だけを許可します。

kp は特徴番号、nnue は順伝播形式を指定するため、両者は独立です。

方策と価値

価値ヘッドは最後の隠れベクトルから 1 値を出します。

方策は共通の 2,187 ラベル空間を使い、次を組み合わせます。

  1. ラベルごとの重みと隠れベクトルの積。
  2. policy_from による移動駒・移動元の情報。
  3. field_dim > 0 の場合、移動先マスのフィールド項。

これにより、初期試作にあった「同じラベルで別の移動駒を区別できない」問題は解消されています。

別ページに置く内容