Restructure: descriptive tier and experiment names, paper/manuscript

- paper/pnas -> paper/manuscript (venue-neutral)
- configs/layer1 -> configs/inheritance, src/knowledge -> src/inheritance
  (imported as `inheritance`), make layer1 -> make inheritance; layer2 alias dropped
- inheritance and trained-network bundles named after the manuscript figure
  they feed (fig2_grounding_sweep, figS3_rebaselining, ...), or descriptively
  where they feed none; configs keep their `experiment:` value so parquet
  hashes are unchanged, only output.dir moves
- figure scripts, SI figure sources, notebooks, REPRODUCING.md, README and the
  SI Methods/tables updated; make clean no longer deletes tracked manifests;
  reproduce.sh hashes the s{seed}/ layouts too

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y64o8FKP7rCuXzC48pxpMm
This commit is contained in:
Giorgio Gilestro 2026-09-13 17:00:40 +01:00
parent 84124de143
commit ab3dc10587
240 changed files with 477 additions and 476 deletions

View file

@ -0,0 +1,35 @@
# E2 — A tiny dose of real data rescues diversity (the headline)
**Claim tested:** how much *real* data must you mix back in each generation to stop collapse — a
lot, or a little?
**Setup (Layer 1, pure math).** `K = 1000` items, Zipf truth `p*`, `n = 200` inherited samples per
generation, 500 generations, 100 repeats. Each generation we also mix in `m` fresh **real** samples
drawn from `p*`. The knob swept is the **grounding fraction** `g = m/(n+m)` — the share of the
training pool that is real — across `g ∈ {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}`.
### Symbols
- **`g`** grounding fraction (share of real data); **`g*`** the *critical* value that restores diversity.
- **`p*`** truth, **`p_t`** model, **`H`** diversity, **`H*`** truth's diversity.
- **grounding = "immigration"** in the genetics analogy: real samples are migrants that re-introduce alleles drift keeps killing.
### The four panels
1. **Trajectories.** Diversity `H` over generations, one line per `g` (dark = dry, bright = more
grounding). `g = 0` slides toward 0; any `g > 0` levels off on a plateau — the collapse is
arrested.
2. **The phase boundary (the headline).** Dots = stationary diversity vs `g`; the black dashed curve
is the *exact* closed-form equilibrium `H_eq`; the red line marks the critical
**`g* ≈ 0.048` (95% CI [0.047, 0.050])** where `H` reaches 95% of the truth's diversity. Only
**~5% real data** buys back essentially all the diversity. The `g = 0` point is drawn hollow (it
is still sliding — its true equilibrium is 0).
3. **Tail coverage.** Fraction of the rare tail retained, by item-count (red) and truth-mass-weighted
(purple). Both rise with `g` but stay modest at feasible grounding: a little grounding restores
*diversity* long before it restores the *deep* tail — which motivates E4 (recombination) and E6.
4. **Per-rarity band.** The tail split into rarity bands (bright = shallowest, dark = deepest). Deep
bands lag: an item survives only once `m·p*ᵢ ≳ 1` (enough real samples per generation to land it
at least once). The sharp threshold lives here, in discrete item survival — not in the smooth `H`.
### Takeaway
There is a **critical grounding fraction `g* ≪ 1`**: a small, constant trickle of reality
indefinitely holds off collapse. **Falsifier (not triggered):** if diversity had only recovered as
`g → 1`, the practical thesis would die. It recovers at `g ≈ 0.05`.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

View file

@ -0,0 +1,14 @@
{
"experiment": "E2_grounding_phase_boundary",
"master_seed": 20260704,
"git_commit": "a6eb9b75124779375fa1a0b3a64115ecd705b218",
"python": "3.14.5",
"libraries": {
"numpy": "2.5.0",
"scipy": "1.18.0",
"pandas": "3.0.3",
"pyarrow": "24.0.0"
},
"rows": 400800,
"results_sha256": "aa8633171f833611b9c2cde3d13c61e65a81a7c9c6cef5bc76a79127d8af59a3"
}

View file

@ -0,0 +1,305 @@
experiment: E2_grounding_phase_boundary
seed: 20260704
n_replicates: 100
source_config:
experiment: E2_grounding_phase_boundary
seed: 20260704
n_replicates: 100
generations: 500
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 0
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
sweep:
- param: g
values:
- 0.0
- 0.005
- 0.01
- 0.02
- 0.05
- 0.1
- 0.2
- 0.4
output:
dir: results/fig2_grounding_sweep
grid:
- label:
g: 0.0
m: 0
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 0
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
- label:
g: 0.005
m: 1
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 1
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
- label:
g: 0.01
m: 2
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 2
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
- label:
g: 0.02
m: 4
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 4
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
- label:
g: 0.05
m: 11
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 11
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
- label:
g: 0.1
m: 22
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 22
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
- label:
g: 0.2
m: 50
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 50
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09
- label:
g: 0.4
m: 133
lineage_cfg:
truth:
K: 1000
R: 1
tail: zipf
zipf_s: 1.1
tail_frac: 0.5
tail_threshold: 0.001
init: truth
dynamics:
n: 200
teachers:
K_T: 1
rho: 0.0
q: 1.0
grounding:
m: 133
policy: proportional
selection:
mode: none
novelty_alpha: 0.0
remint:
enabled: false
period: null
H_gate: null
generations: 500
metrics:
kl_floor: 1.0e-09
support_eps: 1.0e-09