アーキテクチャ
Manaka は CPU を主対象にした評価器です。設計上の中心条件は、ヘッドへ入る前の状態をトークンごとの寄与の和として表せることです。これにより、着手で変わった部分だけを加減算して評価器を更新できます。
エンジンと学習器は MNW1 重み形式を共有します。現在はバージョン 5。構成定義の正本は crates/manaka-core/src/params.rs、名前の構文は shape.rs です。
基本構造
局面をトークンへ変換し、2 つの視点で保持します。固有トークンでは、駒種・所有者・マスを 1 トークンで表し、持ち駒は単項状態を使います。
局面
→ トークン
→ 差分更新する集約値
べき和 / 対称多項式
任意のペア表
任意の二次モーメント
任意の盤面フィールド
→ W1 → ReLU [→ 任意の W2 → ReLU]
→ 価値
→ 方策 + 移動駒項 + 任意の移動先フィールド項有効な各ブロックがトークン和として表せるため、アキュムレータは安く更新できます。和より後ろの部分は、評価ノードごとに毎回すべて計算します。
基準構成
歴史的な基準は pair16_d128_o3_h512 です。
- 埋め込み幅
d=128 - 対称多項式の次数
o=3 - 隠れ幅
h=512 - フルランクのペア表
pair=16 - 第2隠れ層、モーメント、盤面フィールドなし
約4,580万パラメータで、大半はペア表です。現在の絶対速度は ベンチマーク を参照してください。
集約ブロック
べき和
トークン埋め込み e(z) に対し、
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 固有トークン |
kp | YaneuraOu 互換 KP |
halfkp | YaneuraOu 互換 HalfKP |
KP / HalfKP は、NNUE 型特徴量の効果を測るための比較用です。検証結果は NNUE特徴量比較 を参照してください。
HalfKP は自玉位置が全特徴 ID に含まれるため、玉移動時はアキュムレータ全体の再構築が必要です。4 トークンだけの差分更新では足りません。
nnue 演算
nnue 接尾辞は、Manaka 通常演算ではなく NNUE 書き出し互換の形へ切り替えます。RMS 正規化を外し、隠れ活性を クリップ し、価値出力を線形にします。NNUE 書き出しで表現できる構成だけを許可します。
kp は特徴番号、nnue は順伝播形式を指定するため、両者は独立です。
方策と価値
価値ヘッドは最後の隠れベクトルから 1 値を出します。
方策は共通の 2,187 ラベル空間を使い、次を組み合わせます。
- ラベルごとの重みと隠れベクトルの積。
policy_fromによる移動駒・移動元の情報。field_dim > 0の場合、移動先マスのフィールド項。
これにより、初期試作にあった「同じラベルで別の移動駒を区別できない」問題は解消されています。