学習データ形式
DLManaka と Manaka は同じ教師コーパスを使いますが、学習時の局面表現は別です。このページでは、両者の間で受け渡すデータ形式だけを説明します。コーパスの由来と整備方法は 教師データ を参照してください。
形式一覧
| 形式 | 書き込み側 | 読み込み側 |
|---|---|---|
コーパス .parquet | 整備スクリプト | 教師データ生成器 |
教師シャード .parquet | manaka-teacher | 両学習器 |
DMT1 / MNR1 ストリーム | 自己対局 | シャード生成器・学習器 |
自己対局 .parquet | build_shards.py, dl-manaka-teacher | DLManaka 学習器 |
シャードは、データセットをファイル単位に分割したものです。疎な方策データを圧縮しやすく、一般的なツールでも確認しやすいため Parquet を使います。
レコードストリーム
自己対局では、まず圧縮されたレコードストリームを書き出します。DLManaka は DMT1、Manaka は MNR1 を使います。数値はリトルエンディアンです。
text
DMT1 ヘッダ : magic u32 | version u16 | channels u16 | policy_size u32
レコード : flags u8 | ply u16 | game_id u32 | n_moves u16
value_z f32 | value_q f32 | packed [u8; PACKED_BYTES]
indices [u16; n_moves] | probs [f32; n_moves]MNR1 も考え方は同じですが、独自の圧縮幅を持ち、先頭の flags はありません。
ヘッダは互換性確認に使います。特徴量幅や方策サイズが実行側と一致しない場合は読み込みを拒否します。起動環境が標準出力へ文字列を出すことがあるため、読み込み側は先頭バイト固定ではなく、マジック値を探してレコード開始位置を判定します。
レコード内容
packed— ビット圧縮した局面。value_z— 手番側から見た最終対局結果。範囲は[-1, 1]。value_q— 同じ局面に対する探索評価。indices/probs— 合法手上の疎な方策。indicesは合法手マスクも兼ねる。ply/game_id— 手数と対局 ID。対局単位の安全な分割に使う。
合法手がない、値が [-1,1] を外れる、方策確率の合計が 1 から 1e-3 以上ずれる、といったレコードは書き込み時に拒否します。
自己対局 Parquet
build_shards.py は train/ と val/ に <prefix>-NNNNN.parquet を安全に書き込みます。
| 列 | 型 | 内容 |
|---|---|---|
ply | uint16 | 手数 |
game_id | uint32 | 対局 ID |
value_z | float32 | 勝敗の教師信号 |
value_q | float32 | 探索価値の教師信号 |
packed | 固定長バイナリ | 圧縮局面 |
aux_value | 欠損可の float32 | 任意の補助教師信号 |
indices | list<uint16> | 全合法手の方策ラベル |
prob_slots | list<uint16> | 非 0 確率の位置 |
probs | list<float32> | 非 0 確率 |
ストリーム側は合法手ごとに確率を 1 つ持ちます。Parquet 側では確率 0 の要素を省略し、prob_slots と probs だけを保存します。
旧形式
.npz— 旧 DLManaka シャード。読み込みのみ対応。CZR1—MNR1と同じレイアウトの旧名。読み込み可能。IZT1— 旧 DLManaka のマジック値。現在は読み込まない。
不変条件
- エンコード定義は Rust 側を正本とする。Python 側ではサイズだけを持ち、着手・プレーン定義を二重管理しない。
- 学習・検証分割は対局または開始局面単位で行い、同じ対局の行をランダム分割しない。
- レイアウト不一致は学習前に失敗させる。壊れたデータを「弱いネットワーク」と誤認しないためです。