dlshogi — AlphaZeroを日本に持ち込んだ深層学習将棋AI
dlshogi は、山岡忠夫氏が開発する 日本のディープラーニング系将棋AI の代表格です。 DeepMind の AlphaZero(2017)が示した「深いCNN + MCTS + 強化学習」というアプローチを将棋に適用したオープンソースで、 CPU上で動く NNUE 型エンジン(やねうら王・水匠など)とは まったく異なる土俵 で進化し続けています。
このページでは、dlshogi の 歴史・アーキテクチャ・入力テンソル・2ヘッド出力・MCTS・強化学習 を、 第7章 §3 よりさらに踏み込んで解説します。
dlshogi とは何か(概要)
山岡忠夫氏のオープンソース
日本のディープラーニング系将棋AIの 代表格。
GitHub で全公開、誰でも改造可能。
AlphaZeroアプローチを将棋に
深いCNN + ResNet + MCTS + 自己対局による強化学習。 AlphaZero のレシピをほぼそのまま将棋へ。
世界選手権で実績
世界コンピュータ将棋選手権・電竜戦で NNUE勢と並ぶ最強クラス。 GPU を活かす土俵で活躍。
💡 核心: dlshogi は「将棋盤を画像のように扱い、深いCNNで局所〜抽象パターンを学習し、MCTSで賢く深く読む」エンジン。 NNUE が「秒間数百万局面を浅く広く読む」のと対極にあり、秒間数千〜数万局面を深く狙って読む 戦略をとります。 どちらが上ではなく、得意な局面が違うので共存 しているのが現代将棋AIの面白さです。
基本情報
| 項目 | 内容 |
|---|---|
| 開発者 | 山岡忠夫(Tadao Yamaoka)氏 |
| ライセンス | オープンソース(GPL系、レポジトリ参照) |
| GitHub | TadaoYamaoka/DeepLearningShogi |
| 開発開始 | 2017〜2018年頃(AlphaZero論文を受けて) |
| ベース理論 | AlphaZero(DeepMind, 2017) |
| ハード | GPU(NVIDIA系が標準。CUDA / TensorRT で高速化) |
| 探索 | MCTS(PUCT版モンテカルロ木探索) |
| 評価ネット | 深いCNN + ResNet(10〜40ブロック) |
| 出力 | 方策(Policy)+ 価値(Value)の 2ヘッド |
| 学習 | 自己対局による 強化学習(教師あり初期化も可) |
1. 歴史 — 山岡忠夫氏とAlphaZero
dlshogi の歴史は、AlphaZero ショックなしには語れません。2017年12月、DeepMind は たった1つのアルゴリズムで囲碁・将棋・チェスのすべてを世界最強レベルに到達させた AlphaZero の論文を公開しました。 これが将棋AI界に与えた衝撃と、それを日本のオープンソースに持ち込んだ山岡氏の歩みを順に見ていきます。
1.1 AlphaZero ショック(2017)
2017年12月、DeepMind は AlphaZero の論文("Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm")を公開しました。 驚くべきは次の点です:
- 同一のアルゴリズムで囲碁・将棋・チェスを すべて世界トップ越え
- 人間の棋譜を 一切使わない(自己対局のみ)
- たった 数時間〜数日 の学習で、20年磨かれた既存最強エンジン(Stockfish / elmo)を上回る
- 使われた技術は 深いCNN + MCTS + 強化学習 という、当時としては「将棋では使われていない」組み合わせ
日本の将棋AI界では「α-β探索 + 評価関数の機械学習(Bonanzaメソッド)」が長年の主流。 AlphaZero はそのパラダイムを 真っ向から否定する ように見えました。
🏔️ 歴史背景:AlphaZero の前身 AlphaGo / AlphaGo Zero(クリックで展開)
AlphaZero は突然出てきたわけではなく、AlphaGo シリーズの集大成です:
- AlphaGo(2016):人間の棋譜で 教師あり学習 したネット + MCTS。李世乭九段に勝利
- AlphaGo Zero(2017):人間の棋譜を捨て、自己対局のみで AlphaGo を超える
- AlphaZero(2017):囲碁特化を取り払い、将棋・チェスにも同じ手法を適用
共通レシピ:深いCNN(policy + value 2ヘッド) × MCTS × 自己対局による強化学習。 dlshogi はこのレシピを「日本のオープンソースで実装する」プロジェクトです。
1.2 山岡忠夫氏が独自実装を開始
AlphaZero は論文公開のみで 実装コードや学習済みモデルは公開されませんでした。 将棋に応用するには、論文を読み解き、自分で実装するしかなかったのです。
山岡忠夫氏は当時すでに将棋AIに取り組んでおり、AlphaZero 論文を受けて 「同じ手法を自分で再現する」 挑戦を開始しました。 ブログ「TadaoYamaokaの開発日記」では、毎週のように実装の試行錯誤が公開され、 将棋AI開発者コミュニティの 知の共有装置 になっていきました。
1.3 dlshogi の誕生と発展(2018〜)
こうして生まれたのが dlshogi(DeepLearningShogi)です。
| 年 | マイルストーン |
|---|---|
| 2018 | 第28回世界コンピュータ将棋選手権で dlshogi 初参戦 |
| 2019〜 | ResNet ブロック数・チャンネル数の拡大、学習データの増強 |
| 2020 | 第1回電竜戦で上位入賞。GPU環境での実用性が広く認知される |
| 2021 | 世界コンピュータ将棋選手権で 優勝(dlshogi with HEROZ) |
| 2022〜 | TensorRT 化・大規模分散自己対局・モデルの大型化 |
| 2024 | NNUE勢と並ぶ世界トップクラスとして定着 |
📚 補足:dlshogi 周辺の関連プロジェクト(クリックで展開)
- AobaZero:純粋な AlphaZero クローン。自己対局のみで人間棋譜を一切使わない
- ふかうら王:やねうら王プロジェクトの DL 版。dlshogi の評価エンジンをやねうら王の探索フレームに組み込むイメージ
- 棋神アナリティクス:dlshogi 系の技術が商用化されたサービス(HEROZ)
詳細は §7 関連プロジェクト でまとめます。
2. アーキテクチャ — 深いCNN + ResNet + 2ヘッド
dlshogi のネットワーク構造は、AlphaZero とほぼ同じ 「Policy-Value 2ヘッド型 ResNet」 です。 まず 「1局面が入力されてから出力が出るまで」 のデータの流れを4ステップで俯瞰し、その後で各層の内部構造を詳しく見ていきます。
2.0 1局面処理フロー — 入力から2ヘッド出力まで
dlshogi も NNUE も、入力は同じ「局面」、出力は「評価」。ただし途中の処理が 完全に違います: dlshogi は盤面を 「画像のような3次元テンソル」 として扱い、深いCNNで処理します。
ポイント:dlshogiは 盤面を画像のように扱い、CNNで局所パターン → 深い戦略概念 を階層的に学習。 出力が 2つ(指し手の確率分布 + 勝率)あるのが特徴で、これが後段の MCTS探索(§5) に使われます。
2.1 ネットワーク全体図 — Conv・ResNet・2ヘッドの内部構造
次に 各層の中身 を SVG で見ていきます。前節の俯瞰図では「ResNet ブロック」とまとめていた部分を、Conv 3×3 → BN → ReLU → Conv 3×3 → BN → 残差接続 → ReLU のレベルまで分解した図です:
ポイント:
- 入力:9×9×100 の3階テンソル(次の §3 で詳細)
- 初段の Conv:3×3 カーネル × 256ch で、生の盤面を「特徴マップ」に変換
- ResNet ブロック:Conv → BN → ReLU → Conv → BN → 残差接続 → ReLU の繰り返し。これを 10〜40 段
- 2ヘッド分岐:深い特徴から、policy(指し手分布)と value(勝率)を 別々のヘッドで出力
2.2 なぜ ResNet を使うのか
単に「Conv を 40 段重ねれば良い」というわけではありません。 ふつう 層を深くすると勾配が消えて学習できなくなる(勾配消失問題)。 これを解決したのが ResNet の 残差接続(skip connection) です。
残差接続は「入力 x を、ブロックの出力 F(x) にそのまま加える」というシンプルな構造:
def resnet_block(x):
h = conv_3x3(x) # 256ch → 256ch
h = batch_norm(h)
h = relu(h)
h = conv_3x3(h)
h = batch_norm(h)
h = h + x # ← 残差接続(identity shortcut)
h = relu(h)
return h
これにより、深い層の勾配が 浅い層まで直接届く ようになり、40 段でも学習が破綻しなくなります。 詳しくは 第5章 §3 ResNet を参照。
2.3 dlshogi の仕様(典型構成)
入力: 9×9×100 テンソル
↓
初段: Conv 3×3, 256ch, BN, ReLU
↓
ResNet × N段 (N = 10, 20, 40 など、モデルにより異なる)
各ブロック: Conv → BN → ReLU → Conv → BN → +x → ReLU
↓
深い特徴: 9×9×256
├─ Policy Head:
│ Conv 1×1, 数十ch → Flatten → Softmax → 約2187次元の確率分布
└─ Value Head:
Conv 1×1, 1ch → Flatten → FC(256) → ReLU → FC(1) → tanh → スカラー [-1, +1]
📚 補足:モデルサイズの選択肢(10ブロック / 20ブロック / 40ブロック)(クリックで展開)
dlshogi では複数のモデルサイズが配布されています:
- 10ブロック:軽量。CPU + 弱めのGPUでも実用
- 20ブロック:標準。コンシューマGPU(RTX 3060クラス〜)で快適
- 40ブロック:最強モデル。RTX 4090 や A100 などの強力なGPUで真価を発揮
深いほど棋力は上がるが、1秒あたりに評価できる局面数が減る。 探索深さとのトレードオフで決まります。
3. 入力テンソル — 9×9×100 の正体
dlshogi が 盤面を「画像」のように扱える のは、入力を 9×9×100 という 3階テンソル(multi-channel 2D 画像) として与えるからです。 ここを丁寧に解剖していきます。
3.1 なぜ「画像」として扱えるのか
将棋盤は本質的に 2D 構造です。9×9 マスのどこに何があるか、という空間情報がそのまま意味を持ちます。 さらに、駒の 局所パターン(玉の周りに金が3枚 = 美濃囲い)が極めて重要。 この性質は、画像認識で CNN が威力を発揮する理由と完全に同じです:
- 局所性:近くのマスの情報が強く関係する
- 平行移動不変性:美濃囲いは右でも左でも美濃囲い
- 階層的抽象化:「駒の有無」→「囲いの形」→「戦型」と段階的に意味が立ち上がる
ただし「色(RGB)」がないので、その代わりに 「駒種・持ち主・効きなど」を多数のチャンネルに分配 します。 これが 100 チャンネルになる理由です。
3.2 100チャンネルの内訳
dlshogi の実装によって細部は異なりますが、典型的には以下のような構成です:
| チャンネル群 | 枚数(概算) | 内容 |
|---|---|---|
| 先手の駒の存在 | 14枚 | ▲歩、▲香、▲桂、▲銀、▲金、▲角、▲飛、▲玉、と、成香、成桂、成銀、馬、龍 — 各1枚の 9×9 バイナリマップ |
| 後手の駒の存在 | 14枚 | ▽歩、▽香、…(同じく14種類) |
| 先手の持ち駒 | 7枚程度 | 歩・香・桂・銀・金・角・飛 の所持枚数。1チャンネルで全マス同じ値(broadcast) |
| 後手の持ち駒 | 7枚程度 | 同上、後手側 |
| 先手の効きマップ | 20枚以上 | 各マスに効いている枚数 / どの駒種から効いているか |
| 後手の効きマップ | 20枚以上 | 同上、後手 |
| 手番・王手・手数など | 少数 | 現在手番(先手/後手)、王手中フラグ、千日手カウンタなど |
| 合計 | 約100チャンネル(実装により80〜120) | |
3.3 1チャンネルの中身(イメージ)
たとえば「▲歩の存在」チャンネルは、9×9 のうち先手の歩がいるマスだけが 1、それ以外が 0 という単純な2値マップです:
「▲歩の存在」チャンネル(9×9)の例:
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
1 1 1 1 1 1 1 1 1 ← 7段目に▲歩が並ぶ
. . . . . . . . .
. . . . . . . . .
これを駒種ごとに 14 枚、相手の駒で 14 枚…と重ねていくと、最終的に 「駒の存在パターンが層になって積まれた、9×9 の100層画像」 が出来上がります。
🧠 上級補足:効きマップが効く(うまい)理由(クリックで展開)
「効き」は将棋プレイヤーが 無意識に頭の中で計算している情報です。 「ここに駒を打つと相手の角に取られる」「玉の周りに4枚効いているから安全」など、 局面評価で極めて重要な指標。
効きマップを 事前計算してチャンネルに与える ことで、CNN は「効きを自分で再発見する手間」を省け、 より 抽象的な戦略パターンの学習にリソースを使えます。 これは AlphaZero の囲碁版とは違う、将棋ドメイン特化の工夫です。
つまり dlshogi は「完全なゼロから」ではなく、将棋らしい局面表現に少しチートしている、と言える。
4. 方策ヘッド(Policy)と価値ヘッド(Value)
dlshogi のネットは 「次の手の候補(policy)」と「勝率予測(value)」を1回のフォワードパスで同時に出力 します。 これが AlphaZero 型アーキテクチャの肝であり、後段の MCTS を強力にする鍵です。
4.1 Policy Head — 各指し手の確率分布
将棋の指し手は 「どのマスから・どの駒・成り or 不成」 の組み合わせで表現できます。 dlshogi では、これを 9×9×27 = 2187 要素 の確率分布として出力します(実装により厳密な数は異なる):
- 9×9:移動先のマス(81マス)
- ×27ch:「どの方向から動いてきたか」「成りか不成か」「持ち駒打ちか」などの組み合わせ
すべての要素を Softmax で正規化することで、合計が1になる確率分布になります:
Policy Head の出力(例、上位3手):
▲7八金 : 0.30 ← 30% の確率で「この手が最善」
▲5八玉 : 0.25
▲4八銀 : 0.18
▲3六歩 : 0.10
...(残り 0.17 が他の合法手に分散)
合計 = 1.00
重要:これは 「最善手の予測」ではなく「読むべき手の優先度」 です。 policy が高い手から MCTS が深く読むことで、無駄な手を読まずに済みます。
4.2 Value Head — 勝率予測スカラー
Value Head は 「この局面、誰が勝ちそうか」 をスカラー値 1 個で表します:
- 出力範囲:[-1, +1](tanh 活性化)
- +1:先手の必勝
- 0:互角
- -1:後手の必勝
実用的には「勝率」に変換して使うことが多く、(value + 1) / 2 で [0, 1] の勝率になります:
Value Head の出力:
value = +0.65
→ 勝率 = (0.65 + 1) / 2 = 0.825 = 82.5%
「先手が約82%の確率で勝つ」と予測している
4.3 2ヘッドにする利点 — 1回の計算で2つの情報
なぜ policy と value を 同じネットの別ヘッドにするのか。理由は3つ:
- 計算効率:1回のフォワードパスで両方得られる。別々のネットを2回回す必要がない
- 共通の深い特徴を共有:「この局面は危ない」という認識は、policy にも value にも有用
- マルチタスク学習の効果:2つのタスクを同時に学ぶと、片方だけ学ぶより 汎化性能が上がる ことが経験的に知られている
4.4 擬似コードで見るフォワードパス
// dlshogi の forward pass(JavaScript風擬似コード)
function forward(board) {
// 1. 盤面を 9×9×100 テンソルに変換
let x = encodeBoard(board); // shape: [9, 9, 100]
// 2. 初段の Conv
x = conv3x3(x, 256); // shape: [9, 9, 256]
x = batchNorm(x);
x = relu(x);
// 3. ResNet ブロックを N 段
for (let i = 0; i < N; i++) {
let h = conv3x3(x, 256);
h = batchNorm(h);
h = relu(h);
h = conv3x3(h, 256);
h = batchNorm(h);
x = relu(h + x); // ← 残差接続
}
// この時点で x は「深い特徴」 [9, 9, 256]
// 4. 2ヘッドに分岐
// Policy Head
let policyLogits = conv1x1(x, 27); // shape: [9, 9, 27]
let policy = softmax(flatten(policyLogits)); // shape: [2187]
// Value Head
let v = conv1x1(x, 1); // shape: [9, 9, 1]
v = relu(fc(flatten(v), 256));
let value = tanh(fc(v, 1)); // shape: スカラー
return { policy, value };
}
これが dlshogi の評価ネット 1 回分の処理。1秒間にこれを 数千〜数万回(GPUの並列性を活かして)実行し、MCTS から呼び出します。
5. MCTS — ネットを「賢く読む」探索
ネットだけでは「次の1手」を提案できても 「数手先を読んだ最善手」 は出せません。 そこで MCTS(Monte Carlo Tree Search、モンテカルロ木探索) がネットを 探索の頭脳 として使います。
5.1 α-β探索との違い — 「全幅で広く」vs「方策で絞って深く」
NNUE 系(やねうら王・水匠)が使う α-β探索と、dlshogi の MCTS は、思想が真逆です:
| α-β探索(NNUE系) | MCTS(dlshogi系) | |
|---|---|---|
| 探索の広がり | 原則すべての手を読む(全幅) | 方策が選んだ少数の手だけ読む(選択的) |
| 枝刈り | α-βカットで明らかな悪手を切る | policy が低い手は最初から読まない |
| 評価回数 | 秒間 数百万〜数千万 局面 | 秒間 数千〜数万 局面 |
| 探索の深さ | 浅く広く(20〜30手) | 狭く深く(重要な変化は40手以上) |
| 1局面の評価コスト | 軽い(浅いMLP, CPU) | 重い(深いCNN, GPU) |
「秒間数千局面しか読まないのに、なぜ秒間数百万局面の NNUE と戦えるのか」がポイント。 答えは:policy が「読むべき手」を最初から絞ってくれるから、無駄な手に時間を使わないのです。
5.2 MCTS の探索木のイメージ
MCTS は 探索木を少しずつ育てる。ルート(現局面)から、policy が高い手を優先的にたどり、 末端で value(勝率予測)を使って評価する、というループを繰り返します:
5.3 PUCT — 探索ノード選択の数式
MCTS の各ステップで 「次にどの枝を読むか」 を選ぶ式が PUCT(Predictor + UCT)です:
PUCT スコア:
$$ \text{PUCT}(s, a) = Q(s, a) + c_{\text{puct}} \cdot P(s, a) \cdot \frac{\sqrt{N(s)}}{1 + N(s, a)} $$
- $Q(s, a)$:この手をこれまで読んだときの 平均勝率(実績)
- $P(s, a)$:policy ヘッドが出した、この手の確率(事前確率)
- $N(s)$:親ノードの訪問回数
- $N(s, a)$:この子ノードの訪問回数
- $c_{\text{puct}}$:探索と活用のバランス定数
直感的に:
- 第1項 Q:「これまでの実績で良かった手を選ぶ」(活用)
- 第2項:「policy が高くて、まだあまり読んでない手を選ぶ」(探索)
この2項のバランスで、MCTS は 「policy が良いと言った手を中心に、ときどき他も試す」 という賢い探索を実現します。
5.4 MCTS の1ループ(擬似コード)
// dlshogi の MCTS(簡略化)
function mcts(rootBoard, numSimulations) {
let root = createNode(rootBoard);
for (let i = 0; i < numSimulations; i++) {
// === 1. Selection(葉ノードまで PUCT で降りる)===
let node = root;
let path = [node];
while (node.children && node.children.length > 0) {
node = selectChildByPUCT(node); // PUCT が最大の子を選ぶ
path.push(node);
}
// === 2. Expansion + Evaluation(ネット呼び出し)===
let { policy, value } = network.forward(node.board);
// この局面で合法な指し手すべてを子ノードとして生成
for (let move of legalMoves(node.board)) {
node.children.push({
move: move,
prior: policy[moveIndex(move)], // policy をそのまま事前確率に
N: 0,
W: 0, // 累積勝率
});
}
// === 3. Backup(path をさかのぼって value を伝播)===
for (let n of path.reverse()) {
n.N += 1;
n.W += value;
value = -value; // 相手番では符号反転
}
}
// === 4. 最終的に最も訪問された手を返す ===
return root.children.sort((a, b) => b.N - a.N)[0].move;
}
このループを 1秒間に数千〜数万回 回し、最終的に 「いちばん訪問された手」 を最善手として出力します。 「policy で重要度を絞り → value で末端を評価 → backup で全体を更新」というのが MCTS の核です。
🧠 上級補足:MCTS のバリエーション(仮想損失、並列探索、Dirichlet noise)(クリックで展開)
- 仮想損失(virtual loss):複数スレッドで同じ枝を読むのを防ぐため、選択中のノードに一時的にマイナス報酬を加える
- バッチ並列:GPU の並列性を活かすため、複数の葉ノードを一気に評価する
- Dirichlet noise:学習時に root の policy にランダムノイズを混ぜることで、多様な手を試して探索を活発化する(AlphaZero 由来)
実用版の dlshogi はこれらの工夫を組み合わせて、CPU+GPU を最大限活用しています。
6. 強化学習 — 自己対局で永遠に強くなる
dlshogi 最強モデルの強さの源泉は 強化学習による自己対局。 人間の棋譜が一切不要で、コンピューターだけで永遠に強くなれる、という AlphaZero の核心です。
6.1 自己対局ループ
- 初期モデルを用意(ランダム重み、または教師あり学習で初期化)
- 現在のモデル同士で対局 を何百万回も行う(policy + MCTS で着手)
- 各局面の (盤面、policy、勝敗) を訓練データに保存
- このデータでネットを学習:
- policy ヘッド → MCTS が選んだ手の分布を学ぶ
- value ヘッド → 最終勝敗(+1 / -1 / 0)を学ぶ
- 新しいモデルが古いモデルに勝ち越したら、新モデルが 現役 に昇格
- 2 に戻る。永遠にループ
これを「policy iteration(方策反復)」の一種と見なすこともできます。 MCTS が現在のネットより少し賢い手を選んでくれるので、それを学ばせれば次世代ネットは少し強くなる、というブートストラップ構造です。
6.2 損失関数 — 2ヘッド同時学習
ネットの学習は、policy と value の2損失の和を最小化します:
$$ L = (z - v)^2 - \pi^\top \log p + c \|\theta\|^2 $$
- 第1項 $(z - v)^2$:value 損失(MSE) — 予測した勝率 $v$ と実際の勝敗 $z$ の二乗誤差
- 第2項 $-\pi^\top \log p$:policy 損失(交差エントロピー) — MCTS が出した分布 $\pi$ にネットの policy $p$ を近づける
- 第3項:L2 正則化(過学習防止)
6.3 報酬は「勝敗」だけ — シンプルさの威力
dlshogi の強化学習で使われる報酬は 勝敗(+1 / -1 / 0)のみ。 「歩を取ったら +5 点」「玉が逃げたら -3 点」のような 中間報酬は一切ない。
一見すると学習が遅そうに思えますが、これがむしろ 強さの本質:
- 人間の「常識」(駒得は良いこと、囲いは大事、etc.)に縛られない
- 勝つために何でもする — 駒損しても玉を取れば良い、という発想が出る
- 結果として 人間が思いつかない新しい戦法を編み出すことがある(AlphaZero のチェス・将棋でも観察された)
📚 補足:強化学習と教師あり学習のハイブリッド(クリックで展開)
純粋な AlphaZero はランダムから始まり、自己対局のみで強くなりますが、現実のプロジェクト(dlshogi 含む)では計算資源を節約するため:
- 初期段階:プロ棋譜・既存エンジンの自己対局棋譜で 教師あり学習(数日〜数週間で実用レベルに到達)
- 後期段階:そこから 自己対局による強化学習でさらに伸ばす
これは 第2章 補足「直交する2軸」 でいうと、「教師あり×DL」と「強化学習×DL」を 順番に使う イメージ。 実用的なベストプラクティスです。
6.4 計算資源 — 莫大なGPU時間
dlshogi の世界トップクラスのモデルを作るには、膨大な GPU 時間が必要です:
- 自己対局:数百万局以上 → GPUクラスターで数週間〜数ヶ月
- 1局あたり、両者がそれぞれ MCTS を 1000+ 回回す
- そのつどネット forward → GPU で1回数msかかる
- 個人開発者には クラウドGPU(AWS / GCP) や有志の分散環境が頼り
ここが NNUE 系(CPUの自己対局でデータ生成可能)との大きな違い。 DL 系は GPU 沼に踏み込む覚悟が必要 です。
7. 関連プロジェクト
dlshogi 単体ではなく、周辺の関連プロジェクトも併せて見ると、日本のDL系将棋AIの全体像が見えてきます。
7.1 AobaZero — 純粋な AlphaZero クローン
- 位置づけ:「人間棋譜を一切使わず、自己対局のみで強くする」AlphaZero の純粋再現
- 特徴:分散プロジェクトとして有志が GPU を持ち寄って自己対局を継続
- dlshogi との違い:dlshogi は実用優先で「教師あり初期化 → 強化学習」のハイブリッドが普通。AobaZero は学術的純度を保つ
7.2 ふかうら王 — やねうら王 + dlshogi 評価エンジン
- 位置づけ:やねうら王の探索フレームに、dlshogi の評価ネットを接続したエンジン
- 特徴:やねうら王の α-β探索の枠組みで DL ネットを評価関数として使うアプローチ
- 意義:純粋 MCTS とは違う探索方式で、DL ネットの活かし方を探る実験的プロジェクト
7.3 棋神アナリティクス — 商用化された DL 系
- 位置づけ:HEROZ が提供する将棋AI解析サービス。背景に dlshogi 系の技術
- 特徴:プロ棋戦の中継・解析や、アマ棋士の学習サポート
- 意義:研究プロジェクトだった dlshogi が 実ビジネスに到達 した好例
7.4 開発者・コミュニティ
- 山岡忠夫氏のブログ:TadaoYamaokaの開発日記 — 開発の試行錯誤をリアルタイムで公開
- 著書:『将棋AIで学ぶディープラーニング』(マイナビ出版) — dlshogi の実装解説本
- 世界コンピュータ将棋選手権:毎年の大会で NNUE 勢と切磋琢磨
- 電竜戦:オンライン主体のコンピュータ将棋大会
8. NNUE型との対比 — 共存する2大潮流
ここまでで dlshogi の中身は十分つかめたはず。最後に、もう一方の主流である NNUE 型との対比をまとめます。 第7章 §3 よりも踏み込んだ比較です:
| 観点 | NNUE 型(やねうら王・水匠) | DL 型(dlshogi・ふかうら王) |
|---|---|---|
| 評価ネット | 浅いMLP(4層、HalfKP_256x2-32-32) | 深いCNN + ResNet(10〜40段) |
| 入力 | HalfKP特徴ベクトル(約41,024次元、スパース) | 9×9×100 テンソル(密、画像的) |
| 出力 | 評価値スカラー1個 | policy(2187次元)+ value(スカラー)の 2ヘッド |
| 探索 | α-β(全幅、枝刈り) | MCTS(選択的、policy で絞る) |
| 1秒の局面数 | 数百万〜数千万 | 数千〜数万 |
| 得意な局面 | 終盤の詰み・寄せ、戦術的読み | 中盤の大局観、戦略的判断 |
| ハード | CPU(マルチコア、AVX) | GPU(NVIDIA + CUDA / TensorRT) |
| 学習 | 教師あり(強いエンジンの自己対局棋譜) | 強化学習(自己対局、ハイブリッドあり) |
| 象限 | 教師あり × DL(浅い) | 強化学習 × DL(深い) |
| 発祥 | 日本(那須悠氏、2018)→ チェスにも輸出 | イギリス(DeepMind, 2017)→ 日本で実装 |
8.1 両者は「ライバル」ではなく「相補的」
この対比で重要なのは、どちらが強いかは局面によって変わる ということ:
- 終盤の詰み・寄せ:NNUE 型が圧倒的(秒間数千万局面の力技で読み切る)
- 序中盤の大局観・形勢判断:DL 型が得意(深いCNNが「囲いの厚さ」「攻めの厳しさ」を抽象的に評価)
- 新形・奇手:自己対局で学んだ DL 型が、NNUE が苦手とする未知の形に強いことがある
このため、現代の解析では NNUE 系と DL 系を併用する のが定石になっています。 第9章「棋士視点で最先端」 もぜひ参照してください。
📚 補足:それでも DL 系が NNUE 系より優れている1つの点 — 「人間に説明可能性が高い」(クリックで展開)
純粋な棋力では NNUE 系と DL 系はほぼ拮抗。 ただ、DL 系には1つ 「教育上の優位性」があります:
- policy 分布が出る → 「この局面でAIが選ぶ候補手 上位5つ」が確率付きで分かる
- value 勝率が出る → 「先手の勝率 65%」と人間にわかる指標
NNUE が出すのは 「評価値 +120」 という単一スカラーで、人間にはやや解釈しにくい。 観戦中継や教育コンテンツでは DL 系の出力の方が 視聴者・学習者に優しい 傾向があります。
棋神アナリティクスのような商用サービスが DL 系をベースにするのは、この説明可能性の高さも理由の一つです。
9. 関連リンク・もっと深く知るには
9.1 サイト内の関連章
- 第5章「CNN・Transformer」 — dlshogi の核となる CNN・ResNet の原理
- 第2章 補足「直交する2軸」 — 「強化学習 × DL」象限の位置づけ
- 第4章「学習の仕組み」 — 損失関数・最適化・誤差逆伝播
- 第7章「将棋AIで全部確認」 — dlshogi の概要(このページの前提)
- 第8章「CEDEC2024で深堀り」 — 開発者の生の声で将棋AIの最前線
- 第9章「棋士視点で最先端」 — 棋士・解説者から見たAI
9.2 詳細ページ間の横断
- NNUE 詳細ページ — DL 型の対抗馬。浅いMLPの世界
- やねうら王 詳細ページ — CPU 側の代表的フレームワーク
9.3 外部リソース(一次情報)
- GitHub: TadaoYamaoka/DeepLearningShogi — dlshogi 本家リポジトリ
- TadaoYamaokaの開発日記 — 山岡氏の開発ブログ
- 『将棋AIで学ぶディープラーニング』山岡忠夫著(マイナビ出版) — dlshogi 実装の教科書
- AlphaZero 論文(Silver et al., 2017): "Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm"
まとめ
- dlshogi は 山岡忠夫氏が開発する、日本のDL系将棋AIの代表格。AlphaZero のアプローチを将棋に適用したオープンソース
- アーキテクチャは 9×9×100 テンソル入力 → 深いCNN + ResNet × 10〜40段 → policy/value 2ヘッド
- 盤面を 画像のように扱い、CNN で局所〜抽象パターンを階層的に学習
- 探索は MCTS(PUCT版)。policy で読むべき手を絞り、value で末端を評価。秒間数千〜数万局面を 賢く深く 読む
- 学習は 自己対局による強化学習。報酬は勝敗のみ。人間の棋譜不要で永遠に強くなれる
- NNUE 型とは「浅く広く vs 狭く深く」「CPU vs GPU」「教師あり vs 強化学習」のすべてで対極。両者は共存し、相補的
dlshogi は、機械学習の 最先端アイデア(深いCNN・ResNet・MCTS・強化学習)が将棋に集約された結晶。 このページの内容を踏まえて 第8章 CEDEC2024 や 第9章 棋士視点 を読むと、開発者・棋士の生の言葉がいっそう響くはずです。