入力特徴量の設計
ニューラルネットワークは数値しか処理できません。囲碁を理解させるには、盤面を「翻訳」して数値に変換する方法が必要です。
この翻訳プロセスが入力特徴量設計です。
AlphaGoは48の特徴プレーンを使用し、AlphaGo Zeroは17に簡略化、KataGoは22に最適化しました。この記事では、これらの設計選択の背後にある考慮点を詳しく解説します。
特徴プレーンとは?
基本概念
特徴プレーンとは19×19の行列で、各要素が盤上の対応する位置の特定の属性を表します。
例えば、「黒石の位置」という特徴プレーン:
盤面状態: 特徴プレーン(黒石):
A B C D E A B C D E
1 . . . . . 1 0 0 0 0 0
2 . ● . . . 2 0 1 0 0 0
3 . . ○ . . → 3 0 0 0 0 0
4 . . . ● . 4 0 0 0 1 0
5 . . . . . 5 0 0 0 0 0
- 黒石がある位置 = 1
- 黒石がない位置 = 0
複数の特徴プレーン
ニューラルネットワークは様々な情報を必要とするため、複数の特徴プレーンを積み重ねます:
これはカラー画像がR、G、Bの3チャンネルを持つのに似ています。囲碁の「画像」はN個のチャンネルを持ちます。
AlphaGoの48特徴プレーン
完全なリスト
AlphaGoは48の特徴プレーンを使用し、いくつかの大きなカテゴリに分かれます:
1. 石の位置(3プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 1 | 黒石 | 黒石あり = 1、なし = 0 |
| 2 | 白石 | 白石あり = 1、なし = 0 |
| 3 | 空点 | 空点 = 1、なし = 0 |
2. 履歴記録(16プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 4-11 | 黒石の履歴 | 1〜8手前の黒石の位置 |
| 12-19 | 白石の履歴 | 1〜8手前の白石の位置 |
なぜ履歴が必要なのか?
- コウの判断:即座に取り返せるかどうかを知る必要がある
- 着手意図:直近の数手が双方の計画を示す
- 時系列情報:CNN自体は時間を処理しないため、履歴プレーンがこれを補う
3. 呼吸点の特徴(8プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 20-23 | 1〜4呼吸点(自分) | 自分の石の連が1/2/3/4呼吸点 = 1 |
| 24-27 | 1〜4呼吸点(相手) | 相手の石の連が1/2/3/4呼吸点 = 1 |
呼吸点は囲碁で最も重要な戦術概念です:
- 1呼吸点:アタリ、まもなく取られる
- 2呼吸点:危険な状態
- 3呼吸点:注意が必要
- 4呼吸点以上:一時的に安全
4. アタリの特徴(8プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 28-31 | アタリ位置(自分) | ここに打つと相手の1/2/3/4個の石をアタリにできる |
| 32-35 | アタリ位置(相手) | ここに打つと自分の1/2/3/4個の石がアタリにされる |
アタリは囲碁で最も一般的な戦術です:
- 多くの石をアタリにする = より大きな脅威
- 異なる大きさのアタリには異なる対応が必要
5. シチョウの特徴(8プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 36-39 | シチョウ関連(自分) | 自分のシチョウに関連する位置 |
| 40-43 | シチョウ関連(相手) | 相手のシチョウに関連する位置 |
シチョウ(Ladder)は囲碁で有名な戦術です:
- 斜め方向に相手の石を追いかける
- 「シチョウ有利」か「シチョウ不利」かを判断する必要がある
- これは全局的な視野が必要で、従来のコンピュータ囲碁の難題だった
6. 合法性の特徴(1プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 44 | 合法位置 | 合法的に着手可能 = 1 |
これはネットワークが非合法手を出力するのを防ぎます:
- すでに石がある位置には打てない
- 禁じ手(自殺かつ取れない)には打てない
- コウを即座に取り返すことはできない
7. 辺・隅の特徴(4プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 45 | 辺からの距離1 | 1線上 = 1 |
| 46 | 辺からの距離2 | 2線上 = 1 |
| 47 | 辺からの距離3 | 3線上 = 1 |
| 48 | 辺からの距離4+ | 4線以上内側 = 1 |
辺と隅は囲碁で特別な意味を持ちます:
- 1線:死線、石が囲まれやすい
- 2線:生き筋だが効率が低い
- 3線:地線、堅実
- 4線:勢力線、影響力を追求
なぜこれほど多くの特徴が必要なのか?
DeepMindの設計理念はできるだけ多くの情報を提供し、ネットワーク自身に何が有用かを決めさせることです:
生の盤面 → 48特徴プレーン → ニューラルネットワーク → 判断
特徴エンジニアの仕事:囲碁知識を特徴にエンコードする
ニューラルネットワークの仕事:これらの特徴を組み合わせることを学ぶ
これは「ボールをニューラルネットワークに渡す」戦略です——人間が特徴設計を担当し、ネットワークが組み合わせの学習を担当します。
AlphaGo Zeroの簡略化:17特徴プレーン
革命的な変化
AlphaGo Zeroは入力特徴を大幅に簡略化しました:
| バージョン | 特徴プレーン数 | 人間の知識使用 |
|---|---|---|
| AlphaGo | 48 | 多量(呼吸点、シチョウなど) |
| AlphaGo Zero | 17 | ほぼなし |
17プレーンの構成
1. 石の位置履歴(16プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 1-8 | 黒石 T-0 から T-7 | 現在と過去7手の黒石の位置 |
| 9-16 | 白石 T-0 から T-7 | 現在と過去7手の白石の位置 |
2. 手番(1プレーン)
| プレーン | 名称 | 説明 |
|---|---|---|
| 17 | 手番 | 黒番 = 全て1、白番 = 全て0 |
なぜこれほど簡略化できるのか?
AlphaGo Zeroの核心的な洞察:
十分な計算資源と訓練時間があれば、ニューラルネットワークは自らこれらの特徴を学習できる
「呼吸点」「アタリ」「シチョウ」といった概念は、人類が数千年かけて発展させてきました。しかしAlphaGo Zeroは、ニューラルネットワークが数日で自ら学習できることを証明しました——しかも人間より優れた表現を学ぶ可能性もあります。
効果の比較
驚くべきことに、より少ない特徴を使用するAlphaGo Zeroの方がより強いのです:
| バージョン | 特徴数 | 訓練時間 | 最終棋力 |
|---|---|---|---|
| AlphaGo Master | 48 | 数ヶ月 | 約5185 Elo |
| AlphaGo Zero | 17 | 40日 | 約5185 Elo |
| AlphaGo Zero (3日) | 17 | 3日 | 人類超越 |
より少ない人間の知識が、より強い性能をもたらしました。
なぜ人間の知識がかえって負担になるのか?
1. 人間の知識には誤りがありうる
人間がまとめた囲碁のルールは経験的なもので、最適ではない可能性があります。例えば:
- 「金角銀辺草腹」——しかし特定の局面では中央がより重要
- 「シチョウ不利なら打つな」——しかし時には自ら捨て石にすることも
2. 特徴エンコーディングが表現を制限する
「呼吸点」を1〜4呼吸点の4プレーンにエンコードするとき、「呼吸点」が重要な分類方法であると暗黙的に仮定しています。しかしより良い分類方法があるかもしれず、このエンコーディングがネットワークの発見を妨げます。
3. 表現のボトルネック
48プレーンはより多くの計算資源を消費します。一部の特徴が冗長であれば、これらの資源は無駄になります。
KataGoの最適化:22特徴プレーン
実用主義的なバランス
KataGoはAlphaGo Zeroをベースに、厳選された少量の人間の知識を加えました:
| 項目 | AlphaGo Zero | KataGo |
|---|---|---|
| 履歴プレーン | 16 | 5 |
| 石の位置 | あり | あり |
| 手番 | あり | あり |
| コウ状態 | なし | あり |
| ルールバリアント | なし | あり(コミ、自殺ルールなど) |
| 合計 | 17 | 22 |
KataGoの特徴リスト
基本特徴(5つ)
| プレーン | 名称 | 説明 |
|---|---|---|
| 1 | 黒石 | 現在の黒石の位置 |
| 2 | 白石 | 現在の白石の位置 |
| 3 | 空点 | 現在の空点の位置 |
| 4 | 手番(1) | 常に1の定数プレーン |
| 5 | 手番(2) | 黒番 = 1、白番 = 0 |
履歴特徴(5つ)
| プレーン | 名称 | 説明 |
|---|---|---|
| 6 | 1手前の位置 | 相手の直前の着手位置 |
| 7 | 2手前の位置 | 自分の直前の着手位置 |
| 8 | 3手前の位置 | 相手の2手前の着手位置 |
| 9 | 4手前の位置 | 自分の2手前の着手位置 |
| 10 | 5手前の位置 | 相手の3手前の着手位置 |
コウの特徴(3つ)
| プレーン | 名称 | 説明 |
|---|---|---|
| 11 | コウ禁止点 | 現在打てないコウ禁止点 |
| 12 | 潜在コウ点(自分) | 自分がここに打つとコウになる |
| 13 | 潜在コウ点(相手) | 相手がここに打つとコウになる |
ルール特徴(9つ)
| プレーン | 名称 | 説明 |
|---|---|---|
| 14-22 | ルールエンコーディング | コミ、自殺ルール、スーパーコウなど |
なぜこれらの特徴を追加するのか?
KataGoの作者lightvectorの説明:
1. コウはあまりにも重要
コウは囲碁で最も複雑な概念の一つです。生の盤面状態からコウのルールを学ぶには、大量のサンプルが必要です。コウ禁止点を明示的に示すことで学習を加速できます。
2. ルールの多様性
囲碁には複数のルールがあります:
- コミ:中国ルール7.5目、日本ルール6.5目
- 自殺ルール:一部のルールでは自殺が許可される
- スーパーコウ:長いループの処理方法が異なる
入力にルールを明示的にエンコードすることで、一つのネットワークで全てのバリアントを処理できます。
3. 訓練効率
少量の人間の知識を加えることで、訓練を大幅に加速できます。KataGoは50 GPU日で達成した棋力を、AlphaGo Zeroは5000+ TPU日かかりました。
特徴設計の哲学
3つのアプローチ
| アプローチ | 代表 | 特徴数 | 人間の知識 | 計算要求 |
|---|---|---|---|---|
| 多量の人間の知識 | AlphaGo | 48 | 多い | 中程度 |
| 最小限の人間の知識 | AlphaGo Zero | 17 | ほぼなし | 非常に高い |
| 適度な人間の知識 | KataGo | 22 | 厳選された少量 | 比較的低い |
トレードオフの考慮
リソースが限られている場合
計算資源が限られている場合(ほとんどの研究者の状況)、人間の知識を加えることは賢明です:
- 訓練収束を加速
- 必要な訓練データを削減
- 車輪の再発明を避ける
極限を追求する場合
計算資源が十分にある場合、人間の知識を減らすことでより高い棋力に到達できる可能性があります:
- 人間のバイアスを避ける
- 人間が知らない戦略を発見
- 真の「ゼロからのスタート」
示唆
AlphaGoシリーズの進化は私たちに教えてくれます:
- 特徴工学は依然として重要——しかし形が変わった
- エンドツーエンド学習がトレンド——ネットワーク自身に特徴を学ばせる
- 唯一の正解はない——リソースと目標に依存する
実装例
特徴抽出(AlphaGoスタイル)
import numpy as np
def extract_features_alphago(board, history, current_player):
"""
AlphaGoスタイルの48特徴プレーンを抽出
board: 19×19の盤面、0=空、1=黒、2=白
history: 直近8手の履歴
current_player: 1=黒、2=白
"""
features = np.zeros((48, 19, 19))
# 1-3: 石の位置
features[0] = (board == 1) # 黒石
features[1] = (board == 2) # 白石
features[2] = (board == 0) # 空点
# 4-19: 履歴位置
for i, hist_board in enumerate(history[:8]):
features[3 + i] = (hist_board == 1) # 黒石履歴
features[11 + i] = (hist_board == 2) # 白石履歴
# 20-27: 呼吸点特徴
liberties = compute_liberties(board)
for i, lib_count in enumerate([1, 2, 3, 4]):
my_color = current_player
opp_color = 3 - current_player
features[19 + i] = (liberties == lib_count) & (board == my_color)
features[23 + i] = (liberties == lib_count) & (board == opp_color)
# 28-35: アタリ特徴
capture_counts = compute_captures(board)
for i, cap_count in enumerate([1, 2, 3, 4]):
features[27 + i] = (capture_counts[current_player] == cap_count)
features[31 + i] = (capture_counts[3-current_player] == cap_count)
# 36-43: シチョウ特徴(簡略化)
ladder_status = compute_ladder(board)
# ... 詳細実装は省略 ...
# 44: 合法位置
features[43] = compute_legal_moves(board, current_player)
# 45-48: 辺からの距離
for i in range(19):
for j in range(19):
dist = min(i, j, 18-i, 18-j)
if dist == 0:
features[44, i, j] = 1
elif dist == 1:
features[45, i, j] = 1
elif dist == 2:
features[46, i, j] = 1
else:
features[47, i, j] = 1
return features
特徴抽出(AlphaGo Zeroスタイル)
def extract_features_zero(board_history, current_player):
"""
AlphaGo Zeroスタイルの17特徴プレーンを抽出
board_history: 直近8手の盤面状態リスト
current_player: 1=黒、2=白
"""
features = np.zeros((17, 19, 19))
# 1-8: 黒石のT-0からT-7の位置
for i, board in enumerate(board_history[:8]):
features[i] = (board == 1)
# 9-16: 白石のT-0からT-7の位置
for i, board in enumerate(board_history[:8]):
features[8 + i] = (board == 2)
# 17: 手番
if current_player == 1: # 黒番
features[16] = np.ones((19, 19))
else:
features[16] = np.zeros((19, 19))
return features
性能比較
import time
# 1000回の特徴抽出をシミュレート
board = np.random.randint(0, 3, (19, 19))
history = [np.random.randint(0, 3, (19, 19)) for _ in range(8)]
# AlphaGoスタイル(複雑な計算あり)
start = time.time()
for _ in range(1000):
features = extract_features_alphago(board, history, 1)
alphago_time = time.time() - start
# AlphaGo Zeroスタイル(シンプル)
start = time.time()
for _ in range(1000):
features = extract_features_zero(history, 1)
zero_time = time.time() - start
print(f"AlphaGoスタイル: {alphago_time:.2f}s")
print(f"AlphaGo Zeroスタイル: {zero_time:.2f}s")
# 典型的な結果:AlphaGoスタイルは5-10倍遅い
特徴プレーンの可視化
実際の局面例
実際の盤面:
A B C D E F G H J K L M N O P Q R S T
19 . . . . . . . . . . . . . . . . . . .
18 . . . . . . . . . . . . . . . . . . .
17 . . . ● . . . . . . . . . . . ○ . . .
16 . . . . . . . . . . . . . . . . . . .
15 . . . . . . . . . . . . . . . . . . .
...
特徴プレーン1(黒石):
A B C D E F G H J K L M N O P Q R S T
19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
17 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
...
特徴プレーン2(白石):
A B C D E F G H J K L M N O P Q R S T
19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
...
特徴プレーンからの洞察
異なる特徴プレーンを観察することで、モデルが「見ている」ものを理解できます:
| 特徴 | 直感的な意味 | モデルが学びうること |
|---|---|---|
| 黒石/白石の位置 | 誰がどこにいるか | 石の形、連結性 |
| 履歴 | 最近何が起きたか | 着手意図、戦いの方向 |
| 呼吸点 | 誰が危険か | 攻撃/防御の目標 |
| アタリ | 戦術的機会 | 局所的な戦術 |
| 辺からの距離 | 位置の重要性 | 序盤の選点、辺・隅の定石 |
アニメーション対応
この記事で扱う核心概念とアニメーション番号:
| 番号 | 概念 | 物理/数学対応 |
|---|---|---|
| A8 | 特徴エンコーディング | テンソル表現 |
| A10 | 入力正規化 | 特徴工学 |
| D1 | 畳み込み入力 | マルチチャンネル画像 |
| E3 | Zeroの簡略化 | 最小表現 |
関連記事
- 前の記事:Value Network詳解 — 局面価値の評価方法
- 次の記事:CNNと囲碁の融合 — 畳み込みニューラルネットワークが盤面を処理する方法
- 関連トピック:盤面状態の表現 — より低レベルなデータ構造
重要ポイント
- 特徴プレーンは盤面のデジタル表現:各プレーンは19×19の行列
- AlphaGoは48プレーンを使用:多くの人間の囲碁知識を含む
- AlphaGo Zeroは17に簡略化:ネットワークが自ら特徴を学べることを証明
- KataGoは22に最適化:効率と性能のバランス
- 特徴設計はトレードオフ:人間の知識 vs 計算資源
入力特徴量設計は「人間が理解する囲碁」と「機械が処理できる数値」を繋ぐ架け橋です。
参考資料
- Silver, D., et al. (2016). "Mastering the game of Go with deep neural networks and tree search." Nature, 529, 484-489.
- Silver, D., et al. (2017). "Mastering the game of Go without human knowledge." Nature, 551, 354-359.
- Wu, D. (2019). "Accelerating Self-Play Learning in Go." arXiv:1902.10565.
- KataGo Documentation: https://github.com/lightvector/KataGo