Tapered Eval

Tapered Eval は、 中盤用評価と終盤用評価をゲームフェーズに応じて滑らかに混ぜる手法である。 局面段階の変化による評価の不連続を減らせるため、 手作り評価で広く使われている。

概要

将棋でもチェスでも、

  • 中盤では王の安全や駒の連携が重要
  • 終盤では王の活動性や駒の単独性能が重要

になりやすい。

もし中盤評価と終盤評価を完全に切り替えると、 局面が少し変わっただけで評価値が急に飛ぶことがある。

Tapered Eval は、

  • opening / middlegame score
  • endgame score
  • game phase

を使って両者を線形補間する。

実装例

int taperedEval(const Position& pos) {
    int mg = evaluateMiddleGame(pos);
    int eg = evaluateEndGame(pos);
    int phase = gamePhase(pos);   // 0..256

    return (mg * phase + eg * (256 - phase)) / 256;
}

gamePhase() は典型的には、 大駒や駒数の残り具合から計算する。

将棋AIでの位置づけ

将棋では持ち駒や成りがあるため、 チェスより phase の設計が少し難しい。 それでも、

の重みが局面段階で変わるのは自然である。

そのため、手作り評価を組む際の基本テクニックとして有用である。

NNUE との関係

NNUE では明示的な tapered eval をそのまま使わないことも多いが、 「局面段階で特徴の意味が変わる」という考え方自体は依然重要である。

また、手作り評価と NNUE を併用する場合には、 一部項目だけ tapered にする設計もありうる。

注意点

  • phase の定義が悪いと重みづけが不自然になる
  • 中盤評価と終盤評価で同じ特徴を二重に数えやすい
  • 将棋では持ち駒込みの phase 設計が悩ましい

関連項目

参考にしたホームページ