第7話. TANREN — 負け戦 Atari Bowling が生んだ「参入ゲート」— 走る前に勝敗を測る秤

左は人間プロレベル(同型コードに「4周期に1投だけリズムが甘くなる」較正を入れたもの。実測 165.0 ≈ 公表の人間基準 160.7)。右の TANREN は「6-2-2」の周期で、位置取りからカーブまで一投も乱れません。中身は読める Python 59 行。実測 174〜201 点(holdout 平均 185.7)です。

本記事は TANREN 連載の第7話です。プロジェクト全体像は こちら、前話(Skiing — 公表全RLに全勝した回)は こちら。今回はその完勝の陰にあった、勝ちきれなかった実験の記録です。ただ、この仕組みにとって最も重要な部品は、実はここで生まれました。

TANREN を 30 秒で

TANREN は、LLM の「重み」を莫大なコストをかけて学習させる代わりに、追加学習なしの安価な LLM に候補コードを書かせ、そのプログラムを自動採点しながら「進化」させていく仕組みです。大規模計算が数億フレームの学習の末に到達した水準に、手元の PC 1台・数日間の探索・数ドルの API 代で迫ることを目指しています。

ただし今回の話は「到達した」記録ではありません。到達できない課題に、気づかないまま走り出してしまった記録です。

経緯: 「勝てそう」で走り始めてしまった

Bowling への参入判断は、いま振り返ると雑でした。見ていたのは DQN の 42.4 と人間基準の 160.7——「これなら超えられそうだ」と。実際、すぐに超えました。ところが、このゲームの最強公表値は Agent57 の 251.18・MuZero の 260.13 です。進化をいくら回してもスコアは 180 台で頭打ちになり、走り出してから「最強には届かない」と知るという、時間とリソースの最も悪い使い方をしてしまいました。

原因を分析して分かったのは、頭打ちは進化の探索不足ではなく、「読める反応型コード」というクラスそのものが持つ構造的な天井だったことです。LLM を一切使わない数値探索(骨格コード+パラメータ探索・約 2 時間・ほぼ無料)で測ると、このクラスの天井は ≈186。Agent57 の 251 は、ストライクを取り続ける精密制御の領域にあり、if 文の届く範囲の外でした。

結果 — すべてのバーを併記して

Atari Bowling — 公表スコアとの対比(高いほど良い)
ランダム
23.1
DQN(2015・2億フレーム学習)
42.4
人間基準
160.7
R2D2(2020)
161.77
TANREN(読める59行・数ドル)
185.7
Agent57(2020)
251.18
MuZero(2020・公表最強)
260.13
TANREN は最終判定(進化に使っていないシード 10 本)で平均 185.7(シード別 174〜201)。R2D2・人間基準・DQN は超え、Agent57 比 74%・MuZero 比 71% で頭打ち——届かなかった上位 2 つの値も隠さず併記します。

数ドルと読める 59 行のコードで、2 億フレーム学習の DQN・人間基準・R2D2 は超えました。しかし大規模RLの最高峰 2 つには届かず、そこで打ち切りました。途中経過には 215 という数字もありましたが、これは評価プロトコルの不一致(sticky 設定の流用)による誤った値であり、公表には使いません(この事故の顛末は次話の Freeway 編で詳しく書きます)。

誕生: 参入ゲート — 走る前に勝敗を測る

この失敗から、この仕組みに恒久ルールが 1 本増えました。

参入ゲート: ①そのゲームの最強公表値 T を原典つきで確定する → ②LLM なしの数値探索で、コードクラスの天井 C を実測する(半日・ほぼ無料)→ ③ C が T に並ぶ(目安 95%)と実測できるまで、進化 run の投入を禁止する。 C < T なら、その事実を記録して参入しない。

このゲートの実績です(すべて実測)。

対象ゲート判定結果
Bowling(事後検証)天井 ≈186 < Agent57 251 → NO-GO 相当実走 185.7 = 予測どおり
Boxing天井 9.2 < 100 → NO-GO(1.2 時間)進化 run 0 本で撤退
Tennis天井 1.10 < 24.0 → NO-GO(1.7 時間)進化 run 0 本で撤退
Skiing天井 −3619 > Agent57 −4202.6 → GO(2 時間)公表全RL超えで完勝第6話

「事前に測った天井 186 → 実走 185.7」という一致が、この事前判定の精度を裏付けています。負け戦だった Bowling が、以後のすべての実験の入口を守る仕組みになりました。

コードの中身 — 「読める」とは検証できるということ

最終コード 59 行の実効部分がやっているのは、6-2-2 のリズム投法です。36 ステップ周期の位相カウンタで「移動 6・調整 2・カーブ 2」を刻む。この固定リズムだけで毎投同じカーブが同じ場所に決まり、185.7 が出ます。

興味深い発見がひとつありました。コードには「ボールの帰還を検出してスペア照準をずらす」分岐も書かれているのですが、その検出条件は論理的に成立し得ず、一度も実行されません。読めるコードだからこそ、これを静的に確認できます。つまり、得点を稼いでいるのは純粋にリズムの方です。「読める」とは、どの行が本当に働いているかまで検証できる、ということでもあります。

正直な注記

  • 入力は RAM(128 バイトの内部状態)であり、ピクセルではありません。ゲームごとの専用コードです。
  • 比較プロトコルは公表側と同一です(no-op 開始分散・決定論・27,000 ステップ上限)。Agent57 / R2D2 は arXiv:2003.13350 Table H.4、MuZero は arXiv:1911.08265 Table S1、DQN の点推定は Gorila 論文の Nature 転記値です。
  • 「天井」はこの仕組みのコードクラス(読める反応型 Python)の実測天井であり、ゲーム自体の理論上限ではありません。
  • 汎用エージェントではありません。このゲーム専用の読めるアルゴリズムです。

連載の次回は、「超えた」と言いかけた数字を自分で取り下げた話——Atari Freeway と測定の誠実さです。プロジェクト全体像に戻る。

この記事をシェア

関連記事