Sobes.tech
Middle — Senior

Почему L1-регуляризация зануляет часть весов, а L2 — нет?

sobes.tech AI

Ответ от нейросети

L1-регуляризация (Lasso) добавляет к функции потерь сумму абсолютных значений весов ( \lambda \sum |w_i| ), а L2-регуляризация (Ridge) — сумму квадратов весов ( \lambda \sum w_i^2 ).

Математически:

  • L1-регуляризация приводит к разрывной производной в нуле (не дифференцируема в 0), что способствует занулению некоторых весов, так как оптимизация "стремится" к точкам, где веса равны ровно нулю.
  • L2-регуляризация имеет гладкую квадратичную форму, производная равна (2\lambda w_i), что приводит к постепенному уменьшению весов, но не к их точному занулению.

Геометрически, при оптимизации с ограничением L1-штрафа область допустимых решений имеет форму ромба с острыми углами, что увеличивает вероятность попадания решения в точки с нулевыми координатами (зануление весов). В случае L2-штрафа область — круглая, что не способствует занулению.

Пример:

\text{L1 penalty: } \lambda |w| \rightarrow \text{производная не определена в } w=0
\text{L2 penalty: } \lambda w^2 \rightarrow \text{производная } 2\lambda w

Поэтому L1-регуляризация используется для отбора признаков, а L2 — для сглаживания весов.

sobes.tech AI

Ответ от нейросети

L1-регуляризация (Lasso) добавляет к функции потерь сумму абсолютных значений весов (||w||₁), что приводит к появлению угловых точек в оптимизационной поверхности. Это способствует тому, что оптимальное решение часто имеет ровно нулевые значения для некоторых весов, то есть зануляет часть из них, обеспечивая разреженность модели.

L2-регуляризация (Ridge) добавляет сумму квадратов весов (||w||₂²), что создает гладкую параболическую поверхность без углов. В результате веса уменьшаются, но редко становятся точно нулём, так как оптимизация стремится к малым, но ненулевым значениям.

Пример:

import numpy as np
from sklearn.linear_model import Lasso, Ridge

X = np.array([[1, 2], [3, 4], [5, 6]])
y = np.array([1, 2, 3])

lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
print('L1 weights:', lasso.coef_)

ridge = Ridge(alpha=0.1)
ridge.fit(X, y)
print('L2 weights:', ridge.coef_)

Здесь L1 может занулить некоторые веса, а L2 — только уменьшить их.