# 評価関数
評価関数は、ある局面がどれくらい良いか悪いかを数値で表す仕組みである。
[探索](/shogi/shogiwiki/search/)は先読みの枠組みを提供し、評価関数は葉局面の良し悪しを与える。
この2つが合わさって、将棋AIは手を選ぶ。
## 概要
[ミニマックス法](/shogi/shogiwiki/search/minimax/)や[negamax](/shogi/shogiwiki/search/negamax/)では、
探索の途中で深さ制限に達した局面に値を与える必要がある。
その役割を担うのが評価関数である。
評価関数は通常、
- 手番側にとって良い局面なら正
- 悪い局面なら負
となるように設計される。
## 古典的な評価要素
古典的な手作り評価では、次のような特徴量を足し合わせることが多い。
- 駒得
- 駒の位置
- 玉の安全度
- 駒の働き
- 歩や持ち駒の形
- 攻めと受けのバランス
チェスでは Shannon の線形評価式が出発点として有名であり、
将棋でも同様に複数の特徴量を重み付き和で足し合わせる設計が広く用いられてきた。
## 実装例
単純化した例では、駒得と簡単な位置評価だけで書ける。
```cpp
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](/shogi/shogiwiki/evaluation-function/nnue/)
といった発展が大きな流れである。
## 将棋実装で重要な話題
### Hand-Crafted Evaluation
- 詳細: [Hand-Crafted Evaluation](/shogi/shogiwiki/evaluation-function/hand-crafted-evaluation/)
- 人手で特徴量と重みを設計する古典的な評価関数。
- [NNUE](/shogi/shogiwiki/evaluation-function/nnue/) 以前の評価設計を理解する土台になる。
### Evaluation Overlap
- 詳細: [Evaluation Overlap](/shogi/shogiwiki/evaluation-function/evaluation-overlap/)
- 複数の評価項目が同じ局面要素を二重に数えてしまう問題。
- 手作り評価を大きくするほど重要になる設計論である。
### 進行度
- 詳細: [進行度](/shogi/shogiwiki/evaluation-function/game-phase/)
- 局面がどれだけ序盤寄りか中盤寄りか終盤寄りかを表す指標。
- [Tapered Eval](/shogi/shogiwiki/evaluation-function/tapered-eval/) や項目重みの切り替えに使われる。
### Material
- 詳細: [Material](/shogi/shogiwiki/evaluation-function/material/)
- 駒の価値の総量やバランスを見る評価項目。
- 持ち駒を含む将棋では特に重要な基礎評価である。
### Tapered Eval
- 詳細: [Tapered Eval](/shogi/shogiwiki/evaluation-function/tapered-eval/)
- 中盤用評価と終盤用評価をゲームフェーズに応じて滑らかに混ぜる手法。
- 局面段階の変化による評価の飛びを減らすのに役立つ。
### King Safety
- 詳細: [King Safety](/shogi/shogiwiki/evaluation-function/king-safety/)
- 王の周辺がどれだけ安全かを評価する項目。
- 囲いや玉頭の厚み、王周辺への利きなどを数えるのが典型である。
### Mobility
- 詳細: [Mobility](/shogi/shogiwiki/evaluation-function/mobility/)
- 駒がどれだけ自由に働けるかを見る評価項目。
- 飛車角の通りや成駒の活動性など、将棋でも重要な指標になる。
### Piece-Square Tables
- 詳細: [Piece-Square Tables](/shogi/shogiwiki/evaluation-function/piece-square-tables/)
- 駒種ごとに「どの升にいると良いか」を表形式で持つ評価手法。
- 手作り評価の入門として扱いやすく、差分更新もしやすい。
### ニューラルネットワーク
- 詳細: [ニューラルネットワーク](/shogi/shogiwiki/evaluation-function/neural-networks/)
- 局面特徴から評価値や方策を学習するモデルの総称。
- NNUE や policy/value network を理解する入口になる。
### NNUE
- 詳細: [NNUE](/shogi/shogiwiki/evaluation-function/nnue/)
- 将棋発の高速なニューラルネットワーク型評価関数。
- CPU 上での差分更新を重視しており、alpha-beta 系探索との相性が良い。
### SFNNwoP
- 詳細: [SFNNwoP](/shogi/shogiwiki/evaluation-function/sfnnwop/)
- 近年の将棋AIで使われている [NNUE](/shogi/shogiwiki/evaluation-function/nnue/) 系の評価アーキテクチャの一種。
- 公開情報では `SFNNwoP1536` や `NNUE_SFNNwoP1536` のような形で現れることが多い。
### Training an nnue
- 詳細: [Training an nnue](/shogi/shogiwiki/evaluation-function/training-an-nnue/)
- NNUE 型評価関数の学習工程を扱う記事。
- 教師データ、量子化、エンジンとの整合が重要になる。
### Minimax Tree Optimization
- 詳細: [Minimax Tree Optimization](/shogi/shogiwiki/evaluation-function/minimax-tree-optimization/)
- 探索木の情報を使って評価関数を学習する考え方。
- Bonanza method と強く結び付いた歴史的に重要な話題。
### パターン認識
- 詳細: [パターン認識](/shogi/shogiwiki/evaluation-function/pattern-recognition/)
- 駒の配置や関係から意味のある形を捉えて評価へ使う考え方。
- 手作り評価と学習評価の両方に関わる。
### 三駒関係
- 詳細: [三駒関係](/shogi/shogiwiki/evaluation-function/three-piece-relationship/)
- 玉と2駒の関係を特徴量として持たせる発想。
- KPPT 系や Bonanza 系の評価関数を読む入口になる。
### BonaPiece
- 詳細: [BonaPiece](/shogi/shogiwiki/evaluation-function/bonapiece/)
- Bonanza 系で使われる駒番号体系。
- 特徴量配列の添字と差分更新の基盤になる。
### elmo式学習
- 詳細: [elmo式学習](/shogi/shogiwiki/evaluation-function/elmo-style-learning/)
- 評価値だけでなく勝敗情報も教師へ混ぜる方向の学習法として語られる。
- WCSC27 以後の実戦的な学習評価の流れを理解しやすい。
### nnue-pytorch
- 詳細: [nnue-pytorch](/shogi/shogiwiki/evaluation-function/nnue-pytorch/)
- NNUE 学習器の代表的公開実装。
- 将棋向け NNUE 学習環境を設計する際の参照先として便利である。
### 知識蒸留
- 詳細: [知識蒸留](/shogi/shogiwiki/evaluation-function/knowledge-distillation/)
- 強い教師モデルの知識を軽いモデルへ移す学習法。
- NNUE や policy/value 系の軽量化とも相性が良い。
## 探索との関係
評価関数だけが強くても、探索が浅いと tactical miss が起こる。
逆に探索だけ深くても、評価関数が弱いと局面判断を誤る。
そのため、将棋AIでは
- [探索](/shogi/shogiwiki/search/)
- [静止探索](/shogi/shogiwiki/search/quiescence-search/)
- 評価関数
をセットで調整する必要がある。
## NNUE との関係
近年の将棋AIでは、CPU 上で高速に使える学習評価関数として
[NNUE](/shogi/shogiwiki/evaluation-function/nnue/)が広く使われている。
そのため現在の評価関数記事では、手作り評価の総論と NNUE への橋渡しの両方が重要である。
## 注意点
- 特徴量同士に重複があると調整しにくくなる
- 探索と評価の役割分担が曖昧だと保守しにくい
- 手番基準の符号規約を崩すと探索コードと噛み合わなくなる
## 関連項目
- [探索](/shogi/shogiwiki/search/)
- [ミニマックス法](/shogi/shogiwiki/search/minimax/)
- [negamax](/shogi/shogiwiki/search/negamax/)
- [静止探索](/shogi/shogiwiki/search/quiescence-search/)
- [NNUE](/shogi/shogiwiki/evaluation-function/nnue/)
- [Piece-Square Tables](/shogi/shogiwiki/evaluation-function/piece-square-tables/)
- [三駒関係](/shogi/shogiwiki/evaluation-function/three-piece-relationship/)
- [BonaPiece](/shogi/shogiwiki/evaluation-function/bonapiece/)
## 参考にしたホームページ
- [Chessprogramming Wiki: Evaluation](https://www.chessprogramming.org/Evaluation)
- [Chessprogramming Wiki: Evaluation Function](https://www.chessprogramming.org/Evaluation_Function)
- [Chessprogramming Wiki: Neural Networks](https://www.chessprogramming.org/Neural_Networks)
- [やねうら王公式サイト: MAKE Evaluate Function](https://yaneuraou.yaneu.com/2020/11/17/make-evaluate-function/)
- [arXiv: 1710.10967](https://arxiv.org/abs/1710.10967)