Демистификация машин опорных векторов
Начать работу с машинным обучением может быть сложно, особенно если у вас есть огромное количество ресурсов, но нет плана действий. Цель этой серии — от самых основ машинного обучения до его продвинутых аспектов. Машины опорных векторов являются одними из основных и важных алгоритмов машинного обучения наряду с линейной регрессией и логистической регрессией. Если у вас еще нет интуитивных представлений о линейной и логистической регрессии, я предлагаю вам сначала пройтись по ним. Статьи об этом же из этой серии можно найти здесь:
Однако нашей основной темой для рассмотрения в этом посте будут машины опорных векторов (SVM). Этот пост направлен на то, чтобы разобрать SVM и углубиться в то, как они работают, после чего мы углубимся в код для SVM в следующем посте.
Давайте начнем тогда!
SVM — это контролируемый алгоритм машинного обучения, который означает, что для данного набора данных мы уже знаем, как должен выглядеть правильный вывод, или, другими словами, у нас уже есть представление о взаимосвязи между вводом и выводом.
SVM также изучают нелинейные функции, но по сравнению с логистической регрессией и некоторыми другими методами они изучают более чистую или более надежную границу принятия решений, также известную как гиперплоскость. SVM пытается разделить разные классы с большим отрывом. Подождите маржу!?
Давайте сломаем это.
При попытке выполнить классификацию мы на самом деле ищем границу решения, которую мы будем называть гиперплоскостью, которая создаст геометрическое разделение точек данных.
На приведенных выше диаграммах мы видим, что существует несколько границ решений (в 2D-сценарии, как показано выше, граница решения или гиперплоскость на самом деле является просто линией), которые могут привести к одной и той же категоризации/классификации. Однако обратите внимание, что плоскость, выделенная ЗЕЛЕНЫМ цветом, на самом деле будет наиболее устойчивой к любым будущим точкам данных. Причина в том, что евклидово расстояние точек данных в пространстве максимально от этой плоскости. Если это последнее предложение не имело для вас особого смысла, не волнуйтесь, просто взгляните на то, что такое евклидово расстояние здесь. Итак, теперь, когда мы определили одну из гиперплоскостей как лучшую или наиболее устойчивую к новым обучающим примерам классификации, интересно понять, как SVM на самом деле спроектированы для поиска этих надежных гиперплоскостей с большим запасом. Маржа называется максимальным расстоянием между точками данных разных классов, которые у нас есть. Таким образом, в основном SVM нацелены на прогнозирование границ решений с большими запасами, и поэтому SVM также называют классификаторами с большими запасами.
Разработав эту базовую интуицию, давайте погрузимся в компоненты SVM.
Если вы уже ознакомились со статьей Помимо основ: логистическая регрессия, вы можете пропустить следующую часть, потому что она повторяет то же самое. Если нет, то я бы посоветовал также прочитать эту статью, потому что SVM во многом опираются на свою интуицию из логистической регрессии, поэтому понимание логистической регрессии должно помочь вам лучше понять SVM.
Функция гипотезы
В любой задаче обучения с учителем наша цель проста:
"Для обучающего набора мы хотим изучить функцию h: X → Y, чтобы h(x) был хорошим прогнозом для соответствующего значения y"
Здесь h(x) называется функцией гипотезы и в основном является тем, что мы пытаемся предсказать с помощью нашего алгоритма обучения (в данном случае — машины опорных векторов).
В случае SVM мы хотим, чтобы функция гипотезы была равна 1 или 0. Для этого мы определяем гипотезу следующим образом:
h(x) = 1 if θ^T * x ≥ 0
и h(x) = 0 в противном случае
подождите, что θ?
Если вы знакомы с машинным обучением, то должны знать, что θ обычно представляет собой параметры или веса и что на самом деле мы пытаемся найти наилучший набор этих параметров (θ — вектор параметров), что дало бы нам наиболее точные результаты классификации.
Теперь, когда у нас есть гипотеза, нам нужно оценить, насколько хорошо она работает. Для этого нам нужно рассчитать «стоимость» наших прогнозов, которая в основном является мерой того, насколько наши прогнозы близки к реальным значениям. Здесь на помощь приходит функция затрат.
Функция стоимости
Функция стоимости, по сути, находит «стоимость», которую мы хотим понести для нашей модели, если наш результат равен h(x), а фактический результат должен быть y. Таким образом, становится интуитивно понятным, что стоимость фактически должна быть пропорциональна разнице между h(x) и y.
Чтобы определить функцию стоимости для SVM, мы начнем с рассмотрения функции стоимости для логистической регрессии. Если вы не знаете, как работает логистическая регрессия, я бы порекомендовал прочитать статью о логистической регрессии из той же серии:
Графики потерь в случае логистической регрессии и SVM выглядят следующим образом:
Здесь мы должны проанализировать взаимосвязь между SVM и логистической регрессией. Важно понимать, что, как и логистическая регрессия, SVM также является алгоритмом классификации. Основное отличие заключается в том, что SVM пытается предсказать границу решения (также называемую гиперплоскостью) с большим запасом. Таким образом, чтобы вывести функцию стоимости для SVM, мы опираемся на интуицию из функции стоимости для логистической регрессии. Немного изменив график логистической регрессии, мы получим график функции потерь SVM.
Поскольку нам нужна более конкретная и четкая классификация, мы просто сделали этот граф в некотором смысле более дискретным.
Теперь из приведенных выше графиков мы приходим к следующей функции стоимости:
Функция стоимости логистической регрессии может быть представлена как:
A+λ.B
Здесь мы увеличиваем значение λ, тогда вес B увеличивается.
Функция стоимости SVM может быть представлена как:
C.A+B
Интуитивно C можно считать похожим на 1/λ. Таким образом, если значение C уменьшается, вес B увеличивается.
БОЛЬШАЯ ПРИБЫЛЬ ИНТУИЦИЯ
SVM также называют классификаторами с большой маржей. Давайте посмотрим на графики функции стоимости SVM.
График слева относится к функции стоимости, когда метка y=1, а график справа — к y=0. Из вышеприведенных графиков мы можем сделать следующие выводы:
Если y=1, то cost(z)=0 только тогда, когда z≥1 (обратите внимание, что z≥0 недостаточно)
также, если y=0, то cost(z) = 0 только тогда, когда z≤-1 (обратите внимание, что z≤0 недостаточно)
Важным наблюдением здесь является то, что SVM не соглашается на z≤0 или z≥0. Он налагает больший запас прочности, используя z≥1 и z≤-1. Вернемся еще раз к графику, показывающему множественные границы решений. Из графика видно, что серые границы — это границы функциональных решений, которые можно выбрать с помощью логистической регрессии. Однако они не будут слишком хорошо обобщать новые данные (скажем, тестовую выборку). Однако зеленая линия — это то, что выбрал бы SVM из-за наложенного дополнительного запаса прочности. Это более надежный сепаратор. С математической точки зрения более надежным разделителем будет тот, который имеет большее минимальное расстояние или запас по сравнению с любым из обучающих примеров.
Хорошо, это выглядит хорошо, но что, если данные не всегда линейно разделимы (что обычно и бывает)? Что ж, в этом случае применение SVM в качестве классификаторов с большой маржой практически не имеет значения. Итак, как мы понимаем нелинейные границы решений? Вот где в дело вступают ядра. Давайте взглянем.
ЯДРА
До сих пор мы видели только SVM, предсказывающие линейные границы решений, однако в реальном мире наши данные часто не будут линейно разделимыми, и, следовательно, нам потребуется более сложная нелинейная граница решений. Одним из подходов к получению сложной границы решения было бы получение терминов более высокой степени путем умножения наших существующих функций друг на друга, например:
f1 = x1
f2 = x1*x1
f3 = x1*x2….
и наша новая функция гипотезы тогда будет:
hθ(x) = θ₀+ θ₁*f1+ θ₂*f2 + θ₃*f3…
Это дало бы нам уравнение более высокой степени, однако сидеть и пытаться выбрать наилучшую комбинацию функций было бы очень обременительно и неблагоприятно. Не только это, но и полиномы более высокой степени также становятся дорогостоящими в вычислительном отношении. Итак, что теперь :/ на самом деле есть довольно изящный способ решить нашу проблему, используя что-то, называемое ядром. Теперь, если вы работали с компьютерным зрением, вы, вероятно, уже знаете, что такое ядро, но не волнуйтесь, мы сосредоточимся только на базовом использовании ядер для решения нашей проблемы с SVM, поэтому, даже если вы впервые слышите о них, вы должны быть в порядке.
Теперь, прежде чем мы формально определим, что такое ядра, давайте попробуем понять, как они работают.
Для простоты понимания предположим, что наш набор данных имеет только две функции x1 и x2. Теперь, если мы построим эти точки данных в пространстве n-D (n = 2 в нашем случае, поскольку у нас есть 2 функции) следующим образом:
Затем мы случайным образом выбираем три точки данных в этом пространстве следующим образом:
Эти точки мы называем ориентирами. Прежде чем мы двинемся дальше, важно понять, что наша цель здесь — получить более сложную функцию гипотезы, которая, в свою очередь, может дать нам более сложную границу решения для классификации нашего набора данных. Итак, наша новая функция гипотезы действительно будет выглядеть примерно так:
hθ(x) = θ₀+ θ₁*f1+ θ₂*f2 + θ₃*f3…
Подождите, но это то же самое, что и функция гипотезы, которую мы обсуждали ранее. Однако разница будет заключаться в том, как мы определяем функции или fᵢ, используя ядра. Хорошо, давайте тогда к этому.
Теперь, когда мы выбрали наши ориентиры, мы берем случайную точку данных на нашем графике, скажем, x, для каждого x, который мы теперь определяем:
f1 как сходство между x и l₁
f2 как сходство между x и l₂
f3 как сходство между x и l₃
Подождите, но как мы интуитивно определяем «сходство»? Вот как:
сходство (x, l₁) = exp (- (|| x — l₁ ||²) / 2σ²)
здесь|| x — l₁||² — евклидово расстояние между точкой x и ориентиром l₁ в квадрате, σ — стандартное отклонениеиσ² обычно называют дисперсией. Если вы не уверены, что означают эти термины, я бы порекомендовал взглянуть на несколько основных определений статистики и интуиции здесь.
Теперь давайте обобщим это уравнение, которое мы получили, на сходство между x и всеми ориентирами lᵢ:
сходство (x, lᵢ) = exp(- (|| x -lᵢ ||²) / 2σ²)
обратите внимание, что использование всех ориентиров в качестве общего вектора — это деталь реализации, поэтому ничего страшного, если вы не понимаете, как это происходит прямо сейчас, это станет ясно, когда мы реализуем SVM в следующем посте. На данный момент достаточно понять, что сходство (x, lᵢ) дает нам сходство x с соответствующим ориентиром, lᵢ.
Эта функция подобия, которую мы определили выше, на самом деле называется гауссовым ядром. Определив и поняв, что такое ядро, давайте посмотрим, почему эти ядра на самом деле работают.
ПОЧЕМУ ЯДРА ДАЖЕ РАБОТАЮТ?
Теперь давайте углубимся в ядра. Скажем, x находится очень близко к ориентиру, тогда квадрат расстояния x от него будет очень близок к 0. С математической точки зрения:
f1 = exp(-0²/2σ²)
это в основном e⁰, который равен 1.
Теперь возьмем противоположный случай, когда x находится очень далеко от ориентира. Квадрат расстояния в этом случае будет большим числом, поэтому мы приблизительно получим e^-∞, близкое к 0. Теперь давайте воспользуемся графическим представлением, чтобы понять, как работают ядра:
Скажем, у нас есть три ориентира l₁,l₂ и l₃. Теперь для каждой точки в пространстве мы находим сходство между точкой и каждым из ориентиров, используя функцию подобия, как определено выше:
сходство (x, lᵢ) = exp(- (|| x — lᵢ ||²) / 2σ²)
На рисунке выше показан пример, когда мы сначала рассматриваем точку пурпурным цветом. После оценки функции сходства для каждого из ориентиров точка покажет более высокое сходство с ориентиром l₁ и, таким образом, будет отнесена к определенной категории или метке, относящейся к l₁. Затем мы будем повторять аналогичным образом все остальные точки по одной, пока не получим четкую классификацию для всех точек в наборе данных.
Вот и все!
Поздравляем, вы добрались до конца этой статьи. Это было долго, но ты не сдался. Отличная работа! Теперь вы знаете, что такое SVM и как их можно использовать. В следующем посте мы рассмотрим реализацию этого алгоритма в python. А пока вы можете изучить некоторые приложения SVM и посмотреть, как они реализуются в реальном мире. Приятного обучения!
Рекомендации
- https://www.org/mlclass/12_Support_Vector_Machines.html
- https://www.mathsisfun.com/data/standard-deviation.html
- https://en.wikipedia.org/wiki/Euclidean_distance
Давайте подключим
www.linkedin.com/in/kumud-lakara