評価関数
評価関数は、ある局面がどれくらい良いか悪いかを数値で表す仕組みである。
探索は先読みの枠組みを提供し、評価関数は葉局面の良し悪しを与える。
この2つが合わさって、将棋AIは手を選ぶ。
概要
ミニマックス法やnegamaxでは、
探索の途中で深さ制限に達した局面に値を与える必要がある。
その役割を担うのが評価関数である。
評価関数は通常、
となるように設計される。
古典的な評価要素
古典的な手作り評価では、次のような特徴量を足し合わせることが多い。
- 駒得
- 駒の位置
- 玉の安全度
- 駒の働き
- 歩や持ち駒の形
- 攻めと受けのバランス
チェスでは Shannon の線形評価式が出発点として有名であり、
将棋でも同様に複数の特徴量を重み付き和で足し合わせる設計が広く用いられてきた。
実装例
単純化した例では、駒得と簡単な位置評価だけで書ける。
int evaluate(const Position& pos) {
int score = 0;
score += materialScore(pos);
score += pieceSquareScore(pos);
score += kingSafetyScore(pos);
score += mobilityScore(pos);
return pos.sideToMove() == BLACK ? -score : score;
}
手作り評価関数と機械学習
評価関数には大きく分けて、
- 人手で特徴量と重みを設計する方式
- 機械学習で重みを調整する方式
がある。
将棋では、
- Bonanza 系の特徴量学習
- KPPT 系
- NNUE
といった発展が大きな流れである。
将棋実装で重要な話題
Hand-Crafted Evaluation
Evaluation Overlap
進行度
Material
- 詳細: Material
- 駒の価値の総量やバランスを見る評価項目。
- 持ち駒を含む将棋では特に重要な基礎評価である。
Tapered Eval
- 詳細: Tapered Eval
- 中盤用評価と終盤用評価をゲームフェーズに応じて滑らかに混ぜる手法。
- 局面段階の変化による評価の飛びを減らすのに役立つ。
King Safety
- 詳細: King Safety
- 王の周辺がどれだけ安全かを評価する項目。
- 囲いや玉頭の厚み、王周辺への利きなどを数えるのが典型である。
Mobility
- 詳細: Mobility
- 駒がどれだけ自由に働けるかを見る評価項目。
- 飛車角の通りや成駒の活動性など、将棋でも重要な指標になる。
Piece-Square Tables
ニューラルネットワーク
- 詳細: ニューラルネットワーク
- 局面特徴から評価値や方策を学習するモデルの総称。
- NNUE や policy/value network を理解する入口になる。
NNUE
- 詳細: NNUE
- 将棋発の高速なニューラルネットワーク型評価関数。
- CPU 上での差分更新を重視しており、alpha-beta 系探索との相性が良い。
SFNNwoP
- 詳細: SFNNwoP
- 近年の将棋AIで使われている NNUE 系の評価アーキテクチャの一種。
- 公開情報では
SFNNwoP1536 や NNUE_SFNNwoP1536 のような形で現れることが多い。
Training an nnue
Minimax Tree Optimization
パターン認識
- 詳細: パターン認識
- 駒の配置や関係から意味のある形を捉えて評価へ使う考え方。
- 手作り評価と学習評価の両方に関わる。
三駒関係
- 詳細: 三駒関係
- 玉と2駒の関係を特徴量として持たせる発想。
- KPPT 系や Bonanza 系の評価関数を読む入口になる。
BonaPiece
- 詳細: BonaPiece
- Bonanza 系で使われる駒番号体系。
- 特徴量配列の添字と差分更新の基盤になる。
elmo式学習
- 詳細: elmo式学習
- 評価値だけでなく勝敗情報も教師へ混ぜる方向の学習法として語られる。
- WCSC27 以後の実戦的な学習評価の流れを理解しやすい。
nnue-pytorch
- 詳細: nnue-pytorch
- NNUE 学習器の代表的公開実装。
- 将棋向け NNUE 学習環境を設計する際の参照先として便利である。
知識蒸留
- 詳細: 知識蒸留
- 強い教師モデルの知識を軽いモデルへ移す学習法。
- NNUE や policy/value 系の軽量化とも相性が良い。
探索との関係
評価関数だけが強くても、探索が浅いと tactical miss が起こる。
逆に探索だけ深くても、評価関数が弱いと局面判断を誤る。
そのため、将棋AIでは
をセットで調整する必要がある。
NNUE との関係
近年の将棋AIでは、CPU 上で高速に使える学習評価関数として
NNUEが広く使われている。
そのため現在の評価関数記事では、手作り評価の総論と NNUE への橋渡しの両方が重要である。
注意点
- 特徴量同士に重複があると調整しにくくなる
- 探索と評価の役割分担が曖昧だと保守しにくい
- 手番基準の符号規約を崩すと探索コードと噛み合わなくなる
関連項目
参考にしたホームページ