定跡自動生成

定跡自動生成は、エンジンの探索結果や自己対局結果を用いて、定跡ファイルを半自動または全自動で構築する考え方である。 近年の将棋AIでは、学習済み評価関数や大量の計算資源を背景に、大規模な定跡生成が実戦的なテーマになっている。

概要

将棋ソフトの定跡は、かつては人手で編集する比重が大きかった。 しかし近年は、

  • エンジンを長時間回して候補手を掘る
  • 分岐先の勝率や評価値を使って枝を残す
  • 悪い変化や重複を整理する

という流れを自動化する試みが進んでいる。

やねうら王公式サイトでも、2024年1月14日の記事で「大規模定跡時代」に入ったと説明されており、 完全自動生成か、人手の確認を挟む半自動生成かは違っても、 各チームが独自に大規模定跡を持つ方向へ移っていると整理されている。

何を自動化するのか

定跡自動生成では、主に次の工程を機械化する。

  • 開始局面や互角局面集を起点に探索する
  • 候補手を複数保持して分岐木を広げる
  • 評価値、勝率、千日手率、採用頻度などで枝を絞る
  • 同一局面や近い局面をまとめる
  • 最後に定跡ファイルへ書き出す

このため、単なる探索高速化だけでなく、 時間管理、局面管理、ハッシュ、定跡フォーマット設計も関わる。

人手編集との違い

人手編集の定跡は、分かりやすさや思想を反映しやすい。 一方、自動生成は

  • 深い探索結果を大量に取り込める
  • 既存定跡にない枝も掘りやすい
  • 評価関数や探索器を更新したら作り直せる

という利点がある。

ただし、誤った評価や偏った初期局面から生成すると、 定跡全体に癖や偏りが残ることがある。

実装例

概念的には次のようなループになる。

for (const Position& seed : seedPositions) {
    std::queue<Position> queue;
    queue.push(seed);

    while (!queue.empty()) {
        Position pos = queue.front();
        queue.pop();

        auto candidates = searchBookMoves(pos, depthLimit);
        auto selected = selectPromisingMoves(candidates);

        book.store(pos, selected);

        for (const auto& move : selected) {
            queue.push(doMove(pos, move.move));
        }
    }
}

実際には、

  • 既出局面の除去
  • 並列探索
  • 探索失敗時の再試行
  • 定跡サイズ制限

などを追加することが多い。

関連する記事

注意点

  • 強い探索器でも、序盤では評価の揺れが大きいことがある
  • 学習データ生成と同じく、開始局面の偏りが成果物へ残る
  • 巨大定跡は強いが、配布や差分管理が重くなりやすい

関連項目

参考にしたホームページ