Почему модели начинают переусложнять зависимость
Когда модель получает свободу подстроиться под train-данные, она почти всегда использует ее слишком активно. Это особенно заметно в линейных моделях с большим числом признаков: веса начинают расти, модель цепляется за слабые корреляции и на обучающей выборке выглядит красиво, а на новых данных ведет себя хуже. Регуляризация нужна именно для того, чтобы ограничить эту тягу к переусложнению.
L2-регуляризация добавляет к функции потерь штраф за слишком большие веса. Тем самым она говорит модели: объясняй данные, но не делай это ценой слишком агрессивных коэффициентов. Это не запрет на обучение, а дисциплина обучения.
Как читать формулу L2-регуляризации
$$ J_{reg}(w) = J(w) + \lambda \sum_{j=1}^{m} w_j^2 $$К обычной функции потерь добавляется штраф за квадрат величины весов. Чем больше коэффициенты, тем сильнее модель платит за сложность.
J_{reg}(w)— регуляризованная функция потерьJ(w)— исходная функция потерь без штрафа\lambda— сила регуляризацииw_j— вес j-го признакаm— число признаков или параметров
В геометрическом смысле L2-регуляризация стремится держать вектор весов ближе к центру. Если представить пространство параметров, то модель ищет компромисс: не только маленькую ошибку, но и умеренную длину вектора коэффициентов. Именно поэтому L2 часто связывают с идеей smooth и устойчивых решений.
Почему это полезно именно в ML
В машинном обучении L2 особенно полезна там, где признаков много, а сигнал распределен неравномерно. Например, в линейной регрессии, логистической регрессии, некоторых нейросетевых настройках. Регуляризация делает решение устойчивее к шуму, снижает переобучение и помогает модели не перегибать зависимость на train-данных.
Важно понимать, что L2 не «исправляет» плохие признаки сама по себе. Если у тебя data leakage, плохой split или неправильная метрика, регуляризация это не спасет. Она работает внутри уже более-менее корректного pipeline.
Как выглядит это в Python
import pandas as pd
from sklearn.linear_model import Ridge
data = pd.DataFrame({
'x1': [1, 2, 3, 4, 5, 6],
'x2': [2, 4, 6, 8, 10, 12],
'y': [3, 5, 7, 9, 11, 13]
})
X = data[['x1', 'x2']]
y = data['y']
model = Ridge(alpha=1.0)
model.fit(X, y)
print({'coef': model.coef_.round(3).tolist(), 'intercept': round(model.intercept_, 3)})В scikit-learn параметр alpha у Ridge как раз и отвечает за силу L2-регуляризации. Если увеличить его слишком сильно, модель станет слишком осторожной. Если сделать слишком маленьким, штраф почти исчезнет. Поэтому реальная работа с L2 — это всегда поиск разумного компромисса между качеством и устойчивостью.