L1 и L2 регуляризации для линейной регрессии

В предыдущих статьях мы говорили об обобщении и переобучении. Мы видели, что даже когда мы добавляем столбец случайного шума к нашим данным, мы всё же можем улучшить наш показатель машинного обучения. В общем случае мы хотим, чтобы размерность нашего X была намного меньше количества наблюдений N. Другая возможная проблема заключается в том, что при определенных наборах данных размерность намного большее, чем количество наблюдений.

Что такое L1-регуляризация? Теория

Один из способов показать это наглядно – построить матрицу X. Мы хотим, чтобы наша матрица X была тонкой, когда N велико, а D – мало. В обратном же случае, когда матрица X широка, N мало, а D велико, и получается не очень хорошо, а нам нужно предпринять некоторые действия, чтобы избежать потенциальных проблем.

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

В основе L1-регуляризации лежит достаточно простая идея. Как и в случае L2-регуляризации, мы просто добавляем штраф к первоначальной функции затрат. Подобно тому, как в L2-регуляризации мы используем L2-нормирование для поправки весовых коэффициентов, в L1-регуляризации мы используем специальное L1-нормирование. L2-регуляризация называется также регрессией Риджа, а L1-регуляризация – лассо-регрессией.

J_{RIDGE} = \sum_{i=1}^{N} (y_n - \widehat y_n)^2 + \lambda \parallel w\parallel^2_2,

J_{LASSO} = \sum_{i=1}^{N} (y_n - \widehat y_n)^2 + \lambda \parallel w\parallel_1.

Прежде чем мы займёмся решением задачи, давайте рассмотрим распределение вероятности. Вы знаете, что экспонента отрицательного квадрата – это распределение Гаусса, поэтому при L2-регуляризации мы имели гауссово правдоподобие и гауссов приор для w. В данном же случае у нас больше нет гауссова приора по w.

Какое распределение имеет отрицательное абсолютное значение в экспоненте?

Это распределение Лапласа:

p(w) = \frac {\lambda}{2} exp (- \lambda |w|).

Итак, при L1-регуляризации мы вычисляем весовые коэффициенты, распределяющиеся по распределению Лапласа.

Посмотрим, как можно дальше решить задачу. Как вы знаете, далее мы всегда берём производную от функции затрат, приравниваем её к нулю и решаем относительно w. Так и сделаем.

J = (Y - X_W)^T (Y - X_W) + \lambda|w|,

J = Y^T Y - 2Y^T X_W + W^T X^T X_W + \lambda|w|,

\frac {\partial J} {\partial w} = - 2X^T Y + 2X^T X_W + \lambda sign (w) = 0.

Исследуем задачу после нахождения производной. Функция sign(x) возвращает единицу, если x>0,  минус единицу, если x<0, и нуль, если x=0. Поскольку значение не является функцией, мы не можем решить уравнение относительно w. Чтобы решить задачу, нам потребуется градиентный спуск. К счастью, мы уже знаем, как его применять.

Больше нам здесь делать нечего.

L1-регуляризация. Код

Сейчас по-кодим!  Мы напишем код, демонстрирующий использование L1-регуляризации.

Суть состоит в том, что мы сгенерируем данные таким образом, чтобы входная матрица X была «широкой», а Y будет зависеть лишь от нескольких факторов, а остальные будут лишь шумом. Мы используем L1-регуляризацию, чтобы найти разреженный набор весовых коэффициентов, которые установят полезные размеры X.

Установим количество наблюдений равным 50, размерность также установим равной 50, так что это широкая матрица, где X равномерно распределяется в районе нуля с разбросом от -5 до +5. Зададим также истинные весовые коэффициенты как [1, 0,5, -0,5], причём ещё три последних размерности не будут влиять на результат. Y = Xw плюс некоторый случайный шум. Это гауссов случайный шум, как и допущение при линейной регрессии.

N = 50

D = 50

X = (np.random.random((N, D) – 0.5)*10

true_w = np.array([1, 0.5, -0.5] + [0]*(D-3))

Y = X.dot(true_w) + np.random.randn(N)*0.5

Теперь совершим градиентный спуск. Установим значение коэффициента обучения равным 0,001, значение срока регуляризации равным 10 и пройдём цикл 500 раз.

costs = []

w = np.random.randn(D) / np.sqrt(D)

learning_rate = 0.001

l1 = 10.0

for t in xrange(500):

     Yhat = X.dot(w)

     delta = Yhat – Y

     w = w – learning_rate*(X.T.dot(delta) + l1*np.sign(w))

    mse = delta.dot(delta) / N

    costs.append(mse)

plt.plot(costs)

plt.show

print ‘’final w:’’, w

plt.plot(true_w, label=’true w’)

plt.plot(w, label=’w_map’)

plt.legend()

plt.show

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

Мы также видим, что истинное значение w очень близко к вычисляемому значению.

Что такое L2 регуляризация в машинном обучении? Теория

И так сейчас мы с вами обсудим методику, известную как L2-регуляризация, помогающая решить проблему переобученности модели. Суть в том, что чересчур тяжёлые весовые коэффициенты «отталкивают» нашу линию наилучшего соответствия, построенную на основе минимизации квадрата ошибок, от основной тендеции.

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

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

Суть состоит в том, что мы изменяем нашу первоначальную функцию, добавляя «штраф» на большие весовые коэффициенты. Для этого мы добавляем постоянную , умноженный на квадрат w:

J = \sum_{i=1}^{N} (y_n - \widehat y_n)^2 + \lambda |w|^2,

|w|^2 = w^T w = w^2_1 + w^2_2 + ... + w^2_D.

Пока что всё довольно просто.

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

exp (J) = [\prod_{{n=1}}^{N} exp [ - (y_n - w^T x_n)^2 ] ] exp [ - \lambda w^T w].

P (Y|X, w) = \prod_{{i=1}}^{N} \frac {1} {\sqrt {2\pi\sigma^2}}exp [- \frac {1} {2\sigma^2}(y_n - w^T x_n)^2].

Мы видим два гауссиана. Первый – тот же, что и был прежде. Второй гауссиан новый. В нём w является случайной величиной со средним значением, равным нулю, и дисперсией, равно единица на лямбду. Этот второй гауссиан мы называем приором. Он описывает w независимо от данных, так как, как легко убедиться, он не зависит от X или Y.

J_{OLD} \sim 1n P (Y|X,w),

J_{NEW} \sim 1n P (Y|X,w) - 1n P(w),

P(w|Y,X) = \frac {P (Y|X,w) P(w)} {P(Y|X)},

P(w|Y,X) \sim P(Y|X,w) P(w).

Вы можете здесь узнать правило Байеса. Действительно,

P(w|Y,X) называется апостериором, а этот метод – методом максимизации апостериора, сокращённо MAP. Это значит, что теперь мы ищем максимум апостериора, а не функции правдоподобия, как ранее.

Итак, теперь, когда мы разобрали некоторые теоретические основы L2-регуляризации, как же нам найти w? Точно так же, как и ранее – берём производную нашей новой функции затрат, приравниваем её к нулю и решаем относительно w. Прежде всего выпишем нашу функцию затрат в полной матричной форме.

J = (Y – Xw)T(Y – Xw) + λwTw,

J = YTY – 2YTXw + wTXTXw + λwTw.

Затем берём производную и приравниваем к нулю:

\frac {\partial J} {\partial w} = - 2X^T Y + 2X^T X_W + 2\lambda w = 0.

И решаем полученное уравнение относительно w.

(λI + XTX)w = XTY,

w = (λI + XTX)-1XTY

Наш результат аналогичен прежнему, за исключением наличия λ.

Подведём итоги. Одним из способов избежать переусложнения модели и её переобученности является L2-регуляризация, также известная под названием регрессии Риджа. Работает она так. Мы добавляем квадрат величины весовых коэффициентов, умноженный на константу λ, к нашей прежней квадратической функции погрешностей. Мы делаем это потому, что большое значение весовых коэффициентов являются признаком переобученности. Далее мы решаем уравнение относительно w, беря производную и приравнивая её к нулю. Это и есть метод максимизации апостериора (MAP), так как мы находим максимум апостериора w для данных

 L2-регуляризация. Код

Сейчас  мы продемонстрируем L2-регуляризацию в коде.

Начнём с импорта библиотек NumPy и Matplotlib.

import numpy as np

import matplotlib as plt

Установим количество опытов равным 50. Сгенерируем данные таким образом, чтобы у нас было 50 точек, равномерно распределённых между 0 и 10. Установим Y=0,5x плюс некоторый случайный шум.

N = 50.

X = np.linspace(0, 10, N)

Y = 0.5X + np.random.randn(N)

Теперь вручную создадим пару «холмов». Установим значение первой конечной точки на 30 больше, чем она есть, и значение второй конечной точки тоже на 30 больше, чем она есть.

Y[-1] += 30

Y[-2] += 30

Следующее – изобразим наши данные графически. Вы уже знаете, как это делается.

plt.scatter(X, Y)

plt.show()

Теперь найдём решение для весовых коэффициентов. Добавим условия смещения.

X = np.vstack([np.ones(N), X]).T

И найдём максимум функции правдоподобия. Назовём эту переменную w_ml. Вы уже знаете, как его вычислять. Сразу же изобразим графически оригинальные данные и максимум функции правдоподобия.

w_ml = np.linalg.solve(X.T.dot(X), X.T.dot(Y))

Yhat_ml = X.dot(w_ml)

plt.scatter(X[:,1], Y)

plt.plot(X[:,1], Yhat_ml)

plt.show()

Теперь найдём решение для L2-регуляризации. Установим штраф, равным 1000 и снова отобразим результат графически.

l2 = 1000.0

w_map = np.linalg.solve(l2*np.eye(2) + X.T.dot(X), X.T.dot(Y))

Yhat_map = X.dot(w_map)

plt.scatter(X[:,1], Y)

plt.plot(X[:,1], Yhat_ml, label=’maximum likehood’)

plt.plot(X[:,1], Yhat_map, label=’map’)

plt.legend()

plt.show()

Теперь запустим программу и посмотрим, что получилось.

На первой диаграмме наши входные данные с нашим «холмом».

На второй диаграмме изображено решение для максимума функции максимального правдоподобия.

Заметьте, что оно не очень удачно, так как тянется к «холму». Теперь посмотрим решение для максимизации апостериора и решение для максимального правдоподобия вместе. Обратите внимание, что МАР соответствует тенденции намного больше, чем функция максимального правдоподобия.

 Отличия между L1 и L2-регуляризациями

Сейчас  мы рассмотрим отличия между L1 и L2-регуляризациями и покажем, как эти отличия появляются вследствие математических выкладок. Мы начнем сразу с различий, а затем объясню, вследствие чего они возникают.

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

Предлагаем  обсудить, почему так получается.

Обратите внимание, что оба метода помогают улучшить обобщение и ошибки теста, поскольку не допускают переобученния модели из-за шума в данных.

  • L1-регуляризация реализует это путём отбора наиболее важных факторов, которые сильнее всего влияют на результат. Для простоты можете считать, что факторы с малой величиной влияния на конечный результат фактически «помогают» вам предсказывать лишь шум в наборе обучающих данных.
  • L2-регуляризация предотвращает переобученность модели путём запрета на непропорционально большие весовые коэффициенты.Для начала пройдёмся по уже существующим и использующимся методикам. Их стоит изучить, поскольку мы считаем, что они неадекватны и отвлекают много ресурсов. Контурный график отрицательных логарифмов показывает различия между каждым из типов регуляризации, и хотя это и не слишком полезно для понимания сути, будет замечательно, если вы его изучите.Что на самом деле полезно – представить себе модель с одномерным весовым коэффициентом. При L2-регуляризации дополнительный член является квадратичной функцией, при L1-регуляризации – модулем. Что здесь действительно важно – производная функции. Производная, конечно, является ключевой, поскольку градиентный спуск в основном движется в направлении производной.При квадратичном члене чем ближе вы находитесь к нулю, тем меньшей становится ваша производная, пока также не приблизится к нулю. Поэтому при L2-регуляризации когда ваша величина w уже мала, дальнейший градиентный спуск уже её сильно не изменит. В случае модуля производная является константой с абсолютной величиной, равной единице. Формально в нуле она не определена, но мы считаем её также равной нулю.Поэтому при L1-регуляризации градиентный спуск будет стремиться к нулю с постоянной скоростью, а достигнув его, там и останется. Вследствие этого L2-регуляризация способствует малой величине весовых коэффициентов, а L1-регуляризация способствует их равенству нулю, тем самым провоцируя разрежённость.

    И наконец, обратите внимание, что вы можете включить в свою модель сразу и L1, и L2-регуляризации.

    Такая модель даже имеет специальное название – ElasticNet. Звучит, конечно, довольно причудливо, но на самом деле это просто добавление и штрафа L1-регуляризации, и штрафа L2-регуляризации к вашей функции затрат.

    JRIDGE = J + λ2|w|2,

    JLASSO = J +λ1|w|,

    JELASTICNET = J + λ1|w| + λ2|w|2.

Андрей Никитенко
Андрей Никитенко
Задать вопрос эксперту
Понравилась статья? Поделить с друзьями:
Комментариев: 2
  1. Сергей

    Что такое L1-регулиризация? Теория
    Очепятка

    1. adminCraft (автор)

      Большое спасибо что указали на ошибку!

      Скоро будет обновление контента на сайте.

      Пожалуйста рекомендуйте нас среди ваших коллег, и публикуйте ссылки на наш сайт там где будет это уместно.

      Такие действия помогут нам в нашем развитии)

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Share via
Copy link