第3章: Zeroとその先: 人間なしで学ぶ

AlphaGo Zero、AlphaZero、MuZero、そして人間が入れたものすべての体系的な除去

📖 Reading Time: 20-25 minutes 📊 Difficulty: Beginner 💻 Code Examples: 0 📝 Exercises: 0

ビデオ講義

このビデオは以下のテキストと同じ内容をカバーしています。お好みの学習形式をお選びください。

🌐 JP | 🇬🇧 EN | Last sync: 2026-08-19

機械学習道場 > AlphaGoからAlphaFoldへ > 第3章

イ・セドルと対局したバージョンのAlphaGoは、重要な意味において共同作業でした。強い人間棋士どうしの対局の大規模なコレクションを見せられ、競うことを学ぶより前に、それらを模倣することを学んでいたのです。人間の判断はこのシステムの土台の中にありました——最初にもっともらしいと教えられたものの中に、そして盤面の局面をシステムに記述する手作りの特徴量の中に。

ここから、哲学的に聞こえるけれども実際には検証可能な答えをもつ工学的な問いが立ち上がります。人間の知識は助けになっていたのか、それとも天井だったのか?

本章はその答えを3つのシステムを通して追います。それぞれが、人間が供給していたものをもう1つずつ取り除きました。AlphaGo Zero(2017年に Nature 誌で発表)は人間の対局を取り除きました。AlphaZero(2017年に発表)は、このレシピがそもそも囲碁についてのものだという前提を取り除きました。MuZero(2019年に発表、2020年に Nature 誌で公表)はルールそのものを取り除きました。この軌跡は、組み込みの知識が少ないほうが、自分自身の経験を生成する仕組みと組み合わされば、組み込みの知識が多いほうに勝ちうる ことの、機械学習における最もきれいな実証の1つです——そして最終節は、その教訓がどこで通用しなくなるのかについて、同じくらい率直です。

3.1 AlphaGo Zero: 教師を必要としないループ

AlphaGo Zeroは ランダムな打ち方 から始まります。与えられるのは囲碁のルールと盤面局面の記述だけで、他には何もありません——棋譜も、定石書も、良い形とは何かを符号化した手作りの特徴量もありません。第2章では、AlphaGoを段階的に訓練された複数の専用ネットワークからなるシステムとして記述しました。AlphaGo Zeroはその構成を 2つのヘッドをもつ単一のニューラルネットワーク に置き換えます。

このネットワークは盤面局面を取り、2つのものを出力します。

両方のヘッドは同じ共有の胴体の上に載っているので、局面を読むことについてネットワークが学ぶことのすべてが、両方の仕事に同時に役立ちます。しかしこのネットワーク自体は、それだけではプレイヤーではありません。プレイヤーはネットワーク + 探索 であり、両者の関係こそがこの発想の全体です。

📚 方策改善作用素としての探索

これが立ち止まる価値のある概念です。本章の他のすべては、その帰結だからです。

ある局面でのネットワークの方策を取ります。それは当て推量です——訓練の初期には、下手な当て推量です。ここでその局面からモンテカルロ木探索を走らせます。方策を使ってどの枝を探索する価値があるかを決め、価値ヘッドを使って探索が到達した局面を判定します。探索は実際の計算量を費やします。先を読み、方策が気に入っていた手が3手先で困難に陥ることを発見し、方策がほとんど無視していた手が実は強いことを発見します。

探索が終わったら、それが注意をどう配分したか——どの手を最も多く訪問したか——を見ます。その 訪問分布は、出発点の方策よりも良い方策です。仮定によってではなく、構成によってそうなのです。探索は生の方策を取り、実際の先読みによってそれを精錬しました。その精錬こそが、追加の計算量が買ったものです。

したがって探索は 方策改善作用素 です。計算量を代価として、任意の方策をより良い方策に変える手続きです。

ここでループを閉じます。もし探索がネットワークの方策より確実に良い方策を生み出すなら、探索の結果は訓練の目標値になります。探索が決めたものを出力するようにネットワークを訓練するのです。ネットワークは、以前なら丸ごと1本の先読みの木を必要とした判断を、1回の高速な順伝播の中へ吸収します。そしてネットワークがより良くなったので、次の探索——ネットワークに誘導される探索——もより良くなり、それがさらに良い目標値を生み出します。

