Поузловые активации CIFAR-10 (скрипт 18)¶
scripts/ablation/18_cifar_per_node_act_study.py — CIFAR-аналог скрипта 17:
тот же 2-фазный OVA-раннер и очередь merge/evolve, но на CIFAR-10 (32×32×3).
Протокол σ как у 17: на всех конфигах evolve_node_activations=True,
activation=None, пул {None, relu, gelu, tanh, leaky_relu}.
generalize_fraction=1.0.
OOM на CIFAR почти всегда из широких каналов (acts_ew_vc), не из
числа уникальных узлов. Поэтому бюджет держит произведение
val × pop ≈ старого 4000×128: val=20000, pop=25 в каждом
поколении (A и B). Два трека expand выключен: раньше фаза B прыгала 12→24
после первого GD, а Studio ещё показывала base=25.
100 — это stagnation_patience (поколения без улучшения), не число геномов.
| Ручка | было (как 11) | сейчас |
|---|---|---|
| val / eval batch | 4000 | 20000 |
| pop A / B | 128 / 64 (B: 64→128 после GD) | 25 / 25 каждый ген |
| val×pop | 512k / 256k→512k | 500k |
| stagnation | 50, любое ε | 100 поколений patience, Δ ≥ 0.00025 (1 TP) |
| OOM ladder | 3000, 2000 | 16000, 12000 |
min_delta — фильтр шума (один TP на n₊=2000). Patience — сколько поколений
ждать топологический скачок. С pop÷5 каждая генерация даёт в 5 раз меньше
мутаций, поэтому ждать надо дольше в поколениях: ~20 gens сигнала на pop 128
× (128/25) ≈ 100. Старые 50 gens не масштабируем — туда входили нано-тики,
которые теперь отсекает Δ.
Капы ширины/глубины сняты (10**9 на OVA и merge/evolve).
Две головы тестируются отдельно (как в фазе A скрипта 05): mean_minus_median
(mmd) и mean. На MNIST mmd вырожден при одном канале выхода; на CIFAR обе
головы осмысленны.
12 OVA-конфигов¶
Фаза A — без GD, 3 архитектуры × 2 головы:
acts_mmd/acts_mean— только эволюция σacts_ew_mmd/acts_ew_mean— σ +edge_weights=Trueacts_ew_vc_mmd/acts_ew_vc_mean— σ +edge_weights+allow_variable_channels, каналы{3,8,16}
Фаза B — те же шесть + periodic_gd_enabled=True (every=5, batch=128;
популяция тоже 25, без расширения двумя треками.
Итого 120 OVA-прогонов. Артефакты: ova/ova_results.json, ova/ova_status.json,
отложенная проверка (holdout) после фазы.
Очередь слияния и эволюции¶
| id | Чемпионы | Evolve GD |
|---|---|---|
a_no_gd |
best-per-class A | нет |
b_no_gd |
best-per-class B | нет |
ab_no_gd |
best-per-class A∪B | нет |
b_gd |
B | да |
ab_gd |
A∪B | да |
Evolve: pop=25, 100 gens, val=10000 (25×10000 ≈ старый 128×2048), gd_every=5,
gd_epochs=2.
python scripts/ablation/18_cifar_per_node_act_study.py
python scripts/ablation/18_cifar_per_node_act_study.py --ova-only
python scripts/ablation/18_cifar_per_node_act_study.py --multiclass-only --only ab_gd
Дефолтный корень: runs/ablation/cifar_per_node_act/ (ova/, seeds/, evolve/).
Studio: форма 18, generalize_fraction=1.0.