318 lines
36 KiB
Markdown
318 lines
36 KiB
Markdown
---
|
||
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:281–305](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:2546–2554](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):1–9](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:281–305.](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:2546–2554.](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):1–9.](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)
|