Lifetime neural plasticity

An organism's weights are not fixed at birth. A reward-modulated Hebbian rule with eligibility traces adjusts them every tick it is alive, at a rate the organism itself inherited. The mechanism demonstrably works. Two pre-registered tests looking for its behavioural consequences found nothing. Both of those sentences are true, and this page is about why.

Implementation Population-level null Open question Ruleset pre-genesis-candidate-v2 Source: src/el/neural.py

What actually changes

Each organism carries two weight vectors of the same shape. One is inherited and fixed for life. The other starts at exactly zero at birth and changes every tick. What the network actually computes with is their sum, with the acquired half multiplied by a scale the organism also inherited:

W_effective = W_genetic + plasticity_scale * W_plastic
Applied only to the 2,072 connectome weights. The 9 scalar parameters, including the learning genes themselves, are never plastic: an organism cannot learn to learn faster within its own lifetime.
What is inherited, what is acquired, and what resets. Read from el.population and el.neural.
StateInherited?Changes during life?At birth
W_genetic, 2,081 numbersYes, a mutated copy of the parent'sNoCopied and mutated
W_plastic, 2,072 numbersNo, never copied from the parentYes, every tickSet to exactly zero
elig_trace, 2,072 numbersNoYes, every tickSet to exactly zero
h_recurrent, 24 numbersNoYes, every tick, but by no learning ruleSet to exactly zero
Physical genome, 19 genesYes, a mutated copyNoCopied and mutated
Emergent Life implementation

Nothing an organism acquires is passed to its offspring. There is no code path that copies W_plastic at birth, and the array is explicitly zeroed. Whatever an organism's lifetime adjusted, dies with it. This is a design decision, not an oversight: the alternative would be inheritance of acquired characteristics, which would be a substantially different and much stronger claim to be making.

The update rule

The rule is reward-modulated Hebbian learning with eligibility traces. It runs once per tick, per living organism, in its own stage of the tick loop, after the action has been taken and the physiological consequences have landed.

# for each connection group g, with its own (post, pre) activity pair: e_g(t) = elig_decay * e_g(t-1) + outer(post_g(t), pre_g(t)) W_plastic_g = clip( W_plastic_g + learning_rate * M(t) * e_g(t), +/- 2.0 ) # the (post, pre) pairs, which are just the activities either end of each connection: # W_ih post = h_new pre = obs # W_hh post = h_new pre = h_prev # b_h post = h_new (no pre) # W_ho post = actions pre = h_new # b_o post = actions (no pre)
Transcribed from el.neural.update_plasticity. Eligibility is clipped at 20.0 and acquired weight at 2.0, both numerical safety rails rather than meaningful bounds.
Established concept

The eligibility trace is the standard answer to a real timing problem. A connection that was active now might only turn out to have been useful several ticks later, and by then the activity that caused it is gone. The trace holds a decaying record of which connections were recently co-active, so a reward arriving later can still find them. This idea is well established in both reinforcement learning and in models of biologically plausible plasticity; what is specific to this project is the exact form above and the fact that the decay constant is inherited rather than chosen.

Where the reward signal comes from

There is no task reward anywhere in this simulation. Nothing gives an organism plus one for eating. The modulating signal is built entirely out of changes in the organism's own physiological state, weighted by four numbers that are themselves genes:

M(t) = tanh( w_energy * d_energy + w_gut * d_gut + w_health * d_health + w_damage * d_damage ) # each d_* is (this tick's value - last tick's value), normalised by its own # physiological reference. Each w_* is one of this organism's own evolved genes.

Evolution is therefore free to discover that rising energy is reinforcing. It is equally free to discover that it is not, or that injury is, or that all four weights should sit near zero and the whole mechanism should stay quiet. The founder's four weights are small arbitrary draws rather than a sensible starting guess, deliberately: there is no principled neutral direction for what should reinforce an organism, and forcing them to zero would have given every founder a degenerate signal of exactly zero until mutation happened to act.

