Модуль IV·Статья I·~3 мин чтения

Выпуклая оптимизация: методы первого порядка

Выпуклая оптимизация для ML

Превратить статью в подкаст

Выберите голоса, формат и длину — AI запишет аудио

Выпуклая оптимизация в машинном обучении

Многие задачи ML имеют выпуклую структуру: линейная регрессия, логистическая регрессия, SVM, LASSO, Ridge, метод опорных векторов. Для таких задач гарантирован глобальный оптимум, и существует богатая теория эффективных алгоритмов. Знание выпуклой оптимизации — фундамент понимания того, «почему работает» обучение ML-моделей.

Выпуклые функции и задачи

Определение выпуклости: Функция f: ℝⁿ → ℝ выпуклая, если для всех x, y ∈ dom(f) и α ∈ [0,1]:

f(αx + (1−α)y) ≤ αf(x) + (1−α)f(y)

Геометрически: хорда между любыми двумя точками лежит выше графика. Следствие: локальный минимум = глобальный.

L-гладкость: f дважды дифференцируема с ||∇²f(x)|| ≤ L (наибольшее собственное значение гессиана ограничено). Эквивалентно: ||∇f(x) − ∇f(y)|| ≤ L||x−y|| — градиент не меняется слишком быстро. Следствие (descent lemma):

f(y) ≤ f(x) + ∇f(x)ᵀ(y−x) + L/2||y−x||²

μ-сильная выпуклость: f(y) ≥ f(x) + ∇f(x)ᵀ(y−x) + μ/2||y−x||². Означает: функция «не слишком плоская» — квадратичная нижняя граница. Условное число задачи κ = L/μ — чем больше, тем сложнее оптимизировать.

Методы градиентного спуска

Градиентный спуск (GD): xₜ₊₁ = xₜ − (1/L)∇f(xₜ). Оптимальный шаг для L-гладкой: α = 1/L.

Теорема сходимости:

  • Выпуклая, L-гладкая: f(x_T) − f* ≤ L||x₀−x*||²/(2T). Сходимость: O(1/T).
  • μ-сильно выпуклая, L-гладкая: ||xₜ−x*||² ≤ (1−μ/L)ᵗ ||x₀−x*||². Сходимость: O(exp(−t/κ)).

Ускорение Нестерова (1983): добавляет «импульс» из предыдущей итерации:

yₜ = xₜ + (t−1)/(t+2)·(xₜ−xₜ₋₁) (momentum step) xₜ₊₁ = yₜ − (1/L)∇f(yₜ) (gradient step)

Сходимость: O(1/t²) для выпуклой — оптимально для методов первого порядка! Удвоение t уменьшает ошибку в 4 раза (vs 2 раза для GD).

Проксимальные методы

Многие задачи ML имеют вид: min_x f(x) + g(x), где f — гладкая выпуклая (например, MSE), g — негладкая выпуклая (например, λ||x||₁ для LASSO).

Проксимальный оператор: prox_{αg}(v) = argmin_x {(1/2)||x−v||² + αg(x)}. Имеет аналитическое решение для многих g:

  • g(x) = λ||x||₁: prox = sign(v)·max(|v|−αλ, 0) (мягкое пороговое, soft-thresholding)
  • g(x) = λ||x||₂: prox = max(1−αλ/||v||, 0)·v (проекция на шар)
  • g = I_C (индикатор выпуклого множества C): prox = проекция на C

ISTA (Iterative Shrinkage-Thresholding Algorithm):

xₜ₊₁ = prox_{αg}(xₜ − α∇f(xₜ))

Шаг 1: градиентный шаг по f. Шаг 2: проксимальный шаг по g. Сходимость: O(1/t) для выпуклой.

FISTA: Нестеровское ускорение для ISTA → O(1/t²). Де-факто стандарт для LASSO с теоретическими гарантиями.

ADMM: декомпозиция задачи

Задача с ограничением: min f(x) + g(z), при Ax + Bz = c. Примеры: distributed ML, portfolio optimization.

Augmented Lagrangian: L_ρ(x,z,y) = f(x) + g(z) + yᵀ(Ax+Bz−c) + (ρ/2)||Ax+Bz−c||²

ADMM-шаги: x^{k+1} = argmin_x L_ρ(x, z^k, y^k) z^{k+1} = argmin_z L_ρ(x^{k+1}, z, y^k) y^{k+1} = y^k + ρ(Ax^{k+1} + Bz^{k+1} − c)

Каждый шаг — простая оптимизация (часто аналитическая). Параллелизируется: x-шаги независимы по блокам. Используется в распределённой оптимизации, portfolio selection с ограничениями.

Координатный спуск

Идея: вместо оптимизации по всем переменным сразу — оптимизируем по одной переменной, фиксируя остальные: min_{x_j} f(x₁,...,x_{j−1}, x_j, x_{j+1},...,x_n).

Для LASSO аналитически: x_j^* = (1/n)soft-thresh_{λ}(zⱼ), где zⱼ = xⱼ − (Aᵀ(Ax−y))ⱼ. Случайный координатный спуск (randomized CD): на каждой итерации выбираем j случайно → O(n/T) сходимость. Используется в liblinear (SVM), word2vec.

Численный пример

LASSO: y = Xβ* + ε, n=100 наблюдений, p=500 признаков, истинный β* — 10-разреженный. λ = 0.1·||Xᵀy||_∞.

ISTA: 1000 итераций, α=1/L, финальная MSE = 0.023. FISTA: те же 1000 итераций, MSE = 0.0018 (в 13 раз лучше). Координатный спуск (sklearn): 200 итераций, MSE = 0.0015 (быстрее на практике). ISTA находит 12 ненулевых коэффициентов (2 лишних), FISTA и CD — ровно 10.

Задание: Реализуйте ISTA и FISTA для LASSO на synthetically generated data (X ∈ ℝ^{100×500}, s=20 ненулевых). Постройте кривые сходимости (log(f(xₜ)−f*) vs t) для обоих методов. Теоретически FISTA сходится как O(1/t²), ISTA — O(1/t). Проверьте теоретические оценки эмпирически. Реализуйте ADMM для Ridge regression с sum ограничением Σxⱼ = 1.

§ Акт · что дальше