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

Periodic gd

5.4 Периодическое градиентное дообучение

Лёгкий Adam-проход по элитам в offspring queue (или популяции) каждые \(N_\text{pgd}\) поколений (cnn_neat/periodic_gd.py):

\[ \forall G_i \in \mathcal{Q}:\quad \theta_i \leftarrow \theta_i - \eta \nabla_{\theta_i} \mathcal{L}(G_i, \mathcal{D}_\text{fold}), \quad E_\text{pgd}\text{ эпох} \]

Топология заморожена: меняются только веса Conv2d (и edge scalars).

Протокол данных (фазы C/D, periodic_gd_cv_enabled=True)

  1. CIFAR-10 train с OvR-метками для текущего positive_class.
  2. Фиксированный valid (fitness_val_indices.json) — приспособленность (fitness) чистого CNN-NEAT и accept/reject gate после GD.
  3. Остаток train (~40k при val=10k) делится на \(K=5\) фиксированных fold (periodic_gd_cv_folds_seed{seed}_k{K}.json). Каждый GD-event учит на одной вращающейся \(1/K\) доле (periodic_gd_cv_train_one_fold=True).

Индексы фиксированы seed-ом и общие для всех прогонов → сравнимость.

Параметр Default Описание
periodic_gd_enabled False Включить
periodic_gd_every 5 Каждые N поколений (gen > 0)
periodic_gd_epochs 3 Эпох Adam на каждый геном
periodic_gd_batch_size 256 Размер батча
periodic_gd_lr 1e-3 Learning rate
periodic_gd_targets offspring_queue queue | population | elites
periodic_gd_parallel 1 Параллельные геномы (CUDA streams)
periodic_gd_device None Device GD; "cuda" при CPU-эволюции
periodic_gd_cv_enabled False K-fold протокол выше
periodic_gd_cv_folds 5 Число fold
periodic_gd_cv_train_one_fold True Учить на 1/K (иначе legacy ⅘)
periodic_gd_park_forward_hash_cache True Park Merkle-графа перед GD
adaptive_periodic_gd_batch_size True Ужимать батч GD при нехватке VRAM
periodic_gd_batch_size_min 16 Нижняя граница адаптивного батча
gd_lineage_track_enabled False Два трека (dual-track) после первого GD

Accept/reject: веса применяются, только если L1-норма изменения \(>0\) и val-gate проходит. Исследуется в фазах C/D OVA (скрипты 06, 10, 11).

Градиентное дообучение в многоклассовом режиме

При task_mode="multiclass" (seed из OVA-merge) лосс — не бинарный BCE, а cross-entropy по логитам tip'ов (multiclass_head.multiclass_classification_loss); топология по-прежнему заморожена, обучаются conv- и edge-веса. Применяется в скриптах 14b и 16 (multiclass эксперименты).

См. dual-track, hybrid CPU/GPU.