Emergent Life implementation

One of those four inputs was structurally always zero when the mechanism shipped: nothing in the world could injure an organism yet. Two phases later, thermal injury gave the damage term its first real producer. No reinforcement code was touched. A real signal simply started arriving where a zero used to.

The learning genes

Three scalars govern how an organism learns, and all three are inherited and mutated like any other parameter. Evolution decides how fast an organism learns and how much acquired change counts. No researcher tuned these per organism, and no organism has the same values as another except by descent.

Read from el.neural.learning_params and el.config.NeuralParams.
GeneSquashed intoWhat it controls
learning_rate0 to 0.05How large each tick's adjustment is
plasticity_scale0 to 1.0How much the acquired weights count when the network runs
elig_decay0 to 0.95How long a connection stays eligible after being active
4 reinforcement weightsunsquashed, like any weightWhat the organism treats as reinforcing

What it costs, and when

Running the machinery costs a flat amount per tick. Actually changing weights costs more, in proportion to how much they changed. Both are charged in the metabolic stage like any other cost.

The second term is charged one tick late, and the reason is a genuine engineering constraint rather than a biological analogy: the size of this tick's change is not known until this tick's update has run, and charging for it in the same tick would make the cost depend on a quantity that depends on the cost. So the magnitude is written down when it happens and billed on the next tick. It is a small example of computation order shaping a mechanism that otherwise looks purely biological.

The evidence, honestly

This is where a project could quietly stop describing and start implying. Two pre-registered tests looked for a population-level behavioural effect from lifetime plasticity. Neither found one.

Observed result

First test, 6 seeds at a reduced world scale, comparing plasticity on against plasticity off on a per-organism early-versus-late behavioural metric: no statistically detectable difference, p = 0.622 at the shipped costs and p = 0.919 at zero cost, against a pre-registered threshold of 0.05.

Replication, 8 seeds at the canonical world scale with roughly eight times the sample and a second metric added: no statistically detectable difference either, p = 0.453 on the primary metric and p = 0.185 on the secondary. Sample sizes exceeded the pre-registered minimum by 340 to 520 times, so this is a null result at adequate power rather than an inconclusive one.

A separate measurement, run by a different method with no hypothesis test attached, asked a much narrower question: does including an organism's acquired weights change what its network outputs, right now, on its real current inputs? It does.

Observed result

Across 2,204 sampled organism-and-tick states, per-channel differences in the squashed output ranged from 0.00018 to 0.00060. The discretised ingest decision flipped in 0.136% of sampled states, horizontal movement in 0.091%, vertical movement in 0.272%. An organism's own accumulated acquired-weight magnitude correlated at r = 0.90 with the size of the resulting difference, which is the mechanistic relationship the measurement should show if it is measuring what it claims to.

How to read this

The weights change. That change moves the outputs. But at the learning rates and plasticity scales the population actually evolved to, the resulting perturbation flips a discrete decision roughly once in a thousand states, which is far below what the two population-level metrics could resolve.

Interpretation

The project's own wording is worth using rather than paraphrasing: this is consistent with an effect too small for these population-level metrics to detect, rather than no effect at all.

What cannot be said: that organisms learn. What equally cannot be said: that lifetime plasticity does nothing. The tests that would settle either are not the tests that were run, and the ones that were run came back null. The full write-up, including everything these designs cannot rule out, is RN-002.

Nothing was changed in response. The stated reason is that this world provides too few meaningful multi-step relationships for a richer test to be worth building before organisms have more to learn about. That is a judgement, it is recorded as one, and it is still open.

Watch it on a real organism

Select any organism in the live world and open the learning section of its controller panel. It shows that individual's own inherited learning rate, plasticity scale and trace decay, its four reinforcement weights, how far its acquired weights have moved from the zero they started at, and the same with-and-without comparison described above, computed live for that organism on this tick.

Open the live world Read RN-002