<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Neural Cellular Automata on Programmer.ie: Modern AI programming</title>
    <link>http://programmer.ie/tags/neural-cellular-automata/</link>
    <description>Recent content in Neural Cellular Automata on Programmer.ie: Modern AI programming</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 10 Aug 2026 20:41:00 +0100</lastBuildDate>
    <atom:link href="http://programmer.ie/tags/neural-cellular-automata/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cellular Automata From First Principles 48: What Did the Neural CA Actually Learn?</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-48/</link>
      <pubDate>Mon, 10 Aug 2026 20:41:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-48/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-48-what-did-the-neural-ca-actually-learn&#34;&gt;Cellular Automata From First Principles 48: What Did the Neural CA Actually Learn?&lt;/h1&gt;&#xA;&lt;p&gt;Visualization gives us hypotheses.&lt;/p&gt;&#xA;&lt;p&gt;Intervention gives us evidence.&lt;/p&gt;&#xA;&lt;p&gt;If we suspect a hidden channel carries useful information, the next question is simple:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;what happens if we remove it?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This chapter turns NCA interpretability into controlled experimentation.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;establish-the-behavioral-baseline&#34;&gt;Establish the behavioral baseline&lt;/h2&gt;&#xA;&lt;p&gt;Before touching the model, record its normal performance.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;baseline &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; evaluate_suite(model, test_mazes)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keep metrics such as:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valid-path rate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;optimal-path rate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mean excess path length&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unreachable-maze accuracy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stabilization time&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Every intervention will be compared with this baseline.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 47: Inspect Hidden-State Propagation</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-47/</link>
      <pubDate>Mon, 10 Aug 2026 20:40:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-47/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-47-inspect-hidden-state-propagation&#34;&gt;Cellular Automata From First Principles 47: Inspect Hidden-State Propagation&lt;/h1&gt;&#xA;&lt;p&gt;A neural cellular automaton can solve a maze while most of its computation remains invisible.&lt;/p&gt;&#xA;&lt;p&gt;The visible output might be one distance channel.&lt;/p&gt;&#xA;&lt;p&gt;The internal state may contain twelve more channels evolving underneath it.&lt;/p&gt;&#xA;&lt;p&gt;This chapter asks:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;what is moving through those hidden channels while the answer is being computed?&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;capture-the-entire-state-trajectory&#34;&gt;Capture the entire state trajectory&lt;/h2&gt;&#xA;&lt;p&gt;Instead of saving only the final output:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 43: Test Generalization Beyond Training</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-43/</link>
      <pubDate>Mon, 10 Aug 2026 20:39:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-43/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-43-test-generalization-beyond-training&#34;&gt;Cellular Automata From First Principles 43: Test Generalization Beyond Training&lt;/h1&gt;&#xA;&lt;p&gt;A model can look robust while still depending on the exact conditions used during training.&lt;/p&gt;&#xA;&lt;p&gt;So after growth, persistence and regeneration, we need a harder question:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;what happens when the world changes?&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;build-a-generalization-matrix&#34;&gt;Build a generalization matrix&lt;/h2&gt;&#xA;&lt;p&gt;Vary dimensions independently:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;canvas size&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;seed position&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;update rate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rollout length&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;damage geometry&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;damage severity&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;noise level&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;boundary conditions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then evaluate combinations that were not used during training.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 46: Generalize to Harder and Larger Mazes</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-46/</link>
      <pubDate>Mon, 10 Aug 2026 20:39:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-46/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-46-generalize-to-harder-and-larger-mazes&#34;&gt;Cellular Automata From First Principles 46: Generalize to Harder and Larger Mazes&lt;/h1&gt;&#xA;&lt;p&gt;Training accuracy answers the easiest question:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Can the model solve problems drawn from the training distribution?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The more interesting question is:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Did the local rule learn a reusable computation?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This chapter turns that into an explicit evaluation protocol.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;hold-out-dimensions-of-difficulty&#34;&gt;Hold out dimensions of difficulty&lt;/h2&gt;&#xA;&lt;p&gt;Instead of one validation set, create several test families.&lt;/p&gt;&#xA;&lt;p&gt;For example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A: 32×32, familiar wall density&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B: 48×48, familiar wall density&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;C: 64×64, familiar wall density&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D: 32×32, denser obstacles&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;E: 32×32, longer required paths&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;F: different procedural maze generator&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;G: narrow bottlenecks and many dead ends&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The point is not to maximize one aggregate score.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 42: Regenerate After Damage</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-42/</link>
      <pubDate>Mon, 10 Aug 2026 20:38:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-42/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-42-regenerate-after-damage&#34;&gt;Cellular Automata From First Principles 42: Regenerate After Damage&lt;/h1&gt;&#xA;&lt;p&gt;Persistence asks whether the organism can remain near its target.&lt;/p&gt;&#xA;&lt;p&gt;Regeneration asks a different question:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;after part of the state is destroyed, can local rules reconstruct the missing structure?&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;This is a much stronger test.&lt;/p&gt;&#xA;&lt;h2 id=&#34;damage-the-state-not-just-the-image&#34;&gt;Damage the state, not just the image&lt;/h2&gt;&#xA;&lt;p&gt;If we erase only visible RGBA channels but leave hidden channels untouched, the model may retain a perfect invisible blueprint.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 45: Learn to Solve Mazes</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-45/</link>
      <pubDate>Mon, 10 Aug 2026 20:38:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-45/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-45-learn-to-solve-mazes&#34;&gt;Cellular Automata From First Principles 45: Learn to Solve Mazes&lt;/h1&gt;&#xA;&lt;p&gt;A pathfinding NCA becomes interesting only when the training problem itself is disciplined.&lt;/p&gt;&#xA;&lt;p&gt;If every maze has the same size, wall density and corridor style, the model may learn the dataset more than the algorithm.&lt;/p&gt;&#xA;&lt;p&gt;So this chapter builds the training system around &lt;strong&gt;procedural variation&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;generate-mazes-as-data&#34;&gt;Generate mazes as data&lt;/h2&gt;&#xA;&lt;p&gt;Start with binary occupancy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0 = open&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1 = wall&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One simple generator begins with random walls and rejects disconnected examples.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 41: Train for Persistence</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-41/</link>
      <pubDate>Mon, 10 Aug 2026 20:37:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-41/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-41-train-for-persistence&#34;&gt;Cellular Automata From First Principles 41: Train for Persistence&lt;/h1&gt;&#xA;&lt;p&gt;Growing a target once is not enough.&lt;/p&gt;&#xA;&lt;p&gt;A useful self-organizing system should continue to satisfy its objective after it arrives.&lt;/p&gt;&#xA;&lt;p&gt;That means the target should behave more like an &lt;strong&gt;attractor&lt;/strong&gt; than a timestamped frame.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-failure-mode&#34;&gt;The failure mode&lt;/h2&gt;&#xA;&lt;p&gt;Suppose training always evaluates at step 64.&lt;/p&gt;&#xA;&lt;p&gt;The model can learn:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;seed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grow&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;target at step 64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;overshoot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;disintegrate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The loss never sees the failure after step 64.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 44: Neural Cellular Automata for Pathfinding</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-44/</link>
      <pubDate>Mon, 10 Aug 2026 20:37:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-44/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-44-neural-cellular-automata-for-pathfinding&#34;&gt;Cellular Automata From First Principles 44: Neural Cellular Automata for Pathfinding&lt;/h1&gt;&#xA;&lt;p&gt;Until now our neural cellular automata have learned to &lt;strong&gt;make and maintain shapes&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Now we will ask them to compute something.&lt;/p&gt;&#xA;&lt;p&gt;Given:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;walls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;finish&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;can a shared local update rule discover a path?&lt;/p&gt;&#xA;&lt;p&gt;This is an unusually good task for an NCA because classical pathfinding already has a local interpretation.&lt;/p&gt;&#xA;&lt;p&gt;Breadth-first search expands a frontier:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nearby reachable cells&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;next layer of reachable cells&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;goal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That looks remarkably like information propagating through a cellular system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 40: Randomize the Update Schedule</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-40/</link>
      <pubDate>Mon, 10 Aug 2026 20:36:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-40/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-40-randomize-the-update-schedule&#34;&gt;Cellular Automata From First Principles 40: Randomize the Update Schedule&lt;/h1&gt;&#xA;&lt;p&gt;Most cellular automata in this book have used synchronous updates:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;all cells observe state_t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;all cells update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;state_t+1 appears&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Neural cellular automata become more robust when we stop assuming perfect global synchronization.&lt;/p&gt;&#xA;&lt;h2 id=&#34;stochastic-firing&#34;&gt;Stochastic firing&lt;/h2&gt;&#xA;&lt;p&gt;Instead of applying every predicted update, sample a binary mask:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;stochastic_update&lt;/span&gt;(x, dx, fire_rate&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mask &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rand(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;], &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;], x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            device&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;device,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; fire_rate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; mask&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Half the cells update on average.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 39: Grow a Target From One Seed</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-39/</link>
      <pubDate>Mon, 10 Aug 2026 20:35:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-39/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-39-grow-a-target-from-one-seed&#34;&gt;Cellular Automata From First Principles 39: Grow a Target From One Seed&lt;/h1&gt;&#xA;&lt;p&gt;Now we can pose the central morphogenesis problem:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Start from one cell and learn local rules that construct a target pattern.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;prepare-a-target&#34;&gt;Prepare a target&lt;/h2&gt;&#xA;&lt;p&gt;Assume an RGBA image has been loaded into a tensor:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# shape: [1, 4, H, W], values in [0, 1]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;target &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; load_target(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target.png&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to(DEVICE)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The NCA state contains more channels than the image, so only the visible channels are compared:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 38: Hidden Cell Channels and Local Memory</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-38/</link>
      <pubDate>Mon, 10 Aug 2026 20:34:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-38/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-38-hidden-cell-channels-and-local-memory&#34;&gt;Cellular Automata From First Principles 38: Hidden Cell Channels and Local Memory&lt;/h1&gt;&#xA;&lt;p&gt;A visible pixel is not enough state for a cell that must also coordinate growth.&lt;/p&gt;&#xA;&lt;p&gt;So give every cell a vector.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[R, G, B, alpha, h1, h2, ... h12]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first channels can be rendered. The rest are private internal state.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CHANNELS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VISIBLE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;zeros(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, CHANNELS, &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;, device&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DEVICE)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The hidden channels have no labels. We do not tell the model that channel 8 means &amp;ldquo;distance from the centre&amp;rdquo; or channel 11 means &amp;ldquo;grow east&amp;rdquo;. If useful internal signals exist, training must discover them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cellular Automata From First Principles 37: Learn the Local Update Rule</title>
      <link>http://programmer.ie/post/cellular-automata-from-first-principles-37/</link>
      <pubDate>Mon, 10 Aug 2026 20:32:00 +0100</pubDate>
      <guid>http://programmer.ie/post/cellular-automata-from-first-principles-37/</guid>
      <description>&lt;h1 id=&#34;cellular-automata-from-first-principles-37-learn-the-local-update-rule&#34;&gt;Cellular Automata From First Principles 37: Learn the Local Update Rule&lt;/h1&gt;&#xA;&lt;p&gt;A neural cellular automaton does not need a large neural network.&lt;/p&gt;&#xA;&lt;p&gt;It needs a &lt;strong&gt;small local network applied everywhere&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;That distinction matters.&lt;/p&gt;&#xA;&lt;p&gt;The intelligence of the system comes less from the size of one cell&amp;rsquo;s computation and more from the repeated interaction of many cells over time.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;perception-first&#34;&gt;Perception first&lt;/h2&gt;&#xA;&lt;p&gt;Each cell needs information about itself and nearby cells.&lt;/p&gt;&#xA;&lt;p&gt;For a single visible channel we can compute several local features:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
