Перейти к содержанию

Поузловые активации 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=True
  • acts_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.