vmc-pet 実験記録1 — Lenia の体の崩壊は先読みできるか
概要
vmc-pet は、連続セルオートマトン Lenia の場をそのまま体として表示する電子ペットです。 Lenia の生き物はカオス的な系で、強く押したり成長を弱めすぎたりすると、形を失って消えてしまいます(崩壊)。
この記事は、「崩壊を前もって読めるなら、危なくなったら動きを落として守れるのでは」という発想から始めた実験の記録です。 結論を先に書くと、崩壊は一気に起き、危険は見た目より先にパラメータにありました。 ペットの安全は、体の様子を見て守るより、パラメータを崩壊の崖から離しておく方が確かだと分かりました。
なぜ先読みを試したか
vmc-pet の設計は World Models の V(エンコーダ)/ M(世界モデル)/ C(コントローラ)の分割を借りています。 元の World Models で大きいのはコントローラではなく、報酬なしで先を読む世界モデル(M)の方です。 その最初の一歩として、「体が崩壊するか」を小さなモデルで先読みできるかを試しました。
先読みできれば「崩壊しそうならテンポを落とす」ような振る舞いの判断材料になり、研究として外れても安全装置として無駄になりにくい、という見込みでした。
実験1: 見える量から先読みする
普段のペットはほとんど崩壊しないので、安全な範囲を通さずに Lenia を直接動かし、4種の生き物に負荷をかけた400本のエピソードを作りました。
| 負荷 | かけ方 |
|---|---|
飢え |
成長の強さを 0.60〜0.92 まで徐々に下げる |
つつき |
体の近くに、強さ 0.05〜0.6 の摂動を繰り返し入れる |
テンポ |
1ステップで進む時間を ×1.0〜×3.5 まで上げる |
画面から見える量8つ(総量・その変化・広がり・密度・速さ・形の偏りなど)から、「10秒以内に崩壊するか」をロジスティック回帰で当てさせました。 崩壊したのは400本中72本です。
見える量は、崩壊の直前まで健康なままでした。 総量がはっきり落ち始めるのは崩壊の約0.3秒前からで、テンポの負荷では最後まで総量が健康なまま崩壊しました。 崩壊は、滑らかに衰えていくのではなく、一気に起きます。
| しきい値 | 誤警報 | 警告できた崩壊 | 何秒前(中央値) | 10秒以上前 |
|---|---|---|---|---|
誤警報を出さない(モデル) |
1/169 |
24/31 |
0.2 |
0 |
誤警報を出さない(総量が少ないだけ) |
1/169 |
26/31 |
0.3 |
0 |
崩壊しなかった体の10%で誤警報を許す(モデル) |
20/169 |
30/31 |
2.3 |
9 |
誤警報を許せば先読みは伸びますが、それは崩壊の瞬間ではなく「危ない状況にいること」を見ているためだと考えています。 誤警報を出さない条件では、モデルは「総量が少ない」という素朴なしきい値と変わりませんでした。
実験2: 場そのものを読む
8つの要約値しか見ていないのが限界だったので、場の値の分布(20個)や、体を中心に切り出した場そのもの(512個)を入力にしたモデルも試しました。
| モデル | AUC | 警告できた崩壊 | 1秒以上前 |
|---|---|---|---|
要約8つ |
0.798 |
23/31 |
0 |
場の分布 |
0.817 |
29/31 |
12 |
場そのもの |
0.829 |
15/31 |
8 |
同じ条件では、場を読むと1秒以上前に気づける例が増えました。崩壊の直前には、場の中に情報があります。 ただし、見ていない負荷や見ていない生き物には移りませんでした。 場そのものを読むモデルは、見ていない条件では誤警報を出さない範囲で1つも警告できず、切り出した場の特定の形を覚えただけだったようです。
実験3: 確率として当てる
ここまでの2つは、広くランダムに負荷をかけて、1回きりの「崩壊した/しなかった」を当てていました。 一般的な予測モデルの作り方に沿って、次のように組み直しました。
-
行動(パラメータ)と状態(場)を分ける
-
観察ではなく、シミュレータで実験してデータを作る
-
カオス系なので、1回きりの結果ではなく確率を当てる
-
比べる相手と不確かさ(95%区間)を明示する
同じ出発点から、場にごく小さなゆらぎを掛けて8本ずつ走らせ、崩壊した割合を「その条件の崩壊確率」としました(798組 × 8本)。 問いは「パラメータが分かっているとき、場の状態も知ると、崩壊の確率がよりよく当たるか」です。
最初の実行には欠陥がありました。 生き物ごとに崖の位置が違うことをパラメータ側で表せていなかったため、場を足すと良くなったように見えていたのです。 パラメータ側に生き物ごとの効き方を足してやり直すと、パラメータだけのモデルが大きく良くなりました。
| 生き物 | パラメータだけのモデルからの改善(95%区間) |
|---|---|
O2u |
−0.002 [−0.008, +0.004] |
OG2g |
−0.010 [−0.031, +0.007] |
S1s |
+0.329 [+0.013, +0.655] |
2S1v |
−0.032 [−0.056, −0.011] |
パラメータが分かっていれば、O2u・OG2g・2S1v では、場を知っても崩壊の確率はよりよく当たりませんでした。 体の状態に応じて安全な範囲を変える根拠は無く、生き物ごとに固定したパラメータの範囲で守るいまのやり方で足りる、という結論です。
S1s だけは場を足すと良くなりました。S1s は放っておくと滑るのをやめて止まる、2つの状態を持つ生き物なので、状態によって崩れやすさが違う可能性があります。ただし数が少なく、確かめられてはいません。 副産物として、S1s は安全な範囲の中でも、パラメータを急に切り替えると崩壊しやすいことが分かりました(40個中27個)。
おまけ: 場をリザバーとして使う
崩壊を知りたいだけなら、学習したモデルより、正確な規則で先を走らせる方が確かです。 そこで逆に、Lenia の場そのものを計算の担い手として使えるか(リザバーコンピューティング)を試しました。 入力を体への弱い摂動として注ぎ、場の状態から線形の読み出しだけを学習して、過去の入力を当てさせます。
| 場 | 記憶容量(1〜40ステップ前の入力の復元の合計) |
|---|---|
空の場 |
0.00 |
O2u |
3.6〜6.6(入力を強くするほど増える) |
S1s |
0.7〜2.1 |
OG2g・2S1v |
ほぼ0 |
同じ大きさの ESN |
20.4 |
生き物のいない場は、何も覚えませんでした。自分を保つ生き物がいることで、はじめて場に記憶が生まれます。 体が入力をしばらく抱えておく器になっている、というのはこのプロジェクトの見方と噛み合います。 一方で、一番良い O2u でも同じ大きさの ESN の約3分の1で、計算資源として実用にする力はありませんでした。
分かったこと
-
崩壊は一気に起き、見える量が崩れるのは直前(0.3秒ほど前)から
-
場を読むと直前の情報は取れるが、見ていない条件には移らない
-
パラメータが分かっていれば、多くの生き物で場は崩壊の確率の予測に役立たない
-
だから vmc-pet では、成長の強さ 0.85 以上・テンポ ×0.5〜×1.6 と、パラメータを崖から離しておく方針を続けている
限界
-
モデルはロジスティック回帰などの線形なものだけで、畳み込みのような非線形なモデルは試していない
-
負荷は実験用に作ったもので、普段のペットはほとんど崩壊しない
-
崩壊の数(評価用で31本)が少なく、生き物ごとの数字は数本で大きく動く
記録とコード
-
実験の道具:
crates/vmc-pet-body/examples/のpredict_collapse.rs・collapse_hazard.rs・lenia_reservoir.rs
Lenia は Bert Chan 氏の Lenia(MIT License)に基づいています。