価値ヘッドは同じループの中で、異なる信号から学びます。各自己対局は勝ちか負けで終わり、その対局のあらゆる局面が最終的な結果に向けて訓練されます。人間が局面を良い/悪いとラベル付けすることは決してありません。ゲーム自身の結果がそれをやるのです。

📚 なぜカリキュラムは自分で面倒を見てくれるのか

自己対局だけから学ぶシステムには、明白な危険があります。最初はひどく下手なので、ひどいデータしか生成できません。ブートストラップはどこから来るのでしょうか。

答えは、自己対局が自動的にちょうど良い強さの相手——自分自身——を供給する ことにあります。ランダムなプレイヤー対ランダムなプレイヤーが生む対局はノイズですが、それは 決着のつく ノイズです。誰かが勝つのです。それだけの信号があれば、ランダムよりわずかに良い何かを学ぶには十分です。次に「ランダムよりわずかに良い」が「ランダムよりわずかに良い」と対局し、対局はわずかにより意味のあるものになり、以下同様です。

これは 自分自身を生成するカリキュラム です。学習しようがないほど難しい問題を提示することは決してありません。難易度が学習者自身の現在の能力に釘付けされているからです。固定された人間の対戦相手にはこれができません——強すぎれば毎局が理解不能な敗北になり、弱すぎれば学ぶことが残りません。自己対局は学習者に自動的に、永久に追随します。

3.2 なぜ人間の知識を取り除くと良くなったのか

こうして訓練されたAlphaGo Zeroは、イ・セドルを破ったほうの旧バージョンのAlphaGoを打ち負かしました。厳密に より少ない 情報を与えられたシステムが、より多く与えられたシステムに勝ったのです。切り分けておくべき理由が3つあります。

人間の事前知識は、床であると同時に天井でもある。 人間の対局を模倣して方策を初期化すると、素早い出発が得られます。ランダムではなく、それなりに筋の通った場所から始められるからです。しかし同時に、あなたは 人間が打つ手の分布の内側 から始めることになります。そして強い人間が誰も打たない手は、構成上、あなたの初期方策がありそうにないと考える手です。その方策に誘導された探索は、そうした手をめったに見ません。人間の知識は初期の登りを加速させ、そして静かに、登る空間を狭めるのです。

手作りの特徴量は、何が重要かについての仮定を符号化する。 すべての手作り特徴量は、盤面のある性質は計算する価値があるという判断であり、暗黙のうちに、計算されていないすべては注意に値しないという判断でもあります。生の局面を読むネットワークは、自分自身の特徴——誰も名前を付けようと思わなかったものを含めて——を発見する自由をもちます。

目的関数が純粋に目的関数になる。 部分的に人間を模倣するよう訓練されたシステムは、2つのことを同時に最適化しています。勝つことと、人間のプレイヤーらしく見えることです。この2つは大きく重なりますが完全には一致せず、乖離する場所では模倣は気を散らすものになります。それを取り除けば、残る圧力はゲーム自身の結果だけになります。

📚 生徒が教科書を追い越した

天井の議論に対する最も印象的な証拠は、AlphaGo Zeroが 定石 ——人間の囲碁棋士が何世紀にもわたって精錬し、確立された理論として学んできた標準的な隅の手順——について学んだことから来ました。

ゼロから訓練して、このシステムはそれらの手順の多くを自力で再発見しました。それだけでも注目に値します。人間の伝統が何世代もかけて切り出したパターンが、その伝統に一度も触れることなく自己対局から立ち現れたのです。

そして、もっと興味深いことをしました。訓練が進むにつれて、そのいくつかを捨てた のです。人間の理論が採用しなかった代替手順を選好して。

この話の両方の半分が重要です。再発見は、人間の囲碁理論が本当にゲームの中の実在の構造を見つけていたことを語ります——定石は恣意的な慣習ではなかったのです。その後の離反は、その理論が 不完全 だったこと、そしてそれを正解として教え込まれたシステムであれば、それに気づくのがはるかに難しかったであろうことを語ります。教科書で初期化された生徒は教科書の近くに留まりがちです。すべてを自分で導出する生徒は、あるページが間違っていることに気づけるのです。

3.3 AlphaZero: 1つのレシピ、3つのゲーム

もしレシピが本当に囲碁固有の知識を含まないのなら、それは他のゲームでも機能するはずです。2017年に発表された AlphaZero は、まさにそれを検証しました。同じ「自己対局+探索」のアルゴリズムを、囲碁だけでなく チェス と 将棋 にも適用し、それぞれを自己対局のみから学習させたのです。

