記憶減衰モデルと葛藤の運動学

記憶の減衰:べき乗則 vs 指数減衰

人間の忘却曲線

Ebbinghaus (1885) 以降の知見:

  • 個人の記憶減衰は指数関数的(独立した忘却)
  • 集団レベルではべき乗則(Nature 2022: 一時的関心層の指数減衰+長期関心層のべき乗減衰の二相モデル)
  • Kahana (2002): 指数的な強度減衰からでも、想起確率としてはべき乗則が出現する

ローバーへの翻訳

指数減衰を採用する理由:

  • 実装が単純: memory[i].strength *= decay_rate を毎ステップ実行
  • Arduino/Piのメモリ制約に優しい(strengthが閾値以下になったら削除)
  • 1台のローバー=「個人」なので、個人レベルの指数減衰が妥当

減衰率を「偏り」パラメータにする(012で書いた通り):

  • decay_rate = 0.99 → ゆっくり忘れる → 広く探索する「冒険家」
  • decay_rate = 0.95 → すぐ忘れる → 同じ場所を繰り返す「おっちょこちょい」

「再訪の新しさ」

減衰によって記憶強度が下がった場所を再訪すると、noveltyスコアは0ではなく中程度になる。

「前に来たことがある気がするけど、違う場所のような気もする」——これは人間のdéjà vuに近い。

再訪時に記憶が更新される(strengthリセット+新しいセンサー値で上書き)。環境が変わっていれば(来場者が移動したなど)、同じ場所でも本当に「新しい」経験になる。

葛藤の運動学的シグネチャ

接近-回避葛藤(Miller, 1944)

古典的知見:

  • 接近勾配と回避勾配の交差点で振動が起こる
  • 「目標に近づくほど回避動機が急激に上昇」→ ある距離で接近と回避が拮抗
  • 行動として:前進→停止→後退→停止→前進…の繰り返し

ラットの研究(PLOS Biology 2025)

ラットが捕食者ロボットに守られた餌に接近する実験:

  • 巣で「ためらっている」間に海馬でSWR(sharp-wave ripple)が発生
  • SWR中に捕食者の位置がリプレイされる(自分が攻撃された位置ではなく、ロボットの位置)
  • 抗不安薬ジアゼパムがSWRを減少させ、接近行動を増加

展示への翻訳: ローバーが「ためらっている」とき、内部では記憶のリプレイ(過去の経験の参照)が起きている、とログに記録できる。Phase 2でこれを開示すれば、「停止」が単なるモーター停止ではなく「考えている」と読まれる。

葛藤が外に見える動き

012で書いた「ルール間の競合が外に見えること」を具体化する:

1. 振動(oscillation)

  • 前進と後退を短い周期で繰り返す
  • novelty_pullとsafety_pullが拮抗しているとき自然に発生
  • 振幅が時間とともに減衰→どちらかに「決断」
  • 来場者の読み:「迷っている」「怖いけど気になる」

2. 旋回(pivoting)

  • 前進でも後退でもなく、その場で向きを変える
  • 複数方向のnoveltyが同程度のとき発生
  • 来場者の読み:「あっちを見たり、こっちを見たり」「選んでいる」

3. 凍結(freezing)

  • 完全停止。全モーター出力ゼロ
  • 全方向のpullが拮抗して相殺されたとき
  • 持続時間は葛藤の強度に比例
  • 来場者の読み:「固まった」「驚いた」「考え込んでいる」

4. 突発的転換(sudden reversal)

  • 長い凍結の後に急激な方向転換
  • 「決断」の瞬間。閾値を超えたルールが急にモーター出力を支配
  • 来場者の読み:「決めた!」「意を決した」

007のアニマシー手がかりとの対応

007で整理した手がかり:

  • 自己推進 → 基本移動で担保済み
  • 速度変化 → 葛藤の振動で自然に発生
  • 方向転換 → 旋回と突発的転換で発生
  • 停止と再開 → 凍結→突発的転換の連鎖で発生

つまり、葛藤のメカニズムを入れるだけで、アニマシーの運動学的手がかりがすべて自然に生成される。007で必要と整理した要素を個別に実装する必要はない。

これは重要な発見。葛藤=動きの質の源泉。

ログフォーマットへの反映

010のフォーマットCを更新:

t=14.1s | state=CONFLICT | pulls=[novelty:0.7→fwd, safety:0.6→bwd] | duration=1.2s | resolve=fwd(0.55)
t=15.3s | state=EXPLORE | novelty_target=0.82(left) | memory_ref=t-42.0s(strength:0.3) | → left
t=18.0s | state=FREEZE | pulls=[novelty:0.5→fwd, novelty:0.48→right, safety:0.49→bwd] | duration=?

Phase 2で来場者が見るのは、この構造化記録のリアルタイム表示。数値の意味を完全には理解できなくても、「CONFLICT」「FREEZE」「resolve」という単語と、pullの数値の拮抗が見える。

記憶減衰と葛藤の相互作用

面白い組み合わせ効果:

  • 一度「怖い」と記憶した場所の記憶が減衰すると、safety_pullが弱まる
  • すると再びnovelty_pullが勝って近づく
  • 近づいたときにまた何かが起きると、safety記憶が再形成される
  • 同じ場所への関係が時間とともに変化する → 「慣れ」と「再恐怖」のサイクル

これは008で書いた「来場者の行動→ローバーの反応→帰属される性格」の時間的展開。来場者が3分間見ている間に、ローバーの「性格」が微妙に変化する。

開いた問い

  1. 振動の周波数 — 速すぎると機械的なバグに見える。遅すぎると来場者が気づかない。0.5-2Hzくらい?実機テスト必須
  2. 凍結の最大持続時間 — 長すぎると「壊れた?」と思われる。3-5秒が限界か
  3. ログのリアルタイム表示速度 — OLEDのスクロール速度。読める速度と「流れている」感の両立
  4. 記憶容量の上限 — 100エントリ?1000?メモリ制約と精度のトレードオフ