SHOGI
モデル構造・重み可視化
自作強化学習モデル (Policy+Value Network) の中身
← 対局に戻る

本ページで表示している数値は、実際に自己対戦(セルフプレイ)で学習させたチェックポイントファイル (backend/data/models/*.pth) から直接読み取ったものです。 架空の例やダミー値ではありません。

将棋AI モデル構造・重み可視化

このAIは画像分類のような「正解ラベル付きデータ」では学習していません。自分自身と対局を繰り返し(セルフプレイ)、 その勝敗結果を遡って各局面の教師信号に変換する強化学習(AlphaZero系)で育てています。 ここでは、実際に学習が進むにつれてネットワークの重みがどう変化したかを、3つの学習段階のチェックポイントを比較しながら見ていきます。

モデル概要

ネットワーク構造

盤面を2285次元のベクトルにエンコードし、3層の全結合トランク(LayerNorm + ReLU + Dropout)を通したあと、 「勝率(value)」と「指し手(policy)」の2つのヘッドに分岐します。ノードをクリックすると、選択中のチェックポイントでの実際の重み統計が右側に表示されます。

緑の線=実際の重みが正 赤の線=実際の重みが負(太さ・濃さ=大きさ) 流れる光の粒=推論時のデータの流れ ドラッグでパン・スクロールでズーム(列をクリックで詳細)

レイヤーを選択してください

左の図のノードをクリックすると詳細が表示されます。

学習で重みはどう育ったか

各層の重み行列のL2ノルム(大きさ)を、学習初期・中間・最新の3チェックポイントで比較します。 対数スケールです — 特にpolicyヘッドと入力層直後のtrunk.0で、学習が進むにつれて重みの大きさが数十〜数百倍に成長しているのが分かります。

Policyヘッドの512バケット — 個々の重みの「指紋」

指し手の候補は512個のバケットにハッシュ化されています(USI文字列 → FNV-1aハッシュ → 0〜511)。 各バケットに対応する重みベクトルのL2ノルムを並べると、学習によって特定のバケットが強く反応するようになっていく様子が見えます。

なぜこの形なのか

正解ラベルがない学習

画像セグメンテーションのような人手ラベルの代わりに、自己対戦の勝敗結果を使います。 1局が終わった時点で、その対局中の全局面に「最終的に手番側が勝ったか」を遡って割り当て、valueヘッドの教師信号にします。

探索とネットワークの相互ブートストラップ

ModelPolicyはアルファベータ探索の葉ノード評価にvalueヘッドを使い、探索で裏付けられた手を教師にpolicyヘッドを鍛えます。 強くなった探索がより良い教師データを生み、より良いネットワークがより強い探索を生む、という循環です。

Policyのハッシュ化

将棋の合法手は局面によって可変・膨大なため、USI文字列を512バケットにハッシュして固定サイズの出力にしています。 衝突は許容し、推論時は合法手だけにマスクして選択するため実用上は問題になりません。

強さの測り方

テスト精度のような指標は存在しません。新旧チェックポイント同士を対局させ、Eloレーティングで「前より勝てるようになったか」を測定し、 上位10モデルだけを model_registry に保持しています。