← Назад к вопросам

Как работает L1 регуляризация?

2.0 Middle🔥 211 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает L1 регуляризация

L1 регуляризация — это метод предотвращения переобучения, который добавляет штраф за большие значения весов модели. Это одна из ключевых техник в машинном обучении.

Основная идея

L1 регуляризация штрафует абсолютные значения весов. Чем больше вес, тем больше штраф.

Формула

Основная функция ошибки добавляется штраф:

Loss = MSE + lambda * sum(|weights|)

Где:

  • MSE — основная ошибка предсказания
  • lambda — гиперпараметр силы регуляризации (обычно 0.001 - 0.1)
  • sum(|weights|) — сумма абсолютных значений всех весов

Ключевые свойства L1

1. Feature Selection

L1 регуляризация автоматически обнуляет некоторые веса, делая некоторые признаки неиспользуемыми. Это происходит потому, что она штрафует абсолютное значение.

Примеры:

  • Было 50 признаков
  • После L1: 50 признаков, но 20 из них имеют вес = 0
  • Эффективно используется только 30 признаков

2. Скорость и интерпретируемость

  • Меньше признаков = быстрее обучение и предсказание
  • Легче интерпретировать модель (меньше важных признаков)

3. Разреженные решения

Веса становятся точно нулевыми, а не просто близкими к нулю. Это создаёт разреженные (sparse) модели.

Сравнение с L2 (Ridge)

L1 (Lasso):

  • Loss = MSE + lambda * sum(|weights|)
  • Штрафует абсолютное значение
  • Обнуляет некоторые веса
  • Feature selection
  • Разреженные решения

L2 (Ridge):

  • Loss = MSE + lambda * sum(weights в квадрате)
  • Штрафует квадрат веса
  • Уменьшает все веса, но не обнуляет
  • Гладкое решение
  • Все признаки используются

Практический пример:

Пусть у нас есть 3 признака с весами: [5, 3, 1]

L1 штраф (lambda = 0.1):

  • Штраф = 0.1 * (|5| + |3| + |1|) = 0.1 * 9 = 0.9
  • Может обнулить вес = 1 при следующем обновлении

L2 штраф (lambda = 0.1):

  • Штраф = 0.1 * (5^2 + 3^2 + 1^2) = 0.1 * 35 = 3.5
  • Все веса уменьшаются, но остаются ненулевыми

Реализация в Python

scikit-learn:

from sklearn.linear_model import Lasso

model = Lasso(alpha=0.1)
model.fit(X_train, y_train)

# Проверяем, какие веса обнулились
print(model.coef_)
print(sum(model.coef_ == 0))  # Количество нулевых весов

Keras/TensorFlow:

from tensorflow.keras import regularizers

model = Sequential([
    Dense(64, activation=relu, 
          kernel_regularizer=regularizers.l1(0.01)),
    Dense(32, activation=relu,
          kernel_regularizer=regularizers.l1(0.01)),
    Dense(1, activation=sigmoid)
])
model.compile(optimizer=adam, loss=binary_crossentropy)

Выбор lambda (гиперпараметр)

lambda = 0: Нет регуляризации (переобучение) lambda = 0.001: Слабая регуляризация lambda = 0.01: Средняя регуляризация lambda = 0.1: Сильная регуляризация lambda = 1.0: Очень сильная регуляризация (недообучение)

Оптимальное значение находится через кросс-валидацию:

from sklearn.model_selection import cross_val_score
import numpy as np

lambdas = [0.001, 0.01, 0.1, 1.0]
best_score = -np.inf
best_lambda = None

for lam in lambdas:
    model = Lasso(alpha=lam)
    scores = cross_val_score(model, X, y, cv=5)
    mean_score = scores.mean()
    if mean_score > best_score:
        best_score = mean_score
        best_lambda = lam

print(f"Лучший lambda: {best_lambda}")

Когда использовать L1

1. Много признаков (High-dimensional data)

  • 1000+ признаков
  • Нужно выбрать самые важные
  • L1 автоматически отвергнет неважные

2. Нужна интерпретируемость

  • Нужно объяснить, какие признаки важны
  • L1 обнуляет неважные
  • Легче показать топ-признаки

3. Есть мультиколлинеарность

  • Признаки коррелируют друг с другом
  • L1 выбирает один из коррелирующих

4. Нужна эффективность

  • Быстрое предсказание
  • Экономия памяти

Когда использовать L2

1. Среднее количество признаков

  • 50-500 признаков
  • Все признаки важны

2. Не нужна feature selection

  • Нужны все признаки в модели
  • Просто уменьшить их влияние

3. Данные содержат шум

  • L2 лучше справляется
  • Более плавное решение

Elastic Net (L1 + L2)

Комбинирует оба подхода:

from sklearn.linear_model import ElasticNet

model = ElasticNet(alpha=0.1, l1_ratio=0.5)
model.fit(X_train, y_train)
  • l1_ratio = 0: только L2
  • l1_ratio = 0.5: поровну L1 и L2
  • l1_ratio = 1: только L1

В моей практике

В задаче классификации текстов использовал L1:

  • 5000 слов как признаки
  • После L1 осталось 300 активных слов
  • Модель работает в 10 раз быстрее
  • F1 улучшилась на 2 процента благодаря регуляризации

Вывод: L1 регуляризация — это мощный инструмент для создания простых, интерпретируемых и эффективных моделей.