ai_learning/modules/04_optimization/notes/03_regularization_bias_variance.md

8.0 KiB
Raw Blame History

3. L1, L2, Elastic Net, early stopping и bias–variance

Регуляризация сознательно ограничивает подгонку train-данных, чтобы уменьшить ошибку на новых объектах.

Мотивация

Гибкая модель может запомнить шум: train loss падает, validation loss растёт. Регуляризация кодирует предпочтение простых параметров, а early stopping ограничивает время подгонки. Цена — дополнительное смещение; выгода — меньшая чувствительность к конкретной выборке.

Интуиция

L2 плавно сжимает все веса, особенно большие. L1 имеет излом в нуле и способна занулять коэффициенты. Elastic Net сочетает разреженность L1 со стабильностью L2 при коррелированных признаках. Early stopping прекращает движение до того, как модель подстроится под мелкие особенности train. Bias–variance — не выбор «одного добра»: оптимум балансирует систематическую ошибку, изменчивость и неустранимый шум.

Определения и обозначения

Для параметров \mathbf w\in\mathbb R^d:


J(\mathbf w)=\hat R(\mathbf w)+
\lambda_1\|\mathbf w\|_1+
\frac{\lambda_2}{2}\|\mathbf w\|_2^2.

L1: \lambda_1>0,\lambda_2=0; L2: наоборот; Elastic Net: обе положительны. Смещение b обычно не штрафуют. В sklearn параметр alpha может обозначать общую силу штрафа, а l1_ratio — долю L1; соглашения о множителях различаются.

Вывод ключевых формул

Для ridge-регрессии


J(\mathbf w)=\frac1{2n}\|\mathbf X\mathbf w-\mathbf y\|_2^2+
\frac\lambda2\|\mathbf w\|_2^2.

Градиент:


\nabla J=\frac1n\mathbf X^\top(\mathbf X\mathbf w-\mathbf y)+\lambda\mathbf w.

Приравнивая нулю,


(\mathbf X^\top\mathbf X+n\lambda\mathbf I)\mathbf w
=\mathbf X^\top\mathbf y.

Добавка к диагонали улучшает обусловленность и даёт единственное решение при \lambda>0, но вычислять обратную матрицу явно не следует — используют линейный решатель.

Для одномерного L1 и квадратичной потери


\min_w\frac12(w-z)^2+\lambda|w|.

При w>0: w-z+\lambda=0, значит w=z-\lambda, допустимо при z>\lambda. При w<0: w=z+\lambda, допустимо при z<-\lambda. В нуле субградиент \partial|w|=[-1,1]. Итого soft-threshold:


w^\star=\operatorname{sign}(z)\max(|z|-\lambda,0).

Это объясняет точные нули L1.

Для квадратичной ошибки прогноза в точке \mathbf x, усреднённой по возможным train-выборкам:


\mathbb E[(Y-\hat f(\mathbf x))^2]
=\sigma_\varepsilon^2+
(\mathbb E\hat f(\mathbf x)-f(\mathbf x))^2+
\mathbb E[(\hat f(\mathbf x)-\mathbb E\hat f(\mathbf x))^2].

Слагаемые — шум, bias² и variance.

Разобранный пример

Дано. Ортогональный признак даёт ненормированный коэффициент z=0{,}8, \lambda=0{,}3.

Решение. L1: w=0{,}8-0{,}3=0{,}5. Для сопоставимой одномерной L2-задачи \frac12(w-z)^2+\frac\lambda2w^2: w-z+\lambda w=0, поэтому w=z/(1+\lambda)=0{,}8/1{,}3\approx0{,}615.

Если z=0{,}2, L1 даст ноль, L2 — 0{,}154. Проверка: L1 создаёт разреженность, L2 только сжимает конечный коэффициент.

Связь с Python и sklearn

import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import ElasticNet, Ridge
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error

X, y = make_regression(n_samples=600, n_features=30, n_informative=6,
                       noise=20, random_state=42)
X_tr, X_va, y_tr, y_va = train_test_split(
    X, y, test_size=0.3, random_state=42
)

for model in [
    Ridge(alpha=10.0),
    ElasticNet(alpha=0.1, l1_ratio=0.7, max_iter=20_000)
]:
    pipe = make_pipeline(StandardScaler(), model)
    pipe.fit(X_tr, y_tr)
    pred = pipe.predict(X_va)
    coef = pipe[-1].coef_
    print(type(model).__name__, mean_squared_error(y_va, pred),
          "zeros", np.sum(np.isclose(coef, 0)))

Масштабирование находится внутри pipeline, поэтому оценивается только по train. alpha выбирают кросс-валидацией, а test оставляют для единственной итоговой оценки.

Early stopping

После каждой эпохи измеряют validation loss, сохраняют лучшие параметры и останавливаются, если улучшения больше min_delta нет patience эпох. Возвращать нужно лучшую сохранённую модель, а не последнюю. Validation-набор участвует в выборе времени остановки и больше не является независимым test. В линейных итерационных задачах ранняя остановка подавляет направления, которые обучаются медленно, и действует как неявная регуляризация.

Типичные ошибки и ограничения

  • Применять штраф до масштабирования: коэффициенты разных единиц штрафуются несопоставимо.
  • Штрафовать intercept без причины.
  • Выбирать \lambda по test или preprocessing до разбиения — leakage.
  • Считать L1 надёжным селектором среди сильно коррелированных признаков; выбор может быть нестабилен.
  • Отождествлять малый коэффициент с малой причинной важностью.
  • Останавливать по шумной train-метрике или не восстанавливать лучший checkpoint.
  • Думать, что регуляризация исправляет неверные признаки, сдвиг распределения или плохую разметку.

Краткое резюме

  • L2 стабильно сжимает веса, L1 создаёт точные нули, Elastic Net сочетает свойства.
  • Ridge добавляет \lambda\mathbf I к кривизне.
  • Early stopping требует отдельной validation-метрики и сохранения лучшей модели.
  • Сила регуляризации выбирает баланс bias–variance по данным.

Связанные материалы