Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Policy ラベル

前提知識: 指し手

rsshogi::labels::policy は指し手を policy 学習用の固定クラスへ変換する。 局面の合法性や特徴量の構築はこのモジュールの責務ではない。

MoveLabel

MoveLabel は 27 クラスと 81 個の移動先を組み合わせた 2187 クラスのラベルである。 クラスは通常移動の方向と成りの 20 種、および駒打ちの 7 種からなる。 後手番の手は盤面を 180 度回転して、手番側から見た同じ向きへ正規化する。

use rsshogi::labels::policy::{MoveLabel, MoveLabelClass};
use rsshogi::types::{Color, Move};

let mv = Move::from_usi("7g7f").unwrap();
let label = MoveLabel::from_move(mv, Color::BLACK).unwrap();
assert_eq!(label.class(), MoveLabelClass::Up);

MoveLabel::from_movefrom_move32 は通常の構造を持つ指し手だけをラベル化する。 この変換は局面を受け取らないため、返ったラベルはその局面で合法であることを意味しない。

ラベル値は概念的に class * 81 + to_square で並ぶ。 同じ方向クラスの升は連続し、クラスの境界をまたぐと移動方向または駒打ち種別が変わる。 class()to_sq() は分解した値を返すので、学習器の出力を解析するときに raw 値を手計算しなくてよい。

CompactMoveLabel

CompactMoveLabel は 2187 クラスから、移動パターン、成り、駒打ちの構造上現れないクラスを除いた 1496 クラスである。 compact() は圧縮可能な MoveLabelCompactMoveLabel に変換する。 expand() は圧縮前の MoveLabel を返す。

use rsshogi::labels::policy::CompactMoveLabel;
use rsshogi::types::{Color, Move};

let mv = Move::from_usi("7g7f").unwrap();
let compact = CompactMoveLabel::from_move(mv, Color::BLACK).unwrap();
assert!(compact.expand().is_structurally_valid());

圧縮可能であることも局面で合法であることを表さない。 学習データの手は、先に Position と合法手生成で検証してからラベル化する。

通常のラベルと compact ラベルは異なる分類空間である。 モデルの出力次元、訓練データ、復元処理は一方の scheme で統一し、数値を他方の raw 値として扱わない。

対称変換

MoveLabel::mirror_fileCompactMoveLabel::mirror_file は筋反転したラベルを返す。 左右対称 augmentation では局面、指し手、ラベルを同じ変換で揃える。 手番正規化の 180 度回転と、筋反転は別の変換なので混同しない。

次に読む

局面 で、学習データの手を合法性とともに扱う API を確認する。