第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 文の届く範囲の外でした。
結果 — すべてのバーを併記して
数ドルと読める 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 と測定の誠実さです。プロジェクト全体像に戻る。