Files
PracticeClassif/_research/SECTION_hpo_methods.md
2026-06-30 15:17:40 +03:00

318 lines
36 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Методы оптимизации и подбора гиперпараметров — таксономия, теория, источники"
tags: [HPO, hyperparameter-optimization, methodology, automl]
supervisor: "мнс Павленко Б.В."
status: draft
---
# Методы оптимизации / подбора гиперпараметров
> Раздел учебно-исследовательской методички. Цель — дать самодостаточную таксономию методов HPO (Hyper-Parameter Optimization), их теоретические основы, формулы, сравнительные таблицы и практическую методологию для DL-классификации.
## 1. Гиперпараметры vs параметры. Пространство поиска, бюджет, цель
**Параметры (parameters)** — переменные модели, которые настраиваются оптимизатором *в ходе обучения* напрямую минимизацией функции потерь (веса $W$, смещения $b$ свёрток и линейных слоёв, $\gamma,\beta$ в BatchNorm). Их градиент $\partial \mathcal{L}/\partial W$ вычислим аналитически (backprop).
**Гиперпараметры (hyper-parameters)** — переменные, которые задаются *до/над* обучением и управляют либо самим процессом обучения (learning rate, weight decay, batch size, оптимизатор, расписание), либо ёмкостью и структурой модели (глубина, ширина, dropout, label smoothing), либо данными (аугментации). Градиент целевой метрики по ним обычно недоступен в замкнутой форме — отсюда отдельная дисциплина HPO.
Формально HPO — это задача оптимизации «чёрного ящика»:
$$
\lambda^{\*} = \arg\min_{\lambda \in \Lambda}\; \mathcal{L}_{\text{val}}\big(A_\lambda(D_{\text{train}}),\, D_{\text{val}}\big),
$$
где $\lambda$ — вектор гиперпараметров из пространства поиска $\Lambda$; $A_\lambda$ — алгоритм обучения, обученный с этой конфигурацией; $\mathcal{L}_{\text{val}}$ — целевая функция (валидационный loss или $1-\text{accuracy}$, $1-\text{R@1}$ и т. д.). Функция $\mathcal{L}_{\text{val}}(\lambda)$ — **дорогая** (один replay = полное обучение), **зашумлённая** (random seed, недетерминизм GPU), **недифференцируемая** по $\lambda$ и часто **немонотонная**.
### Типы переменных в пространстве поиска $\Lambda$
| Тип | Пример | Шкала | Примечание |
|-----|--------|-------|------------|
| Непрерывный (continuous / real) | `lr` $\in[10^{-5},10^{-1}]$, `weight_decay`, `dropout` | log / linear | для `lr`, `wd`**логарифмическая** |
| Целочисленный (integer / ordinal) | `batch_size`, число эпох заморозки, ширина слоя | log2 / linear | порядок имеет смысл |
| Категориальный (categorical / nominal) | `optimizer` ∈ {SGD, AdamW, Lion}, тип scheduler | — | порядка нет |
| Условный / иерархический (conditional) | `momentum` существует только если `optimizer=SGD`; `betas` — только для Adam | — | дерево зависимостей → tree-structured space |
**Условность** (conditional space) — ключевая черта реальных задач: подпространство активно только при определённом значении родителя. Метод HPO должен это моделировать (TPE, SMAC — могут; чистый GP — хуже).
**Бюджет (budget)** — ограничение ресурсов: число trial'ов $N$, суммарное GPU-время, либо «fidelity» (число эпох / доля данных / разрешение). Цель методологии — найти хороший $\lambda$ при **фиксированном бюджете**, а не глобальный оптимум любой ценой.
**Цель (objective)** — скаляр (single-objective) или вектор (multi-objective: accuracy ↔ latency/FLOPs — критично для edge-моделей вроде EdgeNeXt на Jetson). При multi-objective говорят о Pareto-фронте.
---
## 2. Базовые методы: Manual, Grid Search, Random Search
### 2.1 Manual / Babysitting («graduate student descent»)
Эксперт вручную меняет один-два гиперпараметра, смотрит на кривые обучения, корректирует. Плюсы: дёшево на старте, накапливает интуицию. Минусы: невоспроизводимо, не масштабируется, систематический bias, не параллелится.
### 2.2 Grid Search
Декартово произведение заранее заданных значений по каждой оси. Для $d$ осей по $k$ значений — $k^d$ конфигураций (комбинаторный взрыв). Полностью параллелизуем, прост, воспроизводим. Главная беда — **проклятие размерности** и неэффективное покрытие при наличии «неважных» осей.
### 2.3 Random Search
Каждая конфигурация сэмплируется независимо из заданных распределений по осям ($\log$-uniform для `lr`/`wd`, uniform/categorical для остальных).
**Ключевой источник:** [Bergstra & Bengio, 2012, «Random Search for Hyper-Parameter Optimization», JMLR 13:281305](https://jmlr.org/papers/v13/bergstra12a.html).
**Почему random эффективнее grid в высокой размерности.** На практике целевая функция имеет **низкую эффективную размерность** (low effective dimensionality): из $d$ гиперпараметров реально важны лишь $d_{\text{eff}} \ll d$. Grid тратит бюджет на повторную дискретизацию неважных осей: при $k^d$ точках по каждой *важной* оси пробуется только $k$ различных значений. Random Search при $N$ trial'ах пробует $N$ **различных** значений по *каждой* оси (с вероятностью 1), то есть гораздо плотнее покрывает проекцию на важные оси.
Интуиция «вероятности промаха»: если хорошая область занимает долю $v$ объёма $\Lambda$, то вероятность хотя бы одного попадания за $N$ случайных trial'ов:
$$
P(\text{hit}) = 1 - (1 - v)^N .
$$
Чтобы получить $P \ge 1-\epsilon$, нужно $N \ge \dfrac{\log \epsilon}{\log(1-v)}$ — это **не зависит от размерности** $d$, в отличие от grid. Bergstra & Bengio эмпирически показали, что random search находит модели не хуже, чем тщательный grid+manual search из предыдущих работ, за малую долю вычислений.
```python
# Минимальный Random Search в лог-шкале для lr/wd (PyTorch-агностично)
import numpy as np
def sample_config(rng):
return {
"lr": 10 ** rng.uniform(-4, -1), # log-uniform
"weight_decay": 10 ** rng.uniform(-6, -2), # log-uniform
"batch_size": int(rng.choice([64, 128, 256])),
"optimizer": rng.choice(["sgd", "adamw"]),
}
rng = np.random.default_rng(seed=42) # фиксируем seed → воспроизводимость
configs = [sample_config(rng) for _ in range(64)] # бюджет N=64 trial'ов
```
---
## 3. Bayesian Optimization (BO)
Идея: построить дешёвую **суррогатную модель** (surrogate) $p(\mathcal{L}\mid\lambda)$ по уже наблюдённым $(\lambda_i,\mathcal{L}_i)$ и выбирать следующую точку, максимизируя **acquisition function** — это Sequential Model-Based Optimization (SMBO). BO выборочно-эффективна (sample-efficient), но **последовательна** по природе (плохо параллелится без модификаций) и хуже масштабируется по $d$.
### 3.1 Суррогатные модели
**Gaussian Process (GP).** Апостериор по функции — гауссов: $\mathcal{L}(\lambda)\sim \mathcal{GP}(\mu(\lambda),k(\lambda,\lambda'))$. Даёт замкнутые предсказательные среднее $\mu(\lambda)$ и дисперсию $\sigma^2(\lambda)$. Минусы: $O(n^3)$ по числу наблюдений, плохо с категориальными/условными осями и высокой размерностью.
**TPE (Tree-structured Parzen Estimator).** Источник: [Bergstra, Bardenet, Bengio, Kégl, 2011, «Algorithms for Hyper-Parameter Optimization», NeurIPS 24:25462554](https://www.researchgate.net/publication/216816964_Algorithms_for_Hyper-Parameter_Optimization). Вместо $p(y\mid\lambda)$ моделируется $p(\lambda\mid y)$ двумя плотностями, разделяя trial'ы порогом $y^{\*}$ (квантиль):
$$
p(\lambda \mid y) =
\begin{cases}
\ell(\lambda), & y < y^{\*} \quad (\text{«хорошие»})\\[2pt]
g(\lambda), & y \ge y^{\*} \quad (\text{«плохие»})
\end{cases}
$$
Можно показать, что максимизация Expected Improvement эквивалентна максимизации отношения $\ell(\lambda)/g(\lambda)$. TPE естественно поддерживает **категориальные и условные** пространства (отсюда «tree-structured») и хорошо масштабируется по $d$. Open-source реализация — `hyperopt` (2013), а также ядро `Optuna`.
**SMAC (random forest surrogate).** Источник: [Lindauer et al., 2022, «SMAC3», JMLR 23(54):19](http://jmlr.org/papers/v23/21-0888.html). Суррогат — random forest, дающий среднее и дисперсию по разбросу деревьев. RF хорошо работает с категориальными/условными осями, целочисленными переменными и высоким $d$; плюс агрессивный racing-механизм для сравнения конфигураций на нескольких instance.
### 3.2 Acquisition functions
Пусть $f^{\*}$ — лучшее наблюдённое значение (минимизация), $\mu,\sigma$ — апостериорные среднее и СКО суррогата.
| Acquisition | Формула | Поведение |
|-------------|---------|-----------|
| **PI** (Probability of Improvement) | $\mathrm{PI}(\lambda)=\Phi\!\Big(\dfrac{f^{\*}-\mu(\lambda)-\xi}{\sigma(\lambda)}\Big)$ | жадная, склонна к exploitation |
| **EI** (Expected Improvement) | $\mathrm{EI}(\lambda)=(f^{\*}-\mu-\xi)\Phi(z)+\sigma\,\phi(z),\;\; z=\dfrac{f^{\*}-\mu-\xi}{\sigma}$ | баланс, индустриальный стандарт |
| **UCB/LCB** (Upper/Lower Confidence Bound) | $\mathrm{LCB}(\lambda)=\mu(\lambda)-\beta_t\,\sigma(\lambda)$ | $\beta_t$ напрямую регулирует exploration |
Здесь $\Phi,\phi$ — CDF и PDF стандартного нормального распределения, $\xi\ge 0$ — параметр jitter для exploration.
**Exploration vs exploitation.** Это центральный компромисс BO: $\sigma(\lambda)$ велика в неисследованных областях (exploration), $\mu(\lambda)$ мала в перспективных (exploitation). UCB/LCB даёт теоретические гарантии: [Srinivas et al., 2010, «Gaussian Process Optimization in the Bandit Setting: No Regret and Experimental Design», ICML](https://www.researchgate.net/publication/221345649_Gaussian_Process_Optimization_in_the_Bandit_Setting_No_Regret_and_Experimental_Design) доказали сублинейную границу кумулятивного regret $\tilde{O}(\sqrt{N\,\gamma_N})$ для GP-UCB, где $\gamma_N$ — максимальный information gain, а $\beta_t$ выбирается по информационно-теоретическому правилу.
---
## 4. Эволюционные / популяционные методы
### 4.1 CMA-ES (Covariance Matrix Adaptation Evolution Strategy)
Поддерживает многомерное гауссово распределение $\mathcal{N}(m,\,\sigma^2 C)$ над пространством поиска; на каждой итерации сэмплирует популяцию $\lambda_i$, оценивает, и адаптирует среднее $m$, шаг $\sigma$ и **матрицу ковариаций** $C$ по лучшим особям:
$$
\lambda_i \sim m + \sigma\,\mathcal{N}(0,C),\qquad
m \leftarrow \sum_{i=1}^{\mu} w_i\,\lambda_{i:\text{best}} .
$$
Сильна на непрерывных, не-сепарабельных, мультимодальных ландшафтах; не требует градиента. Минусы: категориальные/условные оси — неестественны; затраты на $C$ растут с $d^2$.
### 4.2 Генетические алгоритмы (GA)
Популяция «особей» (конфигураций) эволюционирует через **selection → crossover → mutation**. Гибки к смешанным пространствам, легко параллелятся, но требуют много оценок и тонкой настройки операторов.
### 4.3 Population Based Training (PBT)
Источник: [Jaderberg et al., 2017, «Population Based Training of Neural Networks», DeepMind, arXiv:1711.09846](https://arxiv.org/abs/1711.09846).
PBT обучает **популяцию** моделей параллельно и периодически выполняет две операции:
- **exploit** — слабые модели копируют веса И гиперпараметры лучших (truncation selection);
- **explore** — скопированные гиперпараметры возмущаются (perturb / resample).
Ключевая особенность: PBT находит **расписание** (schedule) гиперпараметров во времени, а не одну фиксированную точку — что часто оптимальнее (например, убывающий `lr`, меняющаяся сила аугментаций). Асинхронен, эффективно использует фиксированный бюджет, переиспользует частично обученные веса (не стартует с нуля).
---
## 5. Multi-fidelity / early-stopping
Базовая идея: **дёшево отсеять заведомо плохих**, не доводя их до полного обучения. «Fidelity» (точность оценки) = число эпох / доля данных / разрешение. Плохие конфигурации убиваются рано, бюджет переливается перспективным.
### 5.1 Successive Halving (SHA)
Запустить $n$ конфигураций с малым бюджетом $r$; оставить верхние $1/\eta$; увеличить их бюджет в $\eta$ раз; повторять. За $\log_\eta n$ «раундов» бюджет на конфигурацию растёт геометрически.
Проблема SHA — компромисс **«$n$ vs $B/n$»**: при фиксированном суммарном бюджете $B$ неясно, брать много конфигураций с малым бюджетом каждой или мало с большим (риск рано убить «медленный старт»).
### 5.2 Hyperband
Источник: [Li, Jamieson, DeSalvo, Rostamizadeh, Talwalkar, 2018, «Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization», JMLR (arXiv:1603.06560)](https://arxiv.org/abs/1603.06560).
Hyperband решает дилемму $n$ vs $B/n$, запуская **несколько «брекетов» (brackets)** SHA с разными стартовыми $(n,r)$: от «много конфигураций / агрессивное отсеивание» до «мало / щадящее». Это страхует от misleading early performance. Внешний цикл по $s$, внутренний — SHA:
$$
s_{\max}=\lfloor\log_\eta(R)\rfloor,\qquad n_s=\Big\lceil \tfrac{s_{\max}+1}{s+1}\eta^{s}\Big\rceil,\qquad r_s=R\,\eta^{-s},
$$
где $R$ — максимальный бюджет на одну конфигурацию, $\eta$ — фактор отсева (обычно 3). Hyperband даёт ускорение более чем на порядок против random search и model-based методов на DL/kernel-задачах.
### 5.3 ASHA (Asynchronous Successive Halving)
Источник: [Li et al., 2020, «A System for Massively Parallel Hyperparameter Tuning», MLSys (arXiv:1810.05934)](https://arxiv.org/abs/1810.05934).
SHA синхронна: «раунд» ждёт завершения всех конфигураций (stragglers тормозят). ASHA **асинхронна**: как только конфигурация дошла до уровня и попадает в топ-$1/\eta$ на текущий момент — её сразу промотируют, не дожидаясь остальных; освободившийся ресурс берёт новую конфигурацию. Это даёт почти линейное масштабирование на сотни-тысячи воркеров. ASHA превосходит PBT, BOHB и Vizier в массово-параллельном режиме.
### 5.4 BOHB (Bayesian Optimization + HyperBand)
Источник: [Falkner, Klein, Hutter, 2018, «BOHB: Robust and Efficient Hyperparameter Optimization at Scale», ICML (arXiv:1807.01774)](https://arxiv.org/abs/1807.01774).
Hyperband сэмплирует конфигурации **случайно** — это его слабость на «больших» бюджетах. BOHB заменяет random-сэмплинг внутри Hyperband на **TPE-суррогат** (модель строится по уже виденным результатам на разных fidelity). Получает: anytime-производительность и параллелизм Hyperband + sample-efficiency BO. Ускорение поиска до ~50× по wall-clock. Реализация — `HpBandSter` (AutoML).
---
## 6. Gradient-based / hypergradients и meta-learning (кратко)
Если бы метрика была дифференцируема по $\lambda$, можно было бы делать градиентный спуск по гиперпараметрам. Подходы:
- **Reversible learning / hypergradients.** [Maclaurin, Duvenaud, Adams, 2015, «Gradient-based Hyperparameter Optimization through Reversible Learning», ICML (arXiv:1502.03492)](https://arxiv.org/abs/1502.03492): вычисляют точный градиент валидационной потери по тысячам гиперпараметров, разворачивая (reverse-mode) всю динамику SGD-with-momentum назад во времени. Позволяет настраивать расписания `lr`/momentum, схемы регуляризации, инициализацию.
- **Implicit differentiation.** Дифференцирование через условие стационарности обученных весов — избегает хранения всей траектории (масштабируется лучше).
- **Meta-learning связь.** Та же машинерия (внешний/внутренний цикл) лежит в основе MAML-подобных подходов: «гиперпараметром» становятся инициализация или сам алгоритм обучения.
Ограничение: применимо к непрерывным дифференцируемым гиперпараметрам (`lr`, `wd`, веса лоссов); не работает для категориальных/архитектурных. На практике в edge-классификации используется редко (дорого, нестабильно), но важно концептуально.
---
## 7. Инструменты-фреймворки
| Фреймворк | Основные алгоритмы | Плюсы | Минусы | Лицензия |
|-----------|--------------------|-------|--------|----------|
| **[Optuna](https://github.com/optuna/optuna)** ([Akiba 2019, KDD](https://arxiv.org/abs/1907.10902)) | TPE, CMA-ES, GP, Random; pruners (ASHA/Hyperband/Median) | define-by-run API (динамич. условные пространства), отличная визуализация, importance | surrogate-GP слабее спец-BO; sampler по умолчанию последовательный | MIT |
| **[Ray Tune](https://docs.ray.io/en/latest/tune/index.html)** | ASHA, Hyperband, PBT, BOHB; интегрирует Optuna/HyperOpt/Ax/Nevergrad | масштаб от ноутбука до кластера без правки кода, лучший параллелизм | overhead Ray, кривая входа | Apache-2.0 |
| **[Hyperopt](https://github.com/hyperopt/hyperopt)** ([Bergstra 2011/2013](https://www.researchgate.net/publication/216816964_Algorithms_for_Hyper-Parameter_Optimization)) | TPE, Random, (Anneal) | классика TPE, условные пространства, MongoDB-параллелизм | вялое развитие, устаревший API, нет GP | BSD |
| **[scikit-optimize](https://scikit-optimize.github.io/)** | GP-BO, RF, GBRT (`gp_minimize`) | sklearn-совместим, прост | малый параллелизм, проект почти заморожен | BSD-3 |
| **[Ax](https://ax.dev) / [BoTorch](https://botorch.org)** ([arXiv:1912.05686](https://arxiv.org/abs/1912.05686)) | GP-BO на PyTorch, multi-objective (qEHVI), constraints | SOTA-BO, multi-objective/Pareto, neural-aware | избыточен для простого поиска; нужен GPyTorch | MIT |
| **[Nevergrad](https://github.com/facebookresearch/nevergrad)** | CMA-ES, DE, PSO, TBPSA, oneshot (ask-and-tell) | богатый набор gradient-free, хорош для непрерывных/шумных | слабая поддержка условных, мало DL-инфраструктуры | MIT |
| **[SMAC3](https://github.com/automl/SMAC3)** ([Lindauer 2022, JMLR](http://jmlr.org/papers/v23/21-0888.html)) | RF-surrogate BO + racing, multi-fidelity (Hyperband) | силён на категор./условных/смешанных, AutoML-зрелость | сложнее в освоении, тяжелее зависимости | BSD-3 |
| **[NNI](https://github.com/microsoft/nni)** (Microsoft) | TPE, SMAC, Hyperband, PBT, NAS, Anneal, Evolution | широкий охват (HPO + NAS + compression), web-UI | объёмный, реже обновляется | MIT |
| **[W&B Sweeps](https://docs.wandb.ai/guides/sweeps)** | Grid, Random, Bayes (+early-terminate Hyperband) | трекинг + поиск в одном, агенты-воркеры, дашборды | BO базовый; SaaS-зависимость для UI | проприет. (SaaS) + open client (MIT) |
| **[KerasTuner](https://keras.io/keras_tuner/)** | Random, Hyperband, BO | прост, нативно Keras/TF | только TF/Keras-экосистема, базовые алгоритмы | Apache-2.0 |
> Практический выбор для edge-DL (EdgeNeXt и т. п.): **Optuna** (TPE + ASHA pruner) как дефолт; **Ray Tune** при многоузловом кластере; **Ax/BoTorch** при явной multi-objective (accuracy ↔ latency).
---
## 8. Практическая методология для DL-классификации
### 8.1 Что подбирать и в какой шкале
| Гиперпараметр | Типичный диапазон | Шкала | Приоритет |
|---------------|-------------------|-------|-----------|
| `learning_rate` | $10^{-4}\ldots10^{-1}$ (SGD) / $10^{-5}\ldots10^{-3}$ (AdamW) | **log** | ★★★ высший |
| `weight_decay` | $10^{-6}\ldots10^{-2}$ | **log** | ★★★ |
| `batch_size` | {64,128,256,512} | log2 | ★★ (связан с `lr`) |
| `optimizer` | {SGD+momentum, AdamW, Lion} | categorical | ★★ |
| `lr_scheduler` | {cosine, step, one-cycle, warmup+cosine} | categorical / cond | ★★ |
| `warmup_epochs` | 0…10 | linear | ★ |
| `dropout` / `drop_path` | 0.0…0.5 | linear | ★★ |
| `label_smoothing` | 0.0…0.2 | linear | ★ |
| аугментации (RandAugment $N,M$; mixup $\alpha$; cutmix) | $N\in[1,3]$, $M\in[5,15]$, $\alpha\in[0.1,1.0]$ | mixed | ★★ |
| ёмкость / глубина модели (если NAS-lite) | пресеты {XS,S,M} | ordinal/cat | ★★ |
| глубина заморозки (freeze depth при fine-tuning) | 0…$L$ блоков | integer | ★★ (для transfer) |
**Почему лог-шкала для `lr`/`wd`.** Их эффект мультипликативен, а «хорошие» значения охватывают несколько порядков. Линейный сэмплинг между $10^{-5}$ и $10^{-1}$ отдал бы ~99 % проб диапазону $[10^{-2},10^{-1}]$ и почти не пробовал малые значения. Лог-uniform делает плотность равномерной по порядкам: $\log_{10}(\text{lr})\sim U(-4,-1)$.
### 8.2 Воспроизводимость и валидация
- **Фиксация seed.** Задавать `seed` для Python/NumPy/torch и `torch.use_deterministic_algorithms(True)` (где возможно). Помнить: $\mathcal{L}_{\text{val}}(\lambda)$ зашумлена — один seed даёт смещённую оценку.
- **Реплики (replicas).** Топ-кандидатов переоценивать на $\ge 3$ seed'ах и сравнивать по среднему ± std; иначе «победитель» может оказаться счастливым seed'ом.
- **Валидационная стратегия.** Hold-out (фикс. train/val) — стандарт для больших DL-датасетов (быстро, дёшево). **k-fold CV** — для малых датасетов (надёжнее, но в $k$ раз дороже; в DL применяют редко). Test-сет трогать **только однократно** в самом конце.
- **Бюджет.** Заранее зафиксировать $N$ trial'ов или GPU-часы; multi-fidelity (ASHA) при тесном бюджете.
- **Отчёт о важности (importance).** После поиска — fANOVA / permutation importance (есть в Optuna `plot_param_importances`), чтобы понять, какие оси реально влияют, и сузить $\Lambda$ в следующей итерации.
```python
# Optuna: TPE + ASHA-pruner, log-шкала для lr/wd, медианный pruning по эпохам
import optuna
def objective(trial):
lr = trial.suggest_float("lr", 1e-4, 1e-1, log=True)
wd = trial.suggest_float("weight_decay", 1e-6, 1e-2, log=True)
opt = trial.suggest_categorical("optimizer", ["sgd", "adamw"])
model, loader_tr, loader_val = build(lr, wd, opt) # пользовательская сборка
for epoch in range(MAX_EPOCHS):
train_one_epoch(model, loader_tr)
acc = evaluate(model, loader_val)
trial.report(acc, epoch) # для pruner'а
if trial.should_prune(): # ранний отсев
raise optuna.TrialPruned()
return acc
study = optuna.create_study(
direction="maximize",
sampler=optuna.samplers.TPESampler(seed=42), # фикс. seed
pruner=optuna.pruners.SuccessiveHalvingPruner(), # multi-fidelity
)
study.optimize(objective, n_trials=64) # бюджет
print(study.best_params)
optuna.importance.get_param_importances(study) # отчёт о важности
```
---
## 9. Типичные ошибки
| Ошибка | Суть | Как избежать |
|--------|------|--------------|
| **Утечка test в подбор** | гиперпараметры выбираются по test-метрике → test перестаёт быть честной оценкой | test трогать один раз; подбор — только на val |
| **Переобучение на валидации** | при большом $N$ и одном val-сете выбирается $\lambda$, случайно хороший на этом val | nested CV / отдельный «дев»-сет; репорт ± std по seed'ам; ограничить $N$ |
| **Нечестное сравнение методов** | сравнивать random vs BO при разном числе trial'ов или GPU-часов | фиксировать **одинаковый бюджет** (trial'ы или wall-clock) и одинаковое $\Lambda$ |
| **Линейная шкала для `lr`/`wd`** | почти не пробуются малые значения | log-uniform |
| **Один seed как «доказательство»** | разброс по seed'ам > разницы между конфигурациями | $\ge 3$ реплик, сравнение по средним |
| **Сравнение на разных $\Lambda$** | у random search границы шире/уже, чем у grid | единое пространство поиска для всех методов |
| **Игнор зашумлённости objective** | принятие решения по разнице в 0.1 % | стат-тест (напр., paired t-test, p<0.05) перед выводом |
| **Подбор архитектуры по test (NAS-leak)** | выбор размера/глубины по тестовой точности | архитектурный поиск — на val/dev |
---
## Итоговая сравнительная таблица методов
| Метод | Размерность $d$ | Бюджет (sample-eff.) | Параллелизм | Категориальные | Условные | Anytime |
|-------|:---:|:---:|:---:|:---:|:---:|:---:|
| Manual / Babysitting | низкая | низкая эфф. | нет | да (вручную) | да | да |
| Grid Search | низкая ($k^d$) | очень низкая | полный (embarrassingly) | да | плохо | нет |
| Random Search | высокая ✓ | низкая–средняя | полный ✓ | да | да | да |
| BO — GP | низкая–средняя | **высокая** ✓ | слабый (последоват.) | плохо | плохо | да |
| BO — TPE | средняя–высокая ✓ | высокая | средний | да ✓ | да ✓ | да |
| BO — SMAC (RF) | средняя–высокая | высокая | средний | да ✓ | да ✓ | да |
| CMA-ES | средняя (непрер.) | средняя | да (популяция) | плохо | плохо | да |
| Genetic Algorithms | средняя–высокая | низкая–средняя | да ✓ | да | да | да |
| PBT | средняя | высокая (reuse весов) | да ✓ | ограниченно | ограниченно | **да (расписание)** |
| Successive Halving | высокая | высокая ✓ | средний (синхр.) | да | да | да |
| Hyperband | высокая ✓ | высокая ✓ | хороший | да | да | **да** ✓ |
| ASHA | высокая ✓ | высокая | **массовый** ✓ | да | да | **да** ✓ |
| BOHB | высокая ✓ | **высокая** ✓ (BO+HB) | хороший ✓ | да ✓ | да ✓ | **да** ✓ |
| Gradient/hypergradient | очень высокая (непрер.) | высокая | слабый | **нет** | нет | частично |
**Anytime-свойство** — способность выдать разумный «лучший на текущий момент» результат при остановке в любой момент (важно при ограниченном/непредсказуемом бюджете). Им обладают random search, BO и особенно multi-fidelity (Hyperband/ASHA/BOHB), тогда как grid search anytime-свойством не обладает.
---
## Источники
1. [Bergstra J., Bengio Y. (2012). Random Search for Hyper-Parameter Optimization. JMLR 13:281305.](https://jmlr.org/papers/v13/bergstra12a.html)
2. [Bergstra J., Bardenet R., Bengio Y., Kégl B. (2011). Algorithms for Hyper-Parameter Optimization. NeurIPS 24:25462554.](https://www.researchgate.net/publication/216816964_Algorithms_for_Hyper-Parameter_Optimization)
3. [Srinivas N., Krause A., Kakade S., Seeger M. (2010). Gaussian Process Optimization in the Bandit Setting: No Regret and Experimental Design. ICML.](https://www.researchgate.net/publication/221345649_Gaussian_Process_Optimization_in_the_Bandit_Setting_No_Regret_and_Experimental_Design)
4. [Lindauer M. et al. (2022). SMAC3: A Versatile Bayesian Optimization Package for HPO. JMLR 23(54):19.](http://jmlr.org/papers/v23/21-0888.html)
5. [Jaderberg M. et al. (2017). Population Based Training of Neural Networks. arXiv:1711.09846.](https://arxiv.org/abs/1711.09846)
6. [Li L., Jamieson K., DeSalvo G., Rostamizadeh A., Talwalkar A. (2018). Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization. arXiv:1603.06560.](https://arxiv.org/abs/1603.06560)
7. [Li L. et al. (2020). A System for Massively Parallel Hyperparameter Tuning (ASHA). MLSys. arXiv:1810.05934.](https://arxiv.org/abs/1810.05934)
8. [Falkner S., Klein A., Hutter F. (2018). BOHB: Robust and Efficient Hyperparameter Optimization at Scale. ICML. arXiv:1807.01774.](https://arxiv.org/abs/1807.01774)
9. [Maclaurin D., Duvenaud D., Adams R.P. (2015). Gradient-based Hyperparameter Optimization through Reversible Learning. ICML. arXiv:1502.03492.](https://arxiv.org/abs/1502.03492)
10. [Akiba T. et al. (2019). Optuna: A Next-generation Hyperparameter Optimization Framework. KDD. arXiv:1907.10902.](https://arxiv.org/abs/1907.10902)
11. [Balandat M. et al. (2019). BoTorch / Ax: Bayesian Hyperparameter Optimization. arXiv:1912.05686.](https://arxiv.org/abs/1912.05686)