Регуляризация
Коротко
Definition
Регуляризация — это набор методов, которые ограничивают сложность модели, чтобы уменьшить переобучение и улучшить качество на новых данных.
Регуляризация помогает модели не просто запомнить обучающую выборку, а выучить более устойчивые закономерности.
Главная идея:
- сложная модель может слишком хорошо подстроиться под train-данные;
- это снижает ошибку на train, но ухудшает качество на test;
- регуляризация добавляет ограничения, шум или штрафы;
- модель становится менее гибкой, но лучше обобщает.
Регуляризация обычно снижает variance модели ценой возможного роста bias.
Интуиция
Переобученная модель похожа на студента, который выучил ответы на конкретные задачи, но не понял общий принцип. На знакомых примерах он отвечает идеально, а на новых ошибается.
Регуляризация мешает модели слишком точно подстраиваться под случайные детали обучающей выборки.
Это можно сделать разными способами:
- штрафовать слишком большие веса;
- случайно отключать нейроны;
- добавлять шум;
- увеличивать разнообразие данных;
- ограничивать глубину деревьев;
- использовать early stopping;
- нормализовать или стабилизировать обучение.
Регуляризация — это не один конкретный алгоритм, а общий принцип контроля сложности модели.
Основные идеи
L1 и L2-регуляризация
Один из самых классических способов регуляризации — добавить штраф к функции потерь.
Обычная функция потерь:
Регуляризованная функция потерь:
где:
- — исходная ошибка модели;
- — штраф за сложность;
- — сила регуляризации.
L1-регуляризация
L1-регуляризация добавляет штраф за сумму модулей весов:
Итоговая функция потерь:
L1-регуляризация может занулять веса. Поэтому она иногда работает как отбор признаков.
Пример: Lasso regression.
L2-регуляризация
L2-регуляризация добавляет штраф за сумму квадратов весов:
Итоговая функция потерь:
L2-регуляризация обычно не зануляет веса полностью, но делает их меньше и стабильнее.
Пример: Ridge regression.
L1 и L2-нормы
Названия L1 и L2 происходят от норм вектора.
L1-норма:
L2-норма:
На практике:
- L1 чаще приводит к разреженным решениям;
- L2 чаще приводит к маленьким, но ненулевым весам;
- Elastic Net объединяет L1 и L2.
Weight decay
Weight decay — это регуляризация весов, особенно часто используемая в нейросетях.
Идея: во время обучения большие веса штрафуются, поэтому модель предпочитает более простые решения.
Для обычного SGD L2-регуляризация и weight decay часто выглядят очень похоже. В современных оптимизаторах вроде AdamW weight decay обычно реализуют отдельно от градиента loss, чтобы регуляризация работала корректнее.
Интуитивно weight decay говорит модели:
Используй веса только тогда, когда они действительно нужны. Не делай их слишком большими без необходимости.
Dropout
Dropout — это техника регуляризации нейросетей, при которой во время обучения случайно зануляется часть активаций.
Если вероятность dropout равна , то на каждой итерации часть нейронов временно отключается.
Это заставляет модель:
- не полагаться на один конкретный нейрон;
- распределять информацию по разным признакам;
- учить более устойчивые представления;
- вести себя как приближённый ансамбль подсетей.
Во время inference dropout обычно выключается.
Dropout особенно часто использовался в полносвязных слоях и старых CNN. В современных архитектурах его часто комбинируют с normalization, residual connections и weight decay.
Аугментация данных
Аугментация данных — это способ увеличить разнообразие обучающей выборки без сбора новых данных.
Для изображений можно использовать:
- повороты;
- отражения;
- обрезки;
- изменение яркости;
- шум;
- цветовые искажения.
Для текста:
- замена слов;
- back-translation;
- удаление или перестановка токенов;
- paraphrasing.
Для временных рядов:
- добавление шума;
- масштабирование;
- сдвиг по времени;
- случайные окна.
Главное правило: аугментация не должна менять правильную метку.
Если перевернуть изображение кота, оно остаётся котом. Но если перевернуть медицинский снимок или химическую структуру без понимания предметной области, можно получить некорректный пример.
Early stopping
Early stopping — это остановка обучения, когда качество на validation-наборе перестаёт улучшаться.
Идея:
- сначала train loss и validation loss уменьшаются;
- потом модель продолжает улучшаться на train;
- но validation loss начинает расти;
- это признак переобучения.
Early stopping выбирает модель не в конце обучения, а в момент лучшего validation-качества.
Это простой и очень практичный вид регуляризации.
Ограничение сложности модели
Регуляризация может быть не только штрафом в loss, но и ограничением архитектуры.
Примеры:
- ограничить глубину дерева решений;
- увеличить
min_samples_leaf; - уменьшить число параметров нейросети;
- уменьшить размер embedding;
- использовать меньше слоёв;
- использовать bottleneck;
- ограничить степень полинома;
- использовать pruning.
Чем меньше модель способна запомнить случайный шум, тем выше шанс, что она выучит устойчивый сигнал.
Батч-нормализация как регуляризация
Батч-нормализация в первую очередь нужна для стабилизации обучения, но иногда даёт регуляризующий эффект.
Причина: статистики batch mean и batch variance немного шумят от батча к батчу. Этот шум может мешать модели слишком точно подстраиваться под отдельные обучающие примеры.
Но важно: batch normalization не стоит понимать только как регуляризацию. Её основная роль — стабилизировать распределения активаций и облегчать обучение глубоких сетей.
Когда использовать
Регуляризацию стоит использовать, когда:
- train-качество хорошее, а validation/test-качество заметно хуже;
- модель слишком сложная для размера данных;
- данных мало;
- есть много признаков;
- признаки коррелируют;
- нейросеть быстро переобучается;
- модель имеет большие веса;
- качество нестабильно между разными разбиениями данных.
Типичные решения:
- для линейных моделей — L1, L2, Elastic Net;
- для нейросетей — weight decay, dropout, augmentation, early stopping;
- для деревьев — ограничение глубины, min samples leaf, subsampling;
- для бустинга — learning rate, early stopping, subsampling, ограничения на деревья.
Когда не использовать
Регуляризация может навредить, если:
- модель и так недообучается;
- train-ошибка высокая;
- модель слишком простая;
- регуляризация слишком сильная;
- данные требуют сложной зависимости;
- штраф конфликтует с предметной задачей.
Слишком сильная регуляризация приводит к underfitting: модель становится слишком простой и плохо работает даже на обучающих данных.
Поэтому регуляризацию нужно подбирать по validation-качеству, а не добавлять «чем больше, тем лучше».
Минимальный пример
Пример L2-регуляризации в scikit-learn через Ridge regression:
import numpy as np
from sklearn.linear_model import Ridge
X = np.array([
[1.0, 2.0],
[2.0, 3.0],
[3.0, 4.0],
[4.0, 5.0],
])
y = np.array([2.0, 3.0, 4.0, 5.0])
model = Ridge(alpha=1.0)
model.fit(X, y)
print(model.coef_)
print(model.intercept_)Пример weight decay в PyTorch:
import torch
from torch import nn
model = nn.Linear(10, 1)
optimizer = torch.optim.AdamW(
model.parameters(),
lr=1e-3,
weight_decay=1e-2,
)В первом примере alpha управляет силой L2-регуляризации. Во втором примере weight_decay штрафует большие веса нейросети.