Skip to content

学習データ形式

DLManaka と Manaka は同じ教師コーパスを使いますが、学習時の局面表現は別です。このページでは、両者の間で受け渡すデータ形式だけを説明します。コーパスの由来と整備方法は 教師データ を参照してください。

形式一覧

形式書き込み側読み込み側
コーパス .parquet整備スクリプト教師データ生成器
教師シャード .parquetmanaka-teacher両学習器
DMT1 / MNR1 ストリーム自己対局シャード生成器・学習器
自己対局 .parquetbuild_shards.py, dl-manaka-teacherDLManaka 学習器

シャードは、データセットをファイル単位に分割したものです。疎な方策データを圧縮しやすく、一般的なツールでも確認しやすいため 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.pytrain/val/<prefix>-NNNNN.parquet を安全に書き込みます。

内容
plyuint16手数
game_iduint32対局 ID
value_zfloat32勝敗の教師信号
value_qfloat32探索価値の教師信号
packed固定長バイナリ圧縮局面
aux_value欠損可の float32任意の補助教師信号
indiceslist<uint16>全合法手の方策ラベル
prob_slotslist<uint16>非 0 確率の位置
probslist<float32>非 0 確率

ストリーム側は合法手ごとに確率を 1 つ持ちます。Parquet 側では確率 0 の要素を省略し、prob_slotsprobs だけを保存します。

旧形式

  • .npz — 旧 DLManaka シャード。読み込みのみ対応。
  • CZR1MNR1 と同じレイアウトの旧名。読み込み可能。
  • IZT1 — 旧 DLManaka のマジック値。現在は読み込まない。

不変条件

  • エンコード定義は Rust 側を正本とする。Python 側ではサイズだけを持ち、着手・プレーン定義を二重管理しない。
  • 学習・検証分割は対局または開始局面単位で行い、同じ対局の行をランダム分割しない。
  • レイアウト不一致は学習前に失敗させる。壊れたデータを「弱いネットワーク」と誤認しないためです。