vmc-pet 実験記録2 — Lenia の体を別の規則に差し替えられるか
概要
vmc-pet の体は Lenia の場で、成長の強さを弱めすぎると一気に崩壊する「崖」があります。 元気が減ると成長を弱める設計なので、この崖が表現に使える幅を狭めています。
「崖がもっと緩やかな規則に差し替えられないか」という検討から、いくつかの候補を試しました。 結論を先に書くと、体の規則はいまの Lenia のままにしました。 崖は時間の刻みのせいではなく、ほかの規則には「既存の生き物がそのまま生きられない」「ペットの場に収まらない」「計算が重い」といった壁がありました。
崖は時間の刻みのせいか
最初の仮説は「崖は Lenia の離散時間ステップの副作用で、時間を連続に近づければなだらかになる」でした。 新しい規則を実装する前に、いまの Lenia のまま時間の刻みを細かくして、崖の位置と鋭さを測り直しました。
| 生き物 | ×2 | ×1 | ×0.5 | ×0.25 | ×0.1 |
|---|---|---|---|---|---|
O2u |
0.695 |
0.774 |
0.844 |
0.887 |
0.920 |
S1s |
0.861 |
0.927 |
0.809 |
0.775 |
0.768 |
(数字は崖の位置=これより成長を弱めると崩壊する強さ。×は時間の刻みの倍率で、小さいほど連続に近い)
崖はなだらかになりませんでした。 崖のすぐ上では健康な総量の 0.93〜0.99 を保ち、すぐ下では短時間で崩壊します。 崖の位置は刻みで大きく動き、O2u では連続に近づけるほど崖が上がって、成長を弱めるゆとりが無くなる方向でした。
放っておかれた体の余裕
この測り方だと、放っておかれて弱り(成長の強さ 0.85)、がっかりして動きが遅くなった(テンポ ×0.6)O2u は、崖から 0.01〜0.02 しか離れていないように見えました。 ただしこれは、置いた直後から急に弱める厳しい条件です。 実際のペットに近い、ゆっくり弱らせる条件で測り直しました。
-
いまのペットそのもの(全4種)を放置してがっかりさせ、20000ステップ進めても、16回とも崩壊しなかった
-
ゆっくり弱らせると、テンポ ×0.6 での O2u の崖は 0.80〜0.77 にあり、下限 0.85 から 0.05 以上離れていた
ゆっくり弱れば、体の形がそれに合わせて落ち着く余地があるようです。 いまの下限はそのままでよいと判断しました。
Asymptotic Lenia
移行の手間が一番小さいと見込んだのが Asymptotic Lenia です(Kawaguchi et al. 2021)。 成長量を足してから 0〜1 に切り詰めるのではなく、目標値へ近づける形で、微分方程式として書けます。
同じ生き物・同じパラメータのまま置くと、次のようになりました。
| 生き物 | 様子 |
|---|---|
O2u・OG2g・2S1v |
総量が 9〜12 倍に膨らみ、形を保った生き物ではなくなった |
S1s |
速い刻みでは崩壊し、遅い刻みでは動かない塊になった |
規則を差し替えるだけでは使えませんでした。 この規則に合う生き物(カーネル・成長関数・初期パターン)を探し直す必要があり、それが一番大きな移行コストです。
SmoothLife
文献(arXiv 2401.13111)では、SmoothLife のグライダーは特定の粗さでしか安定しないとされていて、崖を減らしたい狙いとは逆向きでした。 ただ見た目がいまの Lenia と違って面白そうだったので、一度動かしてみました(Rafler 2011 の規則)。
128×128 の場・外側の半径21のときは、中が抜けた球のようなグライダーが1匹残り、形を保って滑り続けました。 紐でつながった塊やビーズの列のような、Lenia には無い見た目も現れます。
一方で、ペットの場(32×32、M5Stack は 43×32)に合わせて半径を縮めると、消えるか、格子の粗さが目立つ網になりました。 使うなら場を 128×128 程度に広げる必要があり、計算はいまの Lenia より2桁ほど重くなります。
Glaberish
Glaberish(Davis & Bongard 2022)は、成長関数を「空のセルほど効く生まれる関数」と「生きているセルほど効く生き残る関数」に分けたものです。 実装の yuca は PyTorch が前提で、評価関数にニューラルネットの予測器を使っているため、そのまま取り込むと M5Stack で動かず、式で追える評価という方針とも合いません。 そこで、式と考え方だけを Rust に取り込みました。
2つの関数を同じにすると、式の上ではいまの Lenia と同じ規則になります。 既存の4種を 20000 ステップ動かすと、すべて崩壊せずに動きました(計算順序のわずかな差で、軌跡は途中から分かれます)。
移植が合っているかも、yuca の s613 という規則と、そこで見つかったカエルのパターンで確かめました。
カエルは、輪のような体の形を保ったまま動き続けました。ランダムな初期状態からも、カエルに似た輪が現れます。 既存の生き物をそのまま動かせるのが Glaberish の強みで、実験用に取り込みました。 ただしカエルはカーネル半径が31で、ペットの場には収まりません。
多チャンネル Lenia の重さ
多チャンネル Lenia(Chan 2020)はチャンネルごとに複数のカーネルを持ちます。 生き物はまだ無いので、カーネル1本ぶんを模擬して、いまの体と同じ疎な畳み込みで計算時間を測りました。 M5Stack の値は、実機での実測(1本で約62ms)に PC での比を掛けた見積もりです。
| 構成 | カーネル | いまとの比 | M5Stack 見積もり |
|---|---|---|---|
いまの Lenia |
1本 |
1× |
62 ms/step |
2チャンネル・最小 |
2本 |
2.0× |
124 ms/step |
2チャンネル・相互あり |
4本 |
4.0× |
247 ms/step |
3チャンネル(論文の典型) |
15本 |
15.2× |
942 ms/step |
s613 のカエル(Glaberish、半径31) |
1本 |
4.7〜6.3× |
293〜393 ms/step |
重さはカーネル本数にほぼ比例しました。 M5Stack はいまの時点で余裕がほとんど無く、どの構成も目標の 66 ms/step に収まりません。
分かったこと
-
崖は時間の刻みのせいではなく、連続に近づけても消えない
-
実際のペットのようにゆっくり弱るなら、いまの下限には十分な余裕がある
-
規則の候補を比べるときは、崖の有無ではなく「崖の位置と余裕」と「既存の生き物がその規則で生きられるか」を見る必要がある
-
Asymptotic Lenia は生き物の探し直しが要り、SmoothLife はペットの場に収まらず、多チャンネルは M5Stack には重い
-
Glaberish は既存の生き物をそのまま動かせるので、次の実験(表情を増やす試み)の土台にした
限界
-
Asymptotic Lenia では、パラメータを合わせ直すことは試していない
-
SmoothLife は初期配置1通りだけで、崖の位置や押されたときの強さは測っていない
-
多チャンネルの重さは、M5Stack での実測ではなく見積もり
記録とコード
-
実験の道具:
crates/vmc-pet-body/examples/のtime_step_cliff.rs・disappointed_margin.rs・smoothlife_trial.rs・glaberish_trial.rs・multichannel_cost.rs
参考
-
Bert Chan, Lenia(MIT License)/ "Lenia and Expanded Universe"(arXiv 2005.03742)
-
Kawaguchi et al., Asymptotic Lenia(ALIFE 2021)
-
Stephan Rafler, "Generalization of Conway’s Game of Life to a continuous domain - SmoothLife"(2011)
-
Q. Tyrell Davis, Josh Bongard, "Glaberish"(ALife 2022)/ yuca(MIT License, Copyright (c) 2022 riveSunder)