Поузловые активации MNIST (скрипт 17)¶
scripts/ablation/17_mnist_per_node_act_study.py — отдельный 2-фазный OVA-раннер
плюс очередь merge/evolve. Не втиснут в сетку A–D скрипта 10/15: там sweep
глобальной σ, здесь эволюционируют поузловые активации.
База как у 15 (GPU-only MNIST): dataset=mnist, 28×28×1, output_readout=mean,
pop A=256 / B=128 (dual-track B → 256), val=batch=1000, generations=0 (до стагнации).
stagnation_patience=50. Протокол pilot→generalize как у 11/15, но
generalize_fraction=1.0: после пилота (class 0) все 3 конфига фазы идут на
оставшиеся 9 классов.
На всех 6 конфигах: evolve_node_activations=True, activation=None, пул =
{None, relu, gelu, tanh, leaky_relu}. Split берёт случайную σ из пула;
mutate_activation меняет σ ровно у одной не-входной вершины (веса и топология
не трогаются).
Капы ширины/глубины — дефолт библиотеки (10**9). Размер графа режет только
фитнес; ацикличность и геометрия ядер остаются. То же для очереди merge/evolve.
6 OVA-конфигов¶
Фаза A — без GD:
acts— только эволюция σacts_ew— σ +edge_weights=Trueacts_ew_vc— σ +edge_weights+allow_variable_channels, каналы{1,8,16}
Фаза B — те же три + periodic_gd_enabled=True (every=5, batch=128; популяция
как у фаз C и D скрипта 15, но 128; два трека расширяют её до 256.
Итого 60 OVA-прогонов. Артефакты: ova/ova_results.json, ova/ova_status.json,
отложенная проверка (holdout) после фазы.
Очередь слияния и эволюции¶
Когда фаза готова (успешная строка по каждому class_id 0..9),
select_rows(..., "best-per-class") и merge_ova_champions (копирует
g.node_activation(old_id) внутри ветки).
| 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 | да |
Fingerprint-dedup и resume как в скрипте 16. Evolve: pop=128, 100 gens,
val=10000, gd_every=5, gd_epochs=2.
python scripts/ablation/17_mnist_per_node_act_study.py
python scripts/ablation/17_mnist_per_node_act_study.py --ova-only
python scripts/ablation/17_mnist_per_node_act_study.py --multiclass-only --only ab_gd
Дефолтный корень: runs/ablation/mnist_per_node_act/ (ova/, seeds/, evolve/).
Studio: одна форма, generalize_fraction=1.0.
CIFAR-10 аналог: скрипт 18. Протокол с val=5k и ослабленным GD: скрипт 19.