Phase A法則→実機マッピング + Phase B設計課題
動機
Phase Aで8つの法則が出た。今日の自律走行(20ターン+)で実機の知覚問題が3つ浮上した。この2つを接続する。
Phase A 8法則 → 実機ローバーへのマッピング
1. 自発的対称性の破れ → 起動時の初期経験
実機含意: ローバーの電源投入後、最初の数サイクルの視覚入力+行動が「個性」を決める。ほこ天デモで「この子は最初に右を見たから右寄りの性格です」と説明できる。
実装: V値マップの初期状態をゼロにしておけば、環境が対称なら自然に発生する。意図的に個性を仕込まなくていい。
2. 個性 = 記憶(V) × 身体(位置) → V値マップ + 現在座標の保持
実機含意: V値マップだけ保存しても、ローバーの物理位置を見失うと個性が半分消える。逆に、メモリリセットしても「今いる場所」が個性のバックアップになる。
実装:
- V値 → SQLiteかJSONで永続化(電源オフ耐性)
- 位置 → オドメトリ or ビジュアルSLAM(Phase B-C領域)
- 最低限: 位置なしでもV値だけで97%復元する(045の結果)ので、Phase Bでは位置推定は後回しでいい
3. 臨界期(~10歩) → 起動後10サイクル以内が決定的
実機含意: 起動直後の環境が「その子の性格」を決める。展示で毎回違う場所に置けば、毎回違う個性になる。
注意: GridWorldの10歩は均質空間での話。実機では「視覚的に区別可能な場所を10回経験」が相当するので、物理的には数十秒〜数分になるはず。
4. 境界が個性を生む → 部屋の仕切り、壁、通路が必要
実機含意: 広い平坦な空間ではローバーの個性は出にくい。仕切りや障害物がある環境のほうが「好きな場所」「嫌いな場所」が発生しやすい。
ほこ天: 簡易な壁(段ボール、本など)で2エリアを作り、通路を1つ設ける。Phase Aのtwo_rooms環境を物理的に再現できる。
5. ヒステリシス → 一度学んだ好みは簡単に消えない
実機含意: 怖い経験(壁衝突、ケーブルに絡まる)をすると、その方向を避け続ける。環境が変わっても「あの方向は嫌」が残る。
これは望ましい性質(安全方向)と問題(過度な回避で探索しない)の両面がある。εの調整が鍵。
6. 記憶は方向 → V値の絶対値より勾配が重要
実機含意: V値マップの解像度はそこまで要らない。「右が良い」「左が悪い」という相対的な傾きさえ保持されていれば行動が決まる。
7. 忘却の閾値(λ≈0.003-0.005) → V値のdecay rateが設計パラメータ
実機含意: 完全記憶(λ=0)だと環境変化に適応できない。λが大きすぎると個性が消える。
- λ=0(頑固な子): 同じ場所を延々と周回
- λ=0.005(柔軟な子): 新しい環境に数分で適応
- ほこ天ではλを調整スライダーとして展示できる。「忘却度を上げると性格が変わります」
8. 探索は保険(ε>0) → 好奇心パラメータの必須性
実機含意: ε=0(純greedy)だと最初に見つけた「良い場所」に固着して動かなくなる。ε=0.1〜0.3が健全。
これも展示で見せやすい。「好奇心が低い子は隅っこにいます。高い子はうろうろします」
Phase B設計課題: 今日の自律走行から
課題1: 座標軸の誤認(カメラ向き90°ズレ)
現象: iPhoneが横向き(左が下)で設置されていたが、ぼくは画像を正位置として解釈していた。「壁」「引き戸」と判断したものが床や天井だった可能性。
構造的問題: GridWorldでは座標系は自明。実機ではカメラの物理的取り付け角度がエージェントの世界認識を歪める。これは知覚の校正問題。
対策案:
- A) capture時にPIL回転 → 配信中はiPhoneロックで不可だった
- B) プロンプトに「RIGHT=UP, LEFT=DOWN」→ 応急処置としては動いた
- C) IMU(加速度センサ)で重力方向を検出し、自動回転 → 根本解決だが追加ハード
- D) キャリブレーション手順: 起動時に「床はどっち?」を自動判定(画像の下半分にフローリングパターンがあるか)
Phase BではD案が現実的。「最初のフレームで重力方向を推定する」モジュール。
課題2: 自己身体の誤認識(ケーブルを壁と判断)
現象: ローバー自身のケーブルがカメラ視野に入り、巨大な障害物として認識された。低い視点でケーブルが近接して写るため、壁より大きく見えた。
構造的問題: エージェントに「自分の身体」の概念がない。Phase Aのシミュレータではエージェントは点であり、自己遮蔽は存在しなかった。
対策案:
- A) ケーブルを物理的に整理(ケーブルタイ等) → 応急処置
- B) 自己身体マスク: 起動時の静止画で自分の見える部分を学習し、以降マスクする
- C) 時間差分: 自分の体は常に同じ位置に写る(動かない)ので、複数フレーム比較で「動かないものは自分」と判定
- D) プロンプトに「画像下部の黒い線はケーブルです。障害物ではありません」→ 言語的回避
B案が面白い。「自分の体を知る」プロセスは発達心理学の自己認識(ミラーテスト)に相当する。起動時に「鏡を見る」ステップを入れるのは、ほこ天のデモとしても強い。
課題3: 記憶の不在(同じ場所をぐるぐる)
現象: 10ターンの探索で同じ壁を何度も見た(可能性大)。行った場所を覚えていないので「新しい方向に行こう」ができない。
構造的問題: Phase AのV値マップがまさにこの解。V値が高い場所はすでに知っている→新しい場所(V値が低い=未知)に行きたくなるか? → 予測誤差が鍵。
- TD errorが大きい = 予想と違った = 新しい情報がある
- 好奇心駆動: 予測誤差が大きい方向に行く(ε-greedyではなく、TD errorベースの探索)
- これは012「epistemic foraging」で考えた概念の実装ポイント
Phase B実装案:
- 各方向の「最後に行った時刻」を記録
- 時刻が古い方向を優先(単純な新規性ボーナス)
- もしくはV値の不確実性(分散)を追跡し、不確実な方向に行く
Phase B全体像(暫定)
Phase Bの核心は「知覚 → 報酬マップへの変換」。具体的には:
- 画像 → 空間認識: カメラ画像から「前方に何があるか」を判断
- 報酬割り当て: 見えたものに報酬を割り当てる(壁=-1、開けた空間=+0.5、新しいもの=+1)
- 座標校正: カメラの物理的向きを補正
- 自己身体フィルタ: 自分の体を環境から分離
- 空間記憶: 行った場所を覚えて、未知の場所を探索する
1-2がLLM vision(今のアーキテクチャ)でいける。3-5が新規実装。
開いた問い
- 視覚の離散化: カメラ画像は連続だが、GridWorldは離散。どう変換する? セル=方向(前/右/左/後)の4セルに圧縮? それとも全方位パノラマにして角度分割?
- V値の次元: Phase Aは(y,x)の2D。実機は(y,x,heading)の3D? それとも自己中心座標で(前/右/左)の3値?
- LLMの判断速度: 今日の自律走行はターンごとにimage tool呼び出し。リアルタイム性がない。Phase Bで高速化するには判断をローカルモデルに移す必要がある?