# 教師データ生成 教師データ生成は、評価関数やニューラルネットワークを学習するために、局面、指し手、評価値、勝敗結果、候補手分布などを作る工程である。コンピュータ将棋では、人間棋譜や既存エンジンの対局棋譜を変換する場合もあれば、[自己対局](/shogi/shogiwiki/self-play/)で探索しながら新しい教師を作る場合もある。 [AlphaZero](/shogi/shogiwiki/alphazero/) 型の学習では、自己対局中の各局面 `s` に対して、MCTS の訪問回数から作った方策分布 `π` と、終局結果 `z` を教師として保存する。ニューラルネットワークは、局面から方策 `p` と価値 `v` を出力し、`p` を `π` に近づけ、`v` を `z` に近づけるように更新される。 ## 棋譜変換との違い 通常の棋譜には、実際に指された手と最終結果は含まれるが、その局面で探索がどの候補手をどれだけ読んだかは含まれない。そのため、単純な棋譜変換で作った教師は、選ばれた一手を教師にすることはできても、AlphaZero 型の `訪問回数分布を方策教師にする` という情報は持たない。 一方、MCTS による自己対局から教師を作る場合は、実際に選んだ手だけでなく、ルートで読まれた候補手と訪問回数を保存できる。この訪問回数分布は、方策ネットワークにとって `探索で改善された方策` を学ぶための重要な教師になる。 ## dlshogi における生成処理 DeepLearningShogi の `selfplay` は、MCTS で対局を進めながら、学習用の局面を記録する。自己対局の開始局面は `HuffmanCodedPos` で与えられ、終局後に一局分の情報を `HuffmanCodedPosAndEval3`、各手の情報を `MoveInfo`、候補手の訪問回数を `MoveVisits` として出力する。これらは [hcpe3](/shogi/shogiwiki/self-play/hcpe3/) 形式の中核を構成する。 実装上は、各手で選ばれた手、探索後の評価値、候補手数を `MoveInfo` に保存し、候補手ごとの `move16` と `visitNum` を `MoveVisits` に保存する。自己対局で学習対象になる局面では、ルート子ノードの訪問回数を集めて候補手分布を作る。Dirichlet noise を入れている場合は、教師として保存する前にノイズ由来の訪問回数を差し引く処理も行われている。 一局全体のヘッダである `HuffmanCodedPosAndEval3` には、開始局面、手数、終局結果、対局相手種別を表す `opponent` が含まれる。`opponent` は、純粋な自己対局、先手側 USI エンジン、後手側 USI エンジンなど、データの由来を区別するために使われる。 ## hcpe と hcpe3 dlshogi では、教師データ形式として `hcpe` 系のバイナリ形式が使われる。古い `HuffmanCodedPosAndEval` / `HuffmanCodedPosAndEval2` は、局面、評価値、最善手、結果を比較的単純に保持する形式である。 [hcpe3](/shogi/shogiwiki/self-play/hcpe3/) は、AlphaZero 型の学習で必要になる一局単位・候補手分布単位の情報を扱いやすくした形式である。局面ごとに、選択手、探索評価、候補手数、候補手ごとの訪問回数を保持できるため、学習時には方策分布、勝敗結果、価値教師を復元しやすい。 Python 側の `Hcpe3DataLoader` は、`hcpe3` やキャッシュを読み込み、入力特徴量、方策分布、結果、価値をミニバッチとして返す。学習スクリプトでは、このデータローダを通じて policy loss、value loss、result loss などの学習に使う。 ## データ源 教師データの主なデータ源は次の通りである。 - MCTS による自己対局データ。 - CSA 形式などの棋譜から変換したデータ。 - AobaZero など、別形式の対局データから変換したデータ。 - 既存モデルや強いモデルで再評価したデータ。 - 他エンジン、特に NNUE 系との対局データ。 - [知識蒸留](/shogi/shogiwiki/machine-learning/distillation/)により、大きなモデルや強いモデルの出力を反映したデータ。 第36回世界コンピュータ将棋選手権の dlshogi アピール文書では、60 ブロック 768 フィルタのモデルから蒸留したデータ、自己対局データ、NNUE 系との対局データを用い、重複を平均化して 42.4 億局面にしたと説明されている。これは、実戦的な dlshogi の学習では、純粋な自己対局だけでなく複数の由来の教師データを混ぜている例である。 ## 前処理とキャッシュ 大量の教師データをそのまま学習に使うと、重複局面、評価値の揺れ、データ源ごとの偏り、入出力変換のコストが問題になる。そのため dlshogi には、`hcpe3` の統計取得、分割、再評価、キャッシュ作成、キャッシュ結合、旧形式との変換などの補助スクリプトが用意されている。 学習時には、重複局面の平均化、評価値補正、候補手分布への温度適用、キャッシュ利用などを選べる。これらは単なる高速化だけでなく、同じ局面が何度も出ることによる重み付けや、探索訪問回数の尖り具合にも影響する。 ## 実務上の注意 - 棋譜変換データと自己対局データでは、方策教師の意味が異なる。 - MCTS の訪問回数分布は探索設定、温度、ノイズ、投了閾値、開始局面に影響される。 - 終局結果には勝ち、負け、引き分けだけでなく、千日手、入玉、最大手数到達などの扱いも関係する。 - データ源を混ぜる場合は、自己対局、他エンジン対局、蒸留データ、棋譜変換データの比率を意識する必要がある。 - 重複局面を平均するか、出現回数を重みとして残すかで、学習される分布が変わる。 - 教師データ生成用の探索設定と、実戦用の探索設定は必ずしも同じでよいとは限らない。 ## 関連項目 - [自己対局](/shogi/shogiwiki/self-play/) - [hcpe3](/shogi/shogiwiki/self-play/hcpe3/) - [AlphaZero](/shogi/shogiwiki/alphazero/) - [方策・価値ネットワーク](/shogi/shogiwiki/evaluation-function/policy-value-network/) - [dlshogi](/shogi/shogiwiki/softs/dlshogi/) - [MCTS](/shogi/shogiwiki/search/monte-carlo-tree-search/) - [Dirichlet noise](/shogi/shogiwiki/search/dirichlet-noise/) - [温度パラメータ](/shogi/shogiwiki/search/temperature/) - [知識蒸留](/shogi/shogiwiki/machine-learning/distillation/) ## 参考にしたホームページ - [David Silver, et al. "Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm"](https://arxiv.org/abs/1712.01815) - [TadaoYamaoka/DeepLearningShogi](https://github.com/TadaoYamaoka/DeepLearningShogi) - [DeepLearningShogi selfplay/self_play.cpp](https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/selfplay/self_play.cpp) - [DeepLearningShogi cppshogi/cppshogi.h](https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/cppshogi/cppshogi.h) - [DeepLearningShogi dlshogi/data_loader.py](https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/dlshogi/data_loader.py) - [dlshogi 第36回世界コンピュータ将棋選手権アピール文書](https://www.apply.computer-shogi.org/wcsc36/appeal/dlshogi/dlshogi_appeal_wcsc36.pdf)