2026-07-11¶
v13 ISMCTS反復自己対戦1万試合の学習結果¶
状況¶
完了した実験記録。ここに書く loss と自己対戦の結果は、v13 の反復学習経路を観測したものです。外部の固定相手に対する強さを直接示す評価ではありません。
実行条件¶
| Item | Value |
|---|---|
| Run name | v13-ismcts-iterative-10k |
| Base run id | 20260705-052512 |
| Self-play | 10 cycle x 1,000 games = 10,000 games |
| Self-play config | configs/v13/selfplay-v13-ismcts-selfplay.yaml |
| Train config | configs/v13/train-policy-unified-selfplay.yaml |
| Search | ISMCTS, 4 determinizations x 80 simulations, leaf batching enabled |
| Self-play device | CPU, 8 workers |
| Train device | MPS |
| Train schedule | cycle ごとに 1 epoch, batch size 64 |
| Initial checkpoint | checkpoints/policy_value_latest_best.pt |
| Final best checkpoint | checkpoints/policy_value_v13_ismcts_iterative_10k_20260705-052512-cycle010_best.pt |
| Final checkpoint | checkpoints/policy_value_v13_ismcts_iterative_10k_20260705-052512-cycle010_final.pt |
各 cycle は、直前 cycle の *_best.pt
で 1,000 試合を生成し、その cycle の JSONL だけを入力として学習した。したがって、10,000 試合を一つの累積データセットとして学習した実験ではない。古い cycle のデータを replay
buffer として再利用せず、最新の自己対戦分布へ順番に追従する online training である。
学習結果¶
生成された decision record は合計 1,236,135 件だった。cycle ごとの record 数は 117,541 から
130,978 件で、各 cycle はおよそ 1,837--2,047 batch の 1 epoch である。
| Cycle | Records | Loss | Policy loss | Value loss | Aux loss | Belief loss |
|---|---|---|---|---|---|---|
| 1 | 128,525 | 1.9479 | 1.2934 | 0.5395 | 0.1114 | 0.0036 |
| 2 | 130,978 | 1.9128 | 1.2965 | 0.5100 | 0.1027 | 0.0035 |
| 3 | 129,320 | 1.8969 | 1.2803 | 0.5117 | 0.1016 | 0.0033 |
| 4 | 122,369 | 1.8919 | 1.2688 | 0.5192 | 0.1005 | 0.0033 |
| 5 | 122,196 | 1.8856 | 1.2663 | 0.5171 | 0.0990 | 0.0032 |
| 6 | 117,541 | 1.8607 | 1.2500 | 0.5076 | 0.0999 | 0.0033 |
| 7 | 121,915 | 1.8647 | 1.2518 | 0.5101 | 0.0995 | 0.0033 |
| 8 | 121,433 | 1.7949 | 1.2440 | 0.4518 | 0.0959 | 0.0032 |
| 9 | 121,040 | 1.8120 | 1.2160 | 0.4959 | 0.0971 | 0.0031 |
| 10 | 120,818 | 1.7967 | 1.2199 | 0.4771 | 0.0966 | 0.0031 |
観測:
- cycle 5 から cycle 10 の同じ 4-layer 構成で比較すると、policy loss は
1.2663 -> 1.2199、value loss は0.5171 -> 0.4771まで低下した。 - cycle 9 から cycle 10 では policy loss が
1.2160 -> 1.2199と 0.32% 上がったが、total loss は1.8120 -> 1.7967、value loss は0.4959 -> 0.4771と改善した。これは有意な悪化ではなく、自己生成データの分布と policy target の難度が cycle ごとに変わる影響と解釈する。 - cycle 9--10 では policy loss が約
1.22に留まり、自己対戦だけでの policy distillation は停滞し始めている。 low-progress-policy-weight: 0.3、passive deck-out filter、streaming shuffle を使うため、cycle 間の training loss は同一分布の validation loss ではない。
モデルの変遷¶
cycle 4 の training で shared transformer を 4 layer に拡張した。読み込み時に既存 parameter は 157 個読み込まれ、新規 layer 由来の 48 parameter は未初期化から学習を開始した。cycle 5 以降は 205 parameter を完全に引き継いでいる。
そのため、cycle 1--3 と cycle 4 以降の loss を単純に比較してモデルの改善量とみなすことはできない。4-layer 化後の安定区間は cycle 5--10 と扱う。
モデル規模¶
最終 best checkpoint policy_value_v13_ismcts_iterative_10k_20260705-052512-cycle010_best.pt の
model_state_dict から、学習パラメータとなる浮動小数 tensor の numel を合算した。
| 指標 | 値 |
|---|---|
| Total learned parameters | 28,388,436 (about 28.39M) |
| FP32 parameter storage | 108.29 MiB (about 113.6 MB) |
| All state tensors, including non-learned buffers | 28,425,411 |
| Module group | Parameters | Share |
|---|---|---|
| Card / attack / history / object / global / action encoders | 25,733,248 | 90.65% |
| Deck Transformer | 859,520 | 3.03% |
| Shared Transformer, 4 layers | 793,088 | 2.79% |
| Integrated belief heads | 686,149 | 2.42% |
| Action-context fusion | 198,400 | 0.70% |
| Policy / value / aux prize heads and other | 118,031 | 0.42% |
shared Transformer は全 parameter の 2.79% に留まり、model 容量の大半は入力 modality ごとの encoder に分散している。この構成では shared Transformer を増やすことは、encoder で抽出したカード、盤面、履歴、合法手の特徴を横断して統合する表現力を増やす変更になる。
表現できる情報の確認¶
最終 v13 checkpoint の構造と cycle 10 self-play record を確認し、policy が戦略的な関係を表現できる入力を持つかを監査した。ここでの「表現できる」は model に情報経路があることを意味し、学習後の重みがその関係を正しく使えていることまでは保証しない。
checkpoint は
UnifiedTokenPolicyValueNet、num_layers=4、structured_context_mode=objects、history_context_mode=event_transformer、deck_context_mode=set_transformer、deck_integration=pooled
を使っている。
cycle 10 の先頭 1,000 decision record では、own deck は 1,000/1,000、state object は 987/1,000、history token は 917/1,000、action object は 1,000/1,000 record に存在した。したがって、以下の弱点は主に field 欠損ではなく、token の粒度・関係の明示性・学習 target の不足である。
| Strategic information | Current representation | Assessment |
|---|---|---|
| Own hand | card ID、hand zone、slot を持つ card object token。state Transformer に直接入る。 | 良い。手札のカード組合せを attention で参照できる。 |
| Board | active / bench、owner、slot、HP、damage、energy、status、tool、pre-evolution を object token 化する。 | 良い。カード実体と付帯物の関係を持てる。 |
| Legal action | option ごとに action、actor、target、attack を object 化し、action-to-state cross-attention で score する。 | 良い。局面依存で合法手を比較できる。 |
| History | 直近 24 log を event type、card、移動元/先、attack、順序、recency を含む event 列として入力する。 | 部分的に良い。長い game plan や log に含まれない選択詳細は保持できない。 |
| Own deck and thinning | 初期 60 枚を Set Transformer で 1 本の pooled deck vector に圧縮する。現在の手札、盤面、discard は別 object token。 | 不十分。既知 zone を差し引いた remaining deck multiset を明示していない。 |
| Prize race | 残りサイド数、win value、this-turn prize、own / opponent completion aux head。 | 部分的。2-2-2 のような prize map や KO target の順序は直接表さない。 |
| Opponent main attacker | 公開盤面は board object。hidden hand / deck / prize は card 単位 belief logits。 | 不十分。deck hypothesis と進化ラインとして一貫した threat を持たない。 |
What Is Represented Well¶
盤面と action の接続は現在の強みである。state object は card ID に加えて owner / zone / role / slot / parent zone / parent slot を持つ。これにより、どのポケモンにエネルギー、tool、進化元が付いているかを model が参照できる。各 action も actor / target / attack を分けて token 化し、action vector が encoded state 全体を見るため、「このカードをこの対象に使う」という比較が可能である。
自分の手札も hidden ではなく個別 card object として入る。相手手札は公開情報として card identity を見せず hand count だけを入れ、belief head で推定するため、情報セットを壊していない。
Structural Gaps¶
- Deck thinning:
model は初期 decklist と公開済み card を別々には見られるが、残り deck の card ごとの既知枚数を直接持たない。さらに
deck_integration=pooledでは初期 decklist が 1 token に圧縮されるため、「汎用 draw の前に search を使うべきか」のような sequencing は推論負荷が高い。 - Prize mapping: aux head は教師軌跡で実際に起きた将来の prize gain を学ぶが、各 attack が取る prize、次に狙う target、最短 win turn、相手に許容する prize trade を構造化していない。
- Opponent threat: observed opponent attacker は表せるが、hidden
deck の候補を deck 単位で推定しない。現在 config では
belief_threat_loss_weight=0.0とbelief_ko_loss_weight=0.0のため、定義済みの next-threat / knockout-threat head も学習されない。 - Card effect semantics: card ID と基本 static feature はあるが、Trainer / Ability の効果文は shared semantic feature になっていない。attack text も少数 keyword のみで、類似効果を横断して学ぶには card ID ごとの経験に依存する。
- Relations are soft, not explicit: owner / zone / parent slot は token として入るが、親子や card-count の差分を hard な graph edge / arithmetic として計算しない。Transformer が学ぶべき関係が多い。
rule-pool evaluation で model が attack-ready turn の 32.0% を攻撃せず終了し、pokemon out による 45 敗を喫したことは、これらの情報が全く無いというより、現在の target と trunk が盤面準備・攻撃継続の関係を十分に利用できていないことを示す。
Representation Improvement Plan¶
- Known remaining deck multiset
を追加する。
initial deck multiset - known self hand - board - discard - prizeを card ID と count の object token として作り、pooled vector ではなく shared Transformer に直接入れる。known / unknown の区別を持たせ、deck thinning と search sequencing を比較可能にする。 - Deck-aware opponent belief を追加する。相手の公開 card、進化ライン、energy、history から deck candidate posterior を出し、その candidate ごとの主力 attacker、必要 energy、次 turn の KO threat を state token に反映する。independent card logits だけに依存しない。
- Action outcome feature を合法手に加える。CABT が計算できる範囲で predicted damage、KO 可否、取得 prize、attack cost の充足、retreat cost、相手の次 turn KO risk を action object に持たせる。
- Prize-map auxiliary target を追加する。next KO の prize value、最短 prize completion turn、opponent の board に対する必要 KO 数、許容 prize trade を target にし、単なる最終勝敗より近い teacher を作る。
- Effect semantic feature を増やす。Trainer / Ability / attack の効果を draw、search、bench、energy、evolution、switch、disruption、healing、damage-modifier などの構造化 tag にし、card ID を越えて共有する。
- Probe evaluation を追加する。同一局面から hand card、remaining deck count、opponent attacker、history order だけを変え、policy / value が期待どおり変わるかを unit-like benchmark として測る。入力経路の存在ではなく、学習済み model が関係を使えているかを検証する。
自己対戦結果の概要¶
| Cycle | Finished | Unfinished | p0 wins | p1 wins | p0 win rate on finished |
|---|---|---|---|---|---|
| 1 | 950 | 50 | 433 | 516 | 45.6% |
| 2 | 991 | 9 | 491 | 500 | 49.5% |
| 3 | 985 | 15 | 464 | 520 | 47.1% |
| 4 | 991 | 9 | 487 | 504 | 49.1% |
| 5 | 989 | 11 | 461 | 528 | 46.6% |
| 6 | 991 | 9 | 506 | 484 | 51.1% |
| 7 | 993 | 7 | 499 | 493 | 50.3% |
| 8 | 984 | 16 | 488 | 496 | 49.6% |
| 9 | 985 | 15 | 460 | 525 | 46.7% |
| 10 | 989 | 11 | 511 | 478 | 51.7% |
| Total | 9,848 | 152 | 4,800 | 5,044 | 48.7% |
終了理由は deck out 1,415、pokemon out 2,227、その他の終了 6,206 だった。平均 decision
record 数は cycle 1--3 の 129.6 records/game から、cycle 4--10 では 121.0
records/game になった。未完了率も cycle 1 の 5.0% から、その後は概ね 1% 前後に下がっている。
この勝率は性能指標ではない。両 player は同じ checkpoint と ISMCTS を使っているため、 p0/p1
の差は先後ルール、デッキ抽選、対戦組合せの偏りを主に表す。p1 が合計で 51.2% 勝っていることは、モデルの優劣ではなく、この self-play
protocol に先後または抽選の非対称性が残ることを示す。
ルールエージェント群による評価¶
反復学習後の checkpoint を rule-pool と 100 試合対戦させた。artifact 名には 1000g を含むが、CSV の
games は 100 であり、これは 100 試合の一次評価である。
| Item | Value |
|---|---|
| Model checkpoint | checkpoints/policy_value_v13_ismcts_iterative_10k_20260705-052512-cycle010_best.pt |
| Checkpoint alias at evaluation | checkpoints/policy_value_latest_best.pt |
| Model role | player0, search + ISMCTS |
| Rule role | player1, filtered rule-pool |
| Search budget | 4 determinizations x 80 simulations |
| Model deck source | decks/opponents/train からランダム抽選 |
| Rule deck source | 各 rule agent に紐づく deck |
| 生成物 | data/selfplay/eval-v13-latest-vs-rule-1000g.* |
| 指標 | モデル | ルール群 |
|---|---|---|
| Games | 100 | 100 |
| Finished | 97 | 97 |
| Wins / losses / unfinished | 10 / 87 / 3 | 87 / 10 / 3 |
| Win rate on finished | 10.3% | 89.7% |
| Win rate on all games | 10.0% | 87.0% |
| Average prizes taken | 0.86 | 4.59 |
| Average attacks | 1.83 | 4.72 |
| Pokemon-out wins / losses | 5 / 45 | 45 / 5 |
この 100 試合では、最終 v13 model は rule-pool に大差で負けた。rule agent 別では
mega_lucario_ex_fighting_gong
相手の 3/8 勝が最も良く、他の多くの agent には勝率 0--17% だった。agent ごとの試合数は 2--12 と小さいため、個別相性の順位は確定しない。一方で全体 97 完了試合の 10--87 は、偶然の揺れだけでは説明できない大きさである。
JSONL の game-level diagnostic を 100 試合で集計した。
| Diagnostic | Model p0 | Rule p1 | Interpretation |
|---|---|---|---|
| Bench empty turns / game | 1.73 | 0.78 | モデル側は盤面に控えがいないターンが多い。 |
| Attack-ready turns / game | 2.69 | 4.96 | モデル側は攻撃可能な盤面を作れていない。 |
| Attack-ready turn ended without attack | 86 / 269 (32.0%) | 24 / 496 (4.8%) | モデルは攻撃可能ターンを攻撃せず終える割合が高い。 |
| Evolution skipped / available | 259 / 393 (65.9%) | 486 / 896 (54.2%) | モデルは進化可能な機会をより多く見送っている。 |
この結果は、単なる勝敗だけでなく、モデルが「ベンチを作る、アタッカーを育てる、攻撃可能なら攻撃する」という基礎的な game plan を rule agent ほど安定して実行できていないことを示す。特に pokemon out による 45 敗と、attack-ready turn の未攻撃率は優先して改善すべき指標である。
ただし、この評価を checkpoint 間の厳密な強さ比較にはまだ使えない。
- model は player0 固定、rule-pool は player1 固定であり、先後を入れ替えていない。
- model は 30 種類程度の train deck から抽選され、rule agent はそれぞれ得意な専用 deck を使う。deck matchup の強弱が model の戦術判断と混ざっている。
- 評価は 100 試合で、rule agent ごとの標本は 2--12 試合である。
- 逆向き用の既存
selfplay-rule-vs-v13-ismcts.yamlは simulation 数が 20 であり、この評価の 80 simulation と同じ条件ではない。先後を比較する場合は search budget も揃える必要がある。
それでも、この一次評価は重要な回帰シグナルである。rule bootstrap のデータを初期値として使った後、各 cycle で直近の model-vs-model self-play だけを 1 epoch 学習したため、rule agent の deck-specific な手順を忘れ、現在の浅い search の癖だけを自己模倣した可能性が高い。これは仮説であり、次の controlled evaluation と replay mixture で検証する。
デッキごとの偏り¶
10,000 試合における deck 単位の集計では、対局の勝敗がデッキ強度に大きく支配されていた。
| Group | Deck | Finished games | Win rate |
|---|---|---|---|
| Strong | crustle_mysterious_rock_inn |
753 | 88.6% |
| Strong | mega_abomasnow_ex_water_grass |
698 | 75.5% |
| Strong | generic_mirror_setup_speed |
680 | 73.1% |
| Weak | honchkrow |
676 | 13.5% |
| Weak | festival-lead |
694 | 15.9% |
| Weak | dragapult-citytop |
741 | 28.6% |
この差は、片側が圧勝する game のかなりの部分を説明する。self-play の policy/value target には deck matchup の勝敗要因が混ざるため、モデルの手順判断を改善するデータとしては効率が下がる可能性がある。
この実験で確認できたこと¶
- ISMCTS self-play から unified model へ、10 cycle の checkpoint chain を壊さず実行できた。
- 4-layer model への移行後も checkpoint の継続学習は成立した。
- training loss は下がったが、自己対戦内の loss だけではモデル強度の向上を証明できない。
- rule-pool との一次評価では 10.3% 勝率に留まり、盤面準備と攻撃継続の回帰シグナルが出た。
- 現時点の主な品質課題は、policy loss の停滞、deck strength imbalance、rule teacher の忘却、controlled validation と promotion gate の不在である。
次に確認すること¶
cycle010_best.ptを固定し、同じ rule-pool を model p0 / p1 の両方向で 1,000 試合以上評価する。両方向でd4s80を使い、deck、seed、先後を入れ替える。- agent の専用 deck ごとに model も同じ deck を使う mirror evaluation を追加し、deck strength と agent quality を分離する。
- 次の反復学習では validation split と promotion gate を有効にし、training loss とは別に holdout metric を保存する。
- replay buffer に rule bootstrap / model-vs-rule の高品質 record を混ぜ、直近 self-play だけによる catastrophic forgetting と target distribution の急変を抑える。
- deck pair を層化または重み付けして、極端に強い・弱い deck だけが結果を支配しない self-play curriculum を検討する。
v13以降の改善方針¶
v13 の結果と Gumbel Sequential Halving の実装監査を踏まえ、次の開発では追加 self-play を先に回すのではなく、強い教師と退行を防ぐ学習ループを先に作る。プロジェクト全体の実施順と完了条件は プロジェクトロードマップを今後の計画として優先する。
優先順位は次の通りである。
- cycle 0 / 5 / 10、rule-pool、tactical probe を固定 benchmark にし、game 単位の validation と promotion gate を作る。
- recent self-play だけでなく、過去の promoted self-play、rule bootstrap / model-vs-rule、hard failure を replay buffer で混ぜる。
- current / past checkpoint / rule agent の opponent league と、deck pair / 先後を揃えた paired evaluation を導入する。
- 同じ 320 simulations で visit と deterministic Gumbel を比較し、Gumbel を探索数削減ではなく teacher policy 改善として評価する。
- Gumbel の初期候補を保持し、最終 1 候補だけの one-hot target ではなく、初期候補全体の soft completed-Q target を学習に使う。
- 強制選択と同値 action を圧縮し、turn boundary / attack / KO までの短い continuation によって 1 simulation の情報量を増やす。
- known remaining deck、action outcome、deck-aware belief、opponent threat、prize map を明示表現した後、shared Transformer の拡張を比較する。
AlphaGo Zero と共通する土台は、MCTS self-play、探索結果による policy/value 学習、過去データの再利用、候補モデル評価と best model 更新である。このプロジェクトでは不完全情報と deck imbalance があるため、deck-aware belief、rule teacher、opponent league、hard failure replay を追加する。Gumbel は AlphaGo Zero の必須要素ではなく、同じ探索予算からより良い policy improvement を得るための比較対象として扱う。
Gumbel 実装監査では、Sequential Halving の auto leaf
batch が候補ごとの simulation 数まで膨らむ問題と、候補が 1 つのときに 1
simulation だけで終了する問題を修正した。さらに実 visit /
Q ではなく最終 target を表示していた診断を修正した。これにより予算消費と探索統計は検証可能になったが、同予算の visit より強いことはまだ証明されていない。
固定デッキによる昇格判定¶
pca selfplay-train に、直前 champion から candidate が改善したかを cycle ごとに判定する promotion
benchmark を追加した。モデル側は configs/benchmarks/model-decks-v1.yaml
の7デッキに固定し、同一 deck / seed で player
side を入れ替えて直接対戦する。加えて candidate と champion を同じ rule-agent pool に当て、deck
macro win rate、unfinished rate、pokemon-out loss rate の相対悪化を監視する。
既定では candidate の完了試合 head-to-head 勝率 52% 以上を要求する。合格時だけ latest alias と次 cycle の checkpoint を candidate best へ進め、却下時は champion を維持する。これは fixed benchmark の基礎実装であり、閾値の校正、信頼区間、過去 promoted checkpoint league は次の検証課題とする。
rule-pool の Champion 評価は checkpoint と評価条件のfingerprintでcacheするようにした。promotion seedをself-play cycle seedから分離して固定し、昇格したCandidateの評価を次cycleのChampion基準として再利用する。固定7デッキと16 rule deckの場合、初回364試合に対し、cache hitする通常cycleは252試合となる。
昇格済みデータを再利用する最小構成¶
学習入力を直近cycleだけに限定せず、直近train gameを100%維持したまま、過去3つのpromoted cycleから直近ゲーム数の25%をgame単位で追加するReplayを実装した。履歴sampleは新しい順に50% / 30% / 20%で配分する。validationは直近データから先に分離し、過去Replayはtrain側だけへ追加する。promotion却下cycleと、履歴を混ぜたsample自体はregistryへ登録しない。
最初の比較はrecent-onlyとこのMVPの2条件に限定する。rule/model-vs-rule、hard failure、prioritized replay、Reanalyzeは、この比較で外部評価の改善または忘却抑制を確認してから追加する。
保存した結果¶
- Run manifests:
logs/selfplay-train/v13-ismcts-iterative-10k-20260705-052512-cycleNNN.manifest.yaml - Training logs:
logs/selfplay-train/20260705-052512-cycleNNN-train.log - Self-play summaries:
data/selfplay/v13-ismcts-iterative-10k-20260705-052512-cycleNNN/ - Merged training inputs:
data/selfplay/v13-ismcts-iterative-10k-20260705-052512-cycleNNN.jsonl