これが重要だったのは、とりわけチェスには長く高度に最適化された対抗する伝統があったからです。古典的なチェスエンジンは逆向きに構築されています。数十年にわたって蓄積されたチェスの理解を符号化した手作りの評価関数の上に、膨大な数の局面を吟味し、丹念に調整されたヒューリスティックで枝刈りする探索が駆動します。手強い設計であり、きわめて長いあいだ精錬されてきたものでした。

探索スタイルの対比は定性的に述べておく価値があります。2つの哲学の違いを最も明快に表現しているからです。

一方のシステムは浅い評価を幅で補い、他方は限られた幅を深い評価で補います。AlphaZeroは、2つ目のトレードが1つ目に対して通用しうることを示し——そして本シリーズにとってより重要なことに、同じコードを3つの異なるゲームに向けて、そのすべてを学習できる ことを示しました。囲碁の結果は、囲碁の結果でしかなかったかもしれません。3つのゲームがあれば、それは手法になります。

3.4 MuZero: ルールを手放す

AlphaZeroにはまだ1つ、実質的な贈り物が与えられていました。ルール です。木探索を走らせるには「この手を打ったら、どの局面になるのか?」と問えなければなりません——そしてAlphaZeroには、即座かつ厳密に答える完璧なシミュレータが手渡されていました。

これは本物の限界です。興味深い問題のほとんどは、そんなものを備えていないからです。2019年に発表され2020年に Nature 誌で公表された MuZero は、それを取り除きました。

MuZeroは自分自身の 環境のモデル を経験から学習します。3つの学習された構成要素が協働します。

これらがあれば、MuZeroは完全に自分の頭の中だけで木探索を走らせられます。現在の内部状態から始め、ダイナミクス関数を適用してある行動の帰結を想像し、もう一度適用し、想像された状態を予測関数で評価する。ルールを一度も教わることなく計画を立てるのです。

📚 重要なものだけのモデル

決定的な設計判断は、学習されたモデルに何を要求 しない かにあります。

従来のモデルベースのエージェントは、環境を再構成する モデルを学習します。状態と行動が与えられたとき、次に実際に何を観測するか——次の画面、次の配置——を予測するモデルです。これは直観的であり、そして罠です。観測に含まれるものの大半は、良い意思決定とは無関係だからです。観測を再現するよう訓練されたモデルは、勝っているかどうかとは何の関係もない視覚的な細部にその容量を費やし、しかもその誤差は探索が必要とする複数ステップにわたって累積します。

MuZeroの内部状態は 何かを再構成するようには訓練されません。内部状態を観測へ復号し戻せるという要件は存在しません。ダイナミクス関数にかかる唯一の訓練圧力は、探索が実際に消費する量——報酬、価値、方策 ——が、想像された軌跡に沿って正しく出てくることだけです。

これが すべてのモデル から 重要なもののモデル への転換です。内部状態は、解釈可能である必要も、完全である必要も、人間が認識するいかなる意味でも忠実である必要もありません。ただ 計画にとって十分 でありさえすればよいのです。再構成型のモデルが見た目に費やすはずだった容量が、代わりに帰結に費やされます。

その見返りは一般性です。ルールを必要としなかったがゆえに、MuZeroは Atari のゲームも学習しました。そこではエージェントにピクセルとスコアが与えられるだけで、ゲームの仕組みについての記述は一切与えられません——AlphaZeroのアプローチが単純に適用できない設定です。同じシステムが、精確でルールに定義されたボードゲームの世界と、乱雑でルールの分からないビデオゲームの世界の両方をカバーしたのです。

3.5 軌跡と、それが止まる場所

3つのシステムを順に読めば、パターンは引き算です。

システム 与えられたもの 取り除かれたもの
AlphaGo 人間の対局、手作りの特徴量、ルール —
AlphaGo Zero 手作りの特徴量は最小化、ルール 人間の棋譜
AlphaZero ルール 囲碁固有の作り込みすべて
MuZero 観測と報酬 ルールそのもの

各段階が人間の供給した何かを取り除き、各段階が前より一般的なシステムを生み出しました。人々がここから受け取った一般的な教訓——しばしば「人間の洞察を符号化する手法より、計算量とともにスケールする手法を選好せよ」と述べられるもの——は、ここでは真に支持されています。

📚 誠実な留保

そこで章を終えることは簡単ですし、そして誤解を招くでしょう。この軌跡を成立させる条件は厳しく、現実の問題のほとんどはそれを満たしません。

自己対局は、安価で高速で完璧なシミュレータ——あるいはそれを学習する手立て——を必要とする。 囲碁は無視できるコストで何百万回も打てますし、間違えても何の帰結もありません。創薬候補を何百万回も合成することはできません。製造ラインを、何が起きるか確かめるために墜落させることはできません。経験が高価なところでは、この軌跡全体を駆動するエンジンが失速します。

報酬はきれいで曖昧さがなくてはならない。 ボードゲームは完璧で、異論がなく、終局時に即座に得られる信号を手渡します。勝ったか、勝たなかったか。現実の目的関数のほとんどはこれと似ても似つきません。遅延し、部分的にしか観測されず、利害関係者のあいだで争われ、あるいは本当に欲しいものの代理指標としてしか定義できません——そして代理指標こそ、強力な最適化器が悪用するまさにそのものです。

問題は自己完結していなければならない。 囲碁は、完全な状態が可視で、ダイナミクスが決して変わらない閉じた世界です。現実の環境は開いており、部分的にしか観測されず、非定常です。

MuZeroは第1の条件を緩和しますが、除去はしません。 自分自身のモデルを学習するということは、与えられた シミュレータを必要としないということですが、それでもシミュレータを 学習する のに十分な環境との相互作用は必要であり、それは経験が不要であることとは違います。

したがって正しい読み方は「自己対局が物事を解決する」ではありません。こうです。自分自身の経験を安価に生成でき、それを曖昧さなく採点できるところでは、組み込みの人間の知識は取り除く価値のある天井である。 第4章は、これらの条件を1つも満たさない問題——シミュレータなし、自己対局なし、報酬関数なし——へ向かい、まったく異なる仕方で攻略されなければならなかった経緯を扱います。本シリーズの2つの半分をつなぐ橋は、技術ではありません。それは 進化がすでにデータを生成し終えていた という発見なのです。

3.6 ハンズオン: 見える形の方策改善

探索が方策を改善し、その改善を方策へ訓練し戻せるという主張は、述べるのも頷くのも簡単です。ここではそれを、あなたが走らせられるものとして示します。

舞台は三目並べです——全体が数秒で終わるほど小さく、しかも何が学習されたのかを検分できるほど小さい。コードはAlphaGo Zeroのループを誠実に実装しますが、意図的な単純化が2つあります。「ニューラルネットワーク」がルックアップテーブルであること、そして探索が根ノードだけを展開することです。それ以外はすべて本物の構造です。世代0は一様ランダムな打ち方です。各世代は、すべての手を探索で選ぶ 自己対局を行い、各局面での探索の訪問分布を記録し、それから次の方策をその分布に向けて訓練します。

測定の部分が重要です。各世代は 探索なしで、固定された世代0のランダム方策を相手に採点されます。したがってあらゆる改善は、探索が 方策 に教え込んで保持させることに成功した改善でなければなりません——評価時に探索がその場でやっている改善ではないのです。

import numpy as np

# ---------------------------------------------------------------
# 三目並べ上の、ミニチュア版AlphaGo Zeroループ。強いプレイヤーでは
# なく、「探索は方策改善作用素である」ことの実証である。現在の方策の
# 上で探索を走らせ、次の方策をその探索が決めたものの模倣へ訓練する。
# 入力はルールだけ、それ以外には何もない。
# ---------------------------------------------------------------
rng = np.random.default_rng(20171018)

N_GENERATIONS = 6      # ループを回す回数
GAMES_PER_GEN = 60     # 1世代あたりの自己対局数
SIMS_PER_MOVE = 80     # 各手における探索の予算
TEMPERATURE = 0.5      # 1未満にすると訪問回数を鋭くして訓練目標にする
EXPLORE = 0.25         # 自己対局中にランダムな手を打つ確率(カバレッジ維持)
ALPHA = 0.7            # 各訓練ステップが目標へどれだけ近づくか
EVAL_GAMES = 600       # 世代を世代0に対して採点するための対局数

LINES = [(0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6),
         (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)]


def result_of(board):
    """(終局したか, スコア) を返す。スコアはプレイヤー1の視点。"""
    for a, b, c in LINES:
        if board[a] != 0 and board[a] == board[b] == board[c]:
            return True, (1 if board[a] == 1 else -1)
    return (True, 0) if not (board == 0).any() else (False, 0)


def policy_of(table, board):
    """ある状態での方策。未知の状態は一様ランダムにフォールバックするので、
    空のテーブルはちょうど世代0のランダムプレイヤーそのものになる。"""
    p = table.get(board.tobytes())
    if p is None:
        p = np.zeros(9)
        p[np.flatnonzero(board == 0)] = 1.0
    return p / p.sum()


def rollout(table, board, player, rng):
    """現在の方策で終局まで打つ。スコアはプレイヤー1を基準とする。"""
    b, turn = board.copy(), player
    while True:
        over, score = result_of(b)
        if over:
            return score
        b[rng.choice(9, p=policy_of(table, b))] = turn
        turn = 3 - turn


def search(table, board, player, rng, c=1.4):
    """最小限のMCTS: 根だけを展開する。各シミュレーションは根の手を
    UCBで選び、現在の方策が打つロールアウトでそれを評価する。
    重要な出力は「訪問回数」の分布である。"""
    moves = np.flatnonzero(board == 0)
    counts, totals = np.zeros(len(moves)), np.zeros(len(moves))
    sign = 1 if player == 1 else -1

    for sim in range(SIMS_PER_MOVE):
        unvisited = np.flatnonzero(counts == 0)
        if len(unvisited):
            i = int(unvisited[0])
        else:
            i = int(np.argmax(totals / counts
                              + c * np.sqrt(np.log(sim) / counts)))
        child = board.copy()
        child[moves[i]] = player
        over, score = result_of(child)
        counts[i] += 1
        totals[i] += sign * (score if over
                             else rollout(table, child, 3 - player, rng))

    sharp = counts ** (1.0 / TEMPERATURE)
    pi = np.zeros(9)
    pi[moves] = sharp / sharp.sum()
    return pi


def self_play_game(table, rng):
    """自分自身との1局。探索の出力はすべて目標値として保持する。"""
    board, turn, records = np.zeros(9, dtype=np.int8), 1, []
    while True:
        if result_of(board)[0]:
            return records
        pi = search(table, board, turn, rng)
        records.append((board.tobytes(), pi))
        # ときどきランダムな手を挟むことで自己対局のカリキュラムを広く保つ——
        # 本物のシステムで根にディリクレノイズが担っている仕事である
        board[int(rng.choice(np.flatnonzero(board == 0)) if rng.random() < EXPLORE
                  else rng.choice(9, p=pi))] = turn
        turn = 3 - turn


def train(table, batch):
    """各状態の方策を、そこで探索が決めたもののほうへ動かす。
    本物のシステムはこれらの目標値にニューラルネットワークを当てはめ、
    それによって一度も見ていない状態へ汎化する。ここではテーブルが
    モデルそのものなので、当てはめは加重平均に帰着する——だがループは同じ。"""
    new = dict(table)
    for key, pis in batch.items():
        target = np.mean(pis, axis=0)
        new[key] = (1 - ALPHA) * new[key] + ALPHA * target if key in new else target
    return new


def play_match(table_a, table_b, seed):
    """生の方策どうし、探索なし。Aは半数の対局で先手を持つ。"""
    rng = np.random.default_rng(seed)
    wins = draws = 0
    for g in range(EVAL_GAMES):
        board, a_first, turn = np.zeros(9, dtype=np.int8), g % 2 == 0, 1
        while True:
            over, res = result_of(board)
            if over:
                a_side = 1 if a_first else 2
                draws += res == 0
                wins += res != 0 and (res == 1) == (a_side == 1)
                break
            table = table_a if ((turn == 1) == a_first) else table_b
            board[rng.choice(9, p=policy_of(table, board))] = turn
            turn = 3 - turn
    return wins / EVAL_GAMES, draws / EVAL_GAMES


# --- ループ -----------------------------------------------------
gen0 = {}          # 空のテーブルが、そのまま一様ランダムなプレイヤーである
table = gen0

print("Gen 0 = uniform random play (the table is empty). Each generation:")
print("self-play with search, then fit the next policy to the search's")
print("visit counts. Scoring opponent is ALWAYS gen 0, and the scored")
print("policy plays WITHOUT search -- so any gain is improvement kept.\n")
print(f"{'gen':>4} {'states known':>13} {'win %':>8} {'draw %':>8} {'score':>8}")
print("-" * 45)

for gen in range(N_GENERATIONS + 1):
    if gen > 0:
        batch = {}
        for _ in range(GAMES_PER_GEN):
            for key, pi in self_play_game(table, rng):
                batch.setdefault(key, []).append(pi)
        table = train(table, batch)
    win, draw = play_match(table, gen0, seed=1000 + gen)
    print(f"{gen:>4} {len(table):>13} {100*win:>7.1f}% {100*draw:>7.1f}% "
          f"{win + 0.5*draw:>8.3f}")

# --- 実際に何を学んだのか? --------------------------------------
opening = policy_of(table, np.zeros(9, dtype=np.int8))
print("\nOpening preference of the final policy (P of each first move):")
for row in opening.reshape(3, 3):
    print("   " + "   ".join(f"{x:.3f}" for x in row))
print(f"   centre {opening[4]:.3f}   corner avg {opening[[0, 2, 6, 8]].mean():.3f}"
      f"   edge avg {opening[[1, 3, 5, 7]].mean():.3f}"
      f"   (uniform = {1/9:.3f})")

tactic = np.array([1, 1, 0, 2, 2, 0, 0, 0, 0], dtype=np.int8)  # いまマス2で勝てる
print("\nTactical test    X X .     (X to move; cell 2 wins on the spot)")
print("                 O O .")
print("                 . . .")
print(f"   P(winning move) = {policy_of(table, tactic)[2]:.3f}"
      f"   vs uniform-random {1/6:.3f}")

出力:

Gen 0 = uniform random play (the table is empty). Each generation:
self-play with search, then fit the next policy to the search's
visit counts. Scoring opponent is ALWAYS gen 0, and the scored
policy plays WITHOUT search -- so any gain is improvement kept.

 gen  states known    win %   draw %    score
---------------------------------------------
   0             0    43.5%    12.2%    0.496
   1           283    50.2%    14.0%    0.572
   2           482    54.8%    12.0%    0.608
   3           662    55.8%    13.8%    0.628
   4           843    58.8%    10.5%    0.641
   5           994    58.8%    11.8%    0.648
   6          1138    60.0%    11.7%    0.658

Opening preference of the final policy (P of each first move):
   0.168   0.058   0.141
   0.042   0.187   0.083
   0.131   0.073   0.117
   centre 0.187   corner avg 0.139   edge avg 0.064   (uniform = 0.111)

Tactical test    X X .     (X to move; cell 2 wins on the spot)
                 O O .
                 . . .
   P(winning move) = 0.959   vs uniform-random 0.167

結果の読み方。 興味深さの低いものから順に4つ挙げます。

このデモが示していないこと、そして示していると読んではならないこと。 3つの限界を名指ししておく価値があります。それぞれが、本物のシステムが解かねばならなかった何かに対応するからです。

スコアは頭打ちになり、しかも1.0をかなり下回るところで頭打ちになります。その一部は相手のせいです——ランダムなプレイヤーは、こちらがどれほど上手でも、ときどき引き分けや勝ちに転がり込みます——そして一部は本物の限界です。ルックアップテーブルには 汎化がありません。たまたま訪れた1138局面しか知らないのです。ある局面で学んだことを、一度も見ていない類似の局面へ転移させるニューラルネットワークの能力こそ、このデモが捨てている材料です。増えていく「states known」の列は機能ではなく、ネットワークを持たないことのコストなのです。

ここでの探索は根ノードだけを展開します。本物のMCTSは木を構築しますし、3.3節で述べた深く選択的な先読みは、まさに根だけの探索にできないことです。

そして三目並べは自明なほど小さい。本章の軌跡が演習ではなく研究上の達成だったのは、同じループを、何も列挙できず、すべてがネットワークの良い汎化に依存する、天文学的に大きな空間をもつゲームで機能させねばならなかったからです。

EXPLORE を 0.0 に変えて再実行してみてください。自己対局はより狭くなり、カバレッジの増加は遅くなり、訓練が一度も探索しなかった局面へ迷い込む相手に対して方策の改善は小さくなります——本物のシステムがあらゆる探索の根にノイズを注入する、小さく実務的な理由がこれです。

🎯 演習問題

  1. ループを自分の言葉で。 探索が生み出す訪問分布が、その探索を誘導した方策より良い方策である理由を3文で説明してください。次に、もしそうでなかったら何がうまくいかないのか——探索がネットワークを改善できない場合、訓練ループの何が壊れるのか——を説明してください。

  2. 天井の議論。 AlphaGo ZeroはAlphaGoより少ない情報を与えられ、結果として強くなりました。反対論の最も強い版——なぜ人間の対局から初期化することが助けになると 予想 されるのか——を述べ、そのうえで自己対局の何がそれを打ち負かすのかを具体的に説明してください。

  3. 再構成か計画か。 MuZeroの学習されたダイナミクスは観測を予測するようには訓練されていません。次の観測を完璧に予測するモデルが、それでも行動選択には無用であるような具体的な状況を1つ、そして何も再構成できないモデルでも十分であるような状況を1つ記述してください。

  4. デモに計器を付ける。 各世代について、その世代に訪れた局面における生の方策と探索の訪問分布の平均的な一致度を記録するようにコードを改変してください。世代を追うごとに一致度は上がりますか。一致度が上がることは、探索がまだ教えるべきことをどれだけ残しているかについて何を意味するのかを説明してください。

  5. 転用の主張を監査する。 あるチームが、AlphaZero型の自己対局を化学合成経路の最適化に適用することを提案しています。3.5節の条件を使って、それが機能しうると信じる前に尋ねるべき4つの問いを挙げ、そのうちどれが誠実に答えるのが最も難しいと予想するかを述べてください。

まとめ

AlphaGo Zeroは、AlphaGoの段階的で人間により初期化された設計を、方策ヘッドと価値ヘッドをもつ単一のネットワーク に置き換え、人間の棋譜も、盤面そのものを超える手作りの特徴量も使わず、ランダムな打ち方 から訓練しました。これを可能にする機構は、探索が方策改善作用素である ことです。現在の方策に誘導された木探索は、その方策より良い訪問分布を生み出すので、探索自身の出力が訓練の目標値になり、改善されたネットワークがより良い探索を誘導し、ループが複利で効いていきます。自己対局は学習者の能力に自動的に追随するカリキュラムを供給し、ゲームの結果は人間のラベル付けなしに価値信号を供給します。こうして訓練されたAlphaGo Zeroは、イ・セドルを破ったバージョンを凌ぎました——そして示唆的なことに、人間の定石の多くを再発見し、そのいくつかを捨てました。伝統は実在の構造を見つけていましたが、それは不完全であり、それで初期化されたシステムであればその事実に気づくのははるかに難しかったでしょう。

AlphaZero はこのレシピが囲碁についてのものではないことを示し、同じ手法で チェスと将棋 を学習し、古典的エンジンの広く安価でヒューリスティックな探索を、狭く高価で深く選択的な探索と引き換えました。MuZero は最後の人間の入力——ルール——を取り除き、観測の再構成を一度も求められず 計画にとって十分 であることだけを求められる内部状態の中で、自分自身の ダイナミクス、報酬、価値、方策 を学習しました。その「重要なもののモデル」こそが、同じシステムを、仕組みが決してエージェントに開示されないAtariへ拡張させたのです。

私たちの三目並べの実装は、このループを具体的にしました。固定されたランダムな相手に対して探索なしで採点したところ、方策は6世代で0.496から0.658へ単調に登り、中央(0.187)>隅(0.139)>辺(0.064) という教科書どおりの序盤の順序づけへ収束し、即座の勝ちを確率 0.959 で(ベースライン0.167に対して)取ることを学びました——すべてルールだけからです。デモの頭打ちは、それが意図的に省いたものも示しました。ネットワークがなければ汎化はなく、実際に訪れた局面しか残らないのです。

誠実な境界線こそが持ち越すべき部分です。この軌跡が機能するのは、経験を生成するのが安価で、報酬がきれいな ところ——ボードゲームが完璧に満たし、現実の問題のほとんどがまったく満たさない条件——です。次章は、シミュレータも自己対局も報酬関数もない問題へ向かいます。アミノ酸配列からタンパク質の三次元的な立体構造を予測することです。それを扱いやすくしたデータは、エージェントが生成したものではありませんでした。それは数十億年にわたって、配列そのものの中に蓄積されてきたのです。

← 第2章: AlphaGo: 探索と学習の出会い 第4章: AlphaFold: タンパク質折りたたみのブレークスルー →

免責事項