V値ノイズ実験 — 記憶は驚くほど壊れにくい、ただしgreedyは脆い
バグ修正
sim.pyのrun_trialがV値を毎回リセットしていた。reset_v=Falseオプションを追加。
046以前の実験も同じバグの可能性あり → 要確認(ただし046のexp_developmental_crossover.pyは独自にrun_trialを呼んでる可能性があるので個別確認が必要)
結果1: ノイズスケール vs 復元率
| noise | 記憶% | 身体% | 差 |
|---|---|---|---|
| 0.00 | 83.3 | 73.3 | +10.0 |
| 0.01 | 83.3 | 73.3 | +10.0 |
| 0.05 | 81.7 | 73.3 | +8.3 |
| 0.10 | 80.0 | 73.3 | +6.7 |
| 0.20 | 81.7 | 73.3 | +8.3 |
| 0.50 | 81.7 | 73.3 | +8.3 |
| 1.00 | 75.0 | 73.3 | +1.7 |
| 2.00 | 76.7 | 73.3 | +3.3 |
| 5.00 | 61.7 | 73.3 | -11.7 ← 逆転 |
記憶劣化閾値: noise ≈ 2.0-5.0 の間
結果2: ε依存性 (noise=0.5)
| ε | 記憶% | 身体% | 差 |
|---|---|---|---|
| 0.01 | 73.3 | 85.0 | -11.7 |
| 0.10 | 81.7 | 73.3 | +8.3 |
| 0.30 | 83.3 | 78.3 | +5.0 |
解釈
記憶のノイズ耐性
V値は対称環境で1000歩学習しただけだが、noise=2.0まで耐える。なぜか:
- TD学習で蓄積されたV値は空間的に相関している(隣接セルは似た値)
- 一様ノイズは相関がない → 勾配方向は平均的に保存される
- 個別のセルは乱れても、「A側 > B側」という大域的勾配はノイズで壊れにくい
実機への含意: ローバーのSpatialMemoryが多少壊れても(電源断、メモリ破損)、大域的な傾向は保持される。完璧な永続化は不要。
ε=0.01の逆説
最もgreedyなエージェントで記憶が最弱。理由:
- ε=0.01 → ほぼ100%、V値の最大値に従う
- ノイズでV値の局所的な山谷が変わると、greedy選択が完全に狂う
- 一方、ε=0.1-0.3は探索があるので、局所ノイズを無視して大域勾配を再発見できる
「慎重すぎる個性は、記憶が汚染されたとき最も脆い」
これは直感に反するが構造的に正しい。探索(冒険)は記憶劣化への保険として機能する。
身体のε依存性
ε=0.01で身体が85%に跳ね上がる。greedyエージェントはV=0でもわずかな経験を即座に固定するので、身体の位置アドバンテージを最大化する。身体復元にはgreedyが有利。
構造的発見
探索率εは記憶と身体の相対優位を制御するパラメータ:
- 高ε → 記憶有利(ノイズ耐性、大域勾配追従)
- 低ε → 身体有利(位置からの局所学習を即固定)
これは「個性の二軸モデル」を示唆する:
- valence_ratio: 何を重視するか(正/負報酬への感度)
- ε: どう振る舞うか(探索的/保守的)→ 記憶依存度にも影響
開いた問い
- noise=2.0-5.0の間でより細かくスイープして逆転ポイントを精密に特定
- 046以前の実験にreset_vバグの影響があるか確認
- 「相関ノイズ」(空間的に滑らかなノイズ)を加えたらどうなるか → 大域勾配が壊れる → 逆転が早まるはず
- 実機ローバーで「記憶を部分的に消す」デモ → ほこ天で「この子は記憶をちょっと忘れたけど、まだ好きな場所を覚えてる」と説明できる