本作業の大半を Claude Code で実行・文書化したものです。何を測るかの判断と、結果の読み取りは筆者が行いました。
学習なしの小型の決定モデル LiquidAI/d1-3B に、卓球ゲームを遊ばせました。自分のパドルが中央に来るようにずらした画像を渡し、選択肢を「ボールは上半分にある」のような位置で書くと、AI 同士のラリーが長く続きます。速度を渡さない場合は、12 回のラリーすべてが上限の 50 返球まで続きました。
d1 には 3B のほかに 600M のモデルと API もありますが、この記事で調べたのは d1-3B だけです。以下の結果は d1-3B についてのもので、ほかの d1 に当てはまるかは確かめていません。
この記事では、その入力の作り方と、判断の揺れを抑える調整を書きます。最後に、画像のどの要素がラリーに効いているかを、アブレーション(要素を 1 つずつ外して、効き目を測る実験)で調べた結果を書きます。
判断の確率が動く様子を映した動画(150 秒、限定公開)です。
作ったもの
初期の卓球ビデオゲームに着想を得た、2 枚のパドルと 1 個のボールのゲームです。名前は Paddle Rally にしました。特定の既存作品の絵や音は使っていません。ブラウザで人間が遊べて、AI 同士も戦えます。
お題は次のとおりです。
- 入力は、画面の画像とボールの速度 (vx, vy)
- 出力は、UP、DOWN、STAY のどれか
- AI が良いかどうかは、AI 同士のラリーが続くかで判断する
ラリーは返球数で数え、測定のために 50 返球で打ち切ります。
図の入力の画像は、実際に d1-3B へ渡している画像です。速度の数字は、1 ティック(60 分の 1 秒)あたりに動くミリピクセルの値です。
d1-3B の使い方
d1-3B は、選択肢ごとの確率を 1 回の計算で返す 30 億パラメータのモデルです。画像と質問と選択肢を渡すと、選択肢の確率が返ります。その確率が最も高い行動を採用します。
1 回の判断は、GPU で約 51 ミリ秒でした。ゲームは 50 ミリ秒ごとに判断を出し、次の判断まで同じ行動を保つ作りにしています。
入力の作り方
d1-3B は、画像の中で物がどこにあるか(上のほうか、下のほうか)は読めます。一方で、「ボールは赤いパドルより上にある」のような 2 つの物の関係は、ほとんど読めません。打ち返すにはボールとパドルの高さを比べる必要があるので、比べる作業を画像の側で済ませておき、d1-3B には位置だけを答えさせます。
- 自分のパドルが縦の中央に来るよう、画像全体をずらす
- 画像の中央に帯を引く(パドル中心の上下 5 ピクセル。パドルより細く、パドルが動かなくてよい範囲を表す)
- 選択肢を「ボールは帯より上の上半分にある」「帯より下の下半分にある」「帯の中にある」と、位置で書く
画像をずらすと、コートの外側(上下の壁より向こう)も画像に入ります。この部分は暗く塗り、コートの中と区別しています。壁の位置に明るい線を引く案も試しましたが、パドルが壁の近くにいると、その線が画像の中ほどに来ます。すると d1-3B は、ボールが帯の上にあるか下にあるかを取り違えました。そのため壁は線では引かず、明るさの違いだけで示しています。
この作り方がどれだけ効くかを、ほかの渡し方と比べました。d1-3B 同士を対戦させ、渡す入力だけを変えて、1 ラリーあたり何回打ち返せたか(平均返球数)を数えています。次の節で入れる調整の前に測った値です。
| d1-3B に渡した入力 | 平均返球数 | 測ったラリーの数 |
|---|---|---|
| 自分のパドルを中央に置いた画像(この記事の作り方)と速度 | 28 | 12 |
| コート全体の画像と速度 | 0.1 | 10 |
| ボールとパドルの座標を数字で書いた文 | 0 | 10 |
コート全体の画像では、ボールとパドルの高さを比べなければならないので、ほとんど打ち返せません。座標を数字で渡すと、1 回も打ち返せませんでした。目安として、でたらめに動く AI 同士でも、平均 0.33 回は打ち返します。
判断の揺れを抑える調整
たとえばボールがパドルより上にあれば、正しい答えは毎回 UP です。ところが d1-3B は、50 ミリ秒ごとの判断で、ときどき逆の答えを混ぜます。
正しい答え : UP UP UP UP
d1-3B : UP DOWN UP DOWN
逆の答えが混ざると、パドルは上がっては下がるので、ボールに近づけません。これを抑えるために、2 つの調整を入れました。
- ならす : 各判断の確率を、直前の判断の確率と半々に混ぜる。1 回だけ逆の答えが出そうになっても、直前の確率が残るので、向きが変わりにくくなる
- パドル 30 : ゲームのパドルの高さを 20 から 30 ピクセルにする。打ち返せる範囲が広がるので、少しずれても届く。d1-3B の判断が良くなるのではなく、ゲームを易しくする変更
d1-3B とルールで動く相手(ボールの高さを追うだけ。図では追従役と書いています)を対戦させ、12 回のラリーの平均返球数を比べました(上限 20、速度を渡さない画像)。
伸びの大半はパドル 30 によるもので、パドル 30 だけでほぼ上限まで届きました。ならすだけでも伸びますが、パドル 30 ほどではありません。2 つを組み合わせても、パドル 30 だけとの差はばらつきの範囲です。ゲームの既定値は、2 つを組み合わせた設定にしています。STAY に少し加点する案も試しましたが、ラリーが短くなったので使っていません。
最終結果
ならすこととパドル 30 を入れて、d1-3B 同士を測りました(12 回、上限 50)。調整の前の値も並べます。調整の前はシード 11、調整の後はシード 31 で測ったので、ボールの出方は同じではありません。
| d1-3B に渡した入力 | 調整の前 | 調整の後 | 上限に到達(調整の後) |
|---|---|---|---|
| 画像と速度(お題の入力) | 28 | 43.6 | 12 回中 9 |
| 画像のみ | 41 | 50 | 12 回中 12 |
調整の前も後も、速度を渡さないほうがラリーは長く続きました。速度は、質問文に数字で書いて渡しています。前の節で見たとおり、d1-3B は座標を数字で渡されると 1 回も打ち返せませんでした。速度の数字も判断の助けにならず、かえって邪魔をしているのかもしれません。ただし、これは確かめていません。差もシード 1 つずつ、12 回ずつのラリーでの値で、調整の前の 28 と 41 の差は、ばらつきを見込むと、95% の範囲で 1〜25 返球の幅があります。
お題の入力に速度が含まれるので、ゲームは速度を渡す形のままにしています。
画像の要素のアブレーション
今の画像には、ボールのほかに、帯、両方のパドル、中央の点線を描いています。どれが要るのかを、1 つずつ外して測りました(速度を渡さない画像)。外すのは画像の中の絵だけで、ゲームのパドル(高さ 30)はそのまま打ち返します。
| 画像 | 左の d1-3B 対ルールの相手(上限 20、シード 51 / 77) | d1-3B 同士(上限 50) |
|---|---|---|
| 今の画像 | 17.3 / 20 | 50 |
| パドルを描かない | 20 / 20 | 3.8 |
| 点線を消す | 20 / 20 | 未測定 |
| 帯を細い線にする | 14.3 / 18.7 | 未測定 |
| 細い線とボールだけ | 11.1 / 10.2 | 未測定 |
| ボールだけ | 20 / 20 | 3.6 |
分かったことは 3 つです。
- d1-3B を左側に置いてルールで動く相手と対戦させると、帯もパドルも点線も要らない。ボールだけでも上限まで続く
- 帯を細い線に変えると、ラリーが短くなる。細い線は、ないよりも邪魔になる
- ところが d1-3B 同士では、パドルを描かないと、右側のプレイヤーが 12 回とも取り損ねる
右側だけが取り損ねる原因は、d1-3B の画像の読み方に左右の差(異方性)があることでした。ボールだけの画像で、ボールの横の位置を変えながら上下を答えさせると、画像の左端から中央までは正しく読めるのに、右端でだけ、ときどき読み違えます。
| ボールの位置(画像の中) | 左端 | 中央 | 右端 | ||
|---|---|---|---|---|---|
| 上下の読み | ○ | ○ | ○ | ○ | △ |
○ は 16 回すべて正しく読めた位置、△ は 16 回のうち 3〜6 回を読み違えた位置です。
これは左側のプレイヤーの画像でも、右側のプレイヤーの画像でも同じでした。左側のプレイヤーは得意な画像の左端で打ち返すので困りませんが、右側のプレイヤーは苦手な右端で打ち返すので取り損ねます。パドルを描いた画像では右端でも読み違えませんが、その理由は分かっていません。
そこで、右側のプレイヤーには左右を反転した画像を渡しました。どちらのプレイヤーも得意な画像の左端で打ち返すことになり、ボールだけの画像でも、d1-3B 同士の 24 回すべてが上限 50 まで続きました(2 つのシードで 12 回ずつ)。
反転した画像でも、読み違えるのは画像の右端でした(右側のプレイヤーにとってはコートの左端で、打ち返す場所ではありません)。苦手なのはコートのどこかではなく、画像の右端です。
ただし、これは速度を渡さない場合だけです。速度を渡すと、反転してもボールだけの画像は平均 7〜12 返球で終わり、今の画像(43.6)に届きませんでした。そのため、ゲームの既定値は今の画像のまま、反転なしにしています。
限界
- どの条件も 12 回のラリーで、シードは 1〜2 個です。数返球の差は確かめられていません
- 調整はルールで動く相手に対して選び、最終の測定は d1-3B 同士で行いました
- ルールで動く相手は毎回上限に届くので、d1-3B は座標を正確に読む規則には及びません
- 人間を相手にした測定はしていません
- 調べたのは d1-3B だけで、600M のモデルと API は測っていません
- 画像の要素を外してルールの相手と対戦させた測定は、d1-3B を左側に置いたものだけです。速度を渡した反転の測定は、どれもシード 1 つです
まとめ
- d1-3B は、物の位置は読めても、2 つの物の関係はほとんど読めない。そこで、自分のパドルを中央にずらした画像と、位置で書いた選択肢で、関係を位置に言い換えた
- 判断の確率をならし、パドルを高くすると、AI 同士のラリーは平均 43.6 返球(お題の入力)、速度なしでは 12 回すべてが上限の 50 返球まで続いた。伸びの大半は、ゲームを易しくするパドルの高さによる
- d1-3B の画像の読み方には左右の差(異方性)があり、画像の右端にあるボールの上下をときどき読み違える
- 画像の要素のアブレーションでは、速度を渡さないなら画像はボールだけで足りた。ただし、右端の弱さを避けるため、どちらのプレイヤーにも自分が左にいる画像を見せる必要がある
- 速度を渡すお題の入力では、帯とパドルを描いた今の画像がいちばん長く続いた
モデルが苦手なのは、タスクそのものより、見せ方のことがあります。





