Random Note

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 の規則)。

SmoothLife の条件ごとの様子

128×128 の場・外側の半径21のときは、中が抜けた球のようなグライダーが1匹残り、形を保って滑り続けました。 紐でつながった塊やビーズの列のような、Lenia には無い見た目も現れます。

SmoothLife のグライダーが滑る様子

一方で、ペットの場(32×32、M5Stack は 43×32)に合わせて半径を縮めると、消えるか、格子の粗さが目立つ網になりました。 使うなら場を 128×128 程度に広げる必要があり、計算はいまの Lenia より2桁ほど重くなります。

Glaberish

Glaberish(Davis & Bongard 2022)は、成長関数を「空のセルほど効く生まれる関数」と「生きているセルほど効く生き残る関数」に分けたものです。 実装の yuca は PyTorch が前提で、評価関数にニューラルネットの予測器を使っているため、そのまま取り込むと M5Stack で動かず、式で追える評価という方針とも合いません。 そこで、式と考え方だけを Rust に取り込みました。

2つの関数を同じにすると、式の上ではいまの Lenia と同じ規則になります。 既存の4種を 20000 ステップ動かすと、すべて崩壊せずに動きました(計算順序のわずかな差で、軌跡は途中から分かれます)。

移植が合っているかも、yuca の s613 という規則と、そこで見つかったカエルのパターンで確かめました。

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 での実測ではなく見積もり

記録とコード

  • 実験の記録: docs/experiments/rule-candidates.md

  • 実験の道具: 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)