教師データ生成は、評価関数やニューラルネットワークを学習するために、局面、指し手、評価値、勝敗結果、候補手分布などを作る工程である。コンピュータ将棋では、人間棋譜や既存エンジンの対局棋譜を変換する場合もあれば、自己対局で探索しながら新しい教師を作る場合もある。
AlphaZero 型の学習では、自己対局中の各局面 s に対して、MCTS の訪問回数から作った方策分布 π と、終局結果 z を教師として保存する。ニューラルネットワークは、局面から方策 p と価値 v を出力し、p を π に近づけ、v を z に近づけるように更新される。
通常の棋譜には、実際に指された手と最終結果は含まれるが、その局面で探索がどの候補手をどれだけ読んだかは含まれない。そのため、単純な棋譜変換で作った教師は、選ばれた一手を教師にすることはできても、AlphaZero 型の 訪問回数分布を方策教師にする という情報は持たない。
一方、MCTS による自己対局から教師を作る場合は、実際に選んだ手だけでなく、ルートで読まれた候補手と訪問回数を保存できる。この訪問回数分布は、方策ネットワークにとって 探索で改善された方策 を学ぶための重要な教師になる。
DeepLearningShogi の selfplay は、MCTS で対局を進めながら、学習用の局面を記録する。自己対局の開始局面は HuffmanCodedPos で与えられ、終局後に一局分の情報を HuffmanCodedPosAndEval3、各手の情報を MoveInfo、候補手の訪問回数を MoveVisits として出力する。これらは hcpe3 形式の中核を構成する。
実装上は、各手で選ばれた手、探索後の評価値、候補手数を MoveInfo に保存し、候補手ごとの move16 と visitNum を MoveVisits に保存する。自己対局で学習対象になる局面では、ルート子ノードの訪問回数を集めて候補手分布を作る。Dirichlet noise を入れている場合は、教師として保存する前にノイズ由来の訪問回数を差し引く処理も行われている。
一局全体のヘッダである HuffmanCodedPosAndEval3 には、開始局面、手数、終局結果、対局相手種別を表す opponent が含まれる。opponent は、純粋な自己対局、先手側 USI エンジン、後手側 USI エンジンなど、データの由来を区別するために使われる。
dlshogi では、教師データ形式として hcpe 系のバイナリ形式が使われる。古い HuffmanCodedPosAndEval / HuffmanCodedPosAndEval2 は、局面、評価値、最善手、結果を比較的単純に保持する形式である。
hcpe3 は、AlphaZero 型の学習で必要になる一局単位・候補手分布単位の情報を扱いやすくした形式である。局面ごとに、選択手、探索評価、候補手数、候補手ごとの訪問回数を保持できるため、学習時には方策分布、勝敗結果、価値教師を復元しやすい。
Python 側の Hcpe3DataLoader は、hcpe3 やキャッシュを読み込み、入力特徴量、方策分布、結果、価値をミニバッチとして返す。学習スクリプトでは、このデータローダを通じて policy loss、value loss、result loss などの学習に使う。
教師データの主なデータ源は次の通りである。
第36回世界コンピュータ将棋選手権の dlshogi アピール文書では、60 ブロック 768 フィルタのモデルから蒸留したデータ、自己対局データ、NNUE 系との対局データを用い、重複を平均化して 42.4 億局面にしたと説明されている。これは、実戦的な dlshogi の学習では、純粋な自己対局だけでなく複数の由来の教師データを混ぜている例である。
大量の教師データをそのまま学習に使うと、重複局面、評価値の揺れ、データ源ごとの偏り、入出力変換のコストが問題になる。そのため dlshogi には、hcpe3 の統計取得、分割、再評価、キャッシュ作成、キャッシュ結合、旧形式との変換などの補助スクリプトが用意されている。
学習時には、重複局面の平均化、評価値補正、候補手分布への温度適用、キャッシュ利用などを選べる。これらは単なる高速化だけでなく、同じ局面が何度も出ることによる重み付けや、探索訪問回数の尖り具合にも影響する。