Почему 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 — только уменьшить их.