В этом посте я намерен показать, что происходит за кулисами линейной SVM. Отдельный пост я посвящу рабочему примеру и нелинейным SVM.

Зачем вообще беспокоиться о машинах опорных векторов?

Что ж, это причудливое название могло бы привлечь некоторых… оно, по крайней мере, привлекло мое внимание XD XD. Он также называется классификатором с широким полем (Linear SVM), который, как следует из названия, создает широкий разрыв между различными классами, которые мы пытаемся классифицировать. У нас также есть нелинейная SVM, которая, как следует из названия, помогает классифицировать нелинейные точки данных. Подробнее об этом позже, а пока давайте сосредоточимся на линейной SVM.

Ясно, как новое зеркало, мы можем видеть, что граница принятия решения, установленная SVM, является самой широкой, а другие граничные линии принятия решения (пунктирные линии) также абсолютно правильны при классификации, но не имеют черты «большой запас» как SVM.

Преимущества наличия большой маржи достаточно очевидны, и я не думаю, что она нуждается в каких-либо объяснениях (большая маржа решает проблему чрезмерной подгонки и обобщает нашу модель, поэтому она (также) хорошо работает на тестовых данных).

Боковое примечание: модель считается избыточной, если она настолько хорошо соответствует обучающим данным, что не может обобщить тестовые данные. Изображение должно прояснить это.

Прежде чем мы погрузимся в вопрос «Что такое SVM?» Давайте сначала разберемся с функцией стоимости (потерь)… без знания функций стоимости дальнейшие части будут звучать бессмысленно.

Функция затрат (также функция потерь):

В любом алгоритме обучения с учителем наша цель - обучить модель так, чтобы она выводила правильный результат (да… очевидно). Для этого мы дрессируем модель так же, как дрессируем собак. Мы угощаем собаку, когда она приносит за нас мяч или выполняет то, что мы ей приказываем. Подобным образом (но более строго) мы наказываем нашу модель, если она выводит неверное значение по сравнению с правильным значением, и не наказываем модель, когда она предсказывает (классифицирует) правильно (так жестоко: '(..). Мы накапливаем это «наказание» и называем это стоимостью. Если цена высока, модель работает плохо, и наоборот.

Функция затрат .. подробнее:

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

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

Позвольте мне проиллюстрировать, предположим, что я пытаюсь предсказать цену мобильного телефона с учетом технических характеристик. В моих данных обучения есть 3 примера с фактическими ценами (600, 300, 700). Предположим, моя модель предсказывает цены как (500, 400,700). Если бы функция стоимости не имела квадратного члена, неквадратная разница вернула бы стоимость как 0 ((600–500) + (300–400) + (700–700) = 0), хотя два примера предсказывались неверно.

Чтобы уменьшить функцию стоимости, у нас есть параметр (обычно обозначаемый w или theta) для каждой функции, с которой мы играем, чтобы снизить стоимость. Возьмем очень простой пример прогнозирования цен на телефонные звонки. Чтобы немного упростить ситуацию, предположим, что цена телефона зависит от размера экрана, Ram. У нас есть 2 функции, с помощью которых мы собираемся прогнозировать стоимость телефона. Как упоминалось ранее, у нас есть параметр для каждой функции. Мы можем думать об этих параметрах как о ценности или важности функции, то есть о том, какое влияние эта конкретная функция оказывает на цену.

Если бы мы включили еще одну функцию, «время с момента выпуска» (в месяцах), которая сообщает нам, сколько времени назад телефон был выпущен в приведенном выше примере. Параметры для тех же (w3 или theta3) обязательно будут отрицательными, так как цена на телефоны снижается со временем.

Я надеюсь, что приведенный выше абзац дал вам представление о параметрах. Теперь мы попробуем манипулировать этими параметрами, чтобы наши прогнозы модели были точными. Наша цель в любом алгоритме - минимизировать эту функцию затрат (т.е. уменьшить количество ошибок / потерь). Есть много способов минимизировать эту функцию затрат. Теперь это больше математики, чем чего-либо еще.

Функция минимизации затрат:

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

Градиентный спуск:

Если вы не знакомы с расчетом или нуждаетесь в обновлении, Gradient Descent (G.D) в основном использует производную для оптимизации. Производная сообщает нам об изменении x в этой точке функции.

Давайте возьмем гораздо более простую функцию f (x) = x², и допустим, мы хотим найти значение x, которое минимизирует f (x). G.D - это итеративный алгоритм, то есть он запускается несколько раз для вычисления. Мы инициализируем значение x случайным образом и пытаемся приблизиться к его минимальному значению. Производная f (x) = dx = 2x. Теперь поиск производных функций не может быть объяснен здесь, в этом посте (длинном), он включает в себя исчисление, о котором я расскажу в другом посте.

X = X - скорость обучения * dx

Вышеприведенное уравнение известно как уравнение обновления, которое используется для обновления значения X, чтобы X сходился к минимуму.

Как это случилось?

Что ж, dx в точке дает нам направление, в котором мы должны двигаться, чтобы увеличить значение f (x) до максимума. Наша цель прямо противоположна этой (минимизация функции), поэтому мы идем в противоположном направлении от dx (таким образом, отрицательный знак перед dx).

Здесь learning_rate (alpha) - это константа, которая сообщает нам, насколько быстро мы хотим сойтись к минимуму. У нас может возникнуть соблазн установить значение альфа как можно большим, но это почти всегда приводит к отрицательным результатам. Проблема с большим значением альфа заключается в том, что мы можем упустить минимальное значение и выйти за пределы минимума на другую сторону.

Итак ... Что такое скалярная векторная машина (SVM)?

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

Векторы поддержки отвечают за размещение маржи. Другие значения данных на графике не влияют на маржу. То есть, если я добавлю или удалю другие точки данных (которые не являются векторами поддержки), это не изменит маржу.

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

Теперь интересно то, что когда y = 1 и 0 ‹θ.X‹ 1, то есть, когда наша модель предсказала правильное значение, но с меньшей уверенностью, мы по-прежнему наказываем нашу модель. Это одна из причин, по которой мы получаем большую маржу в SVM. Как их наказание за значения, близкие к границе решения, то есть когда 0 ‹θ.X‹ 1, граница решения пытается быть как можно дальше (чтобы снизить стоимость) от граничных значений, также называется опорными векторами.

Функция стоимости линейной SVM:

Для единственного примера, когда y = 1, члены (1-y) становятся равными нулю (часть стоимости 1), а когда y = 0, часть со стоимостью 1 становится равной 0.

Функция Max возвращает максимальное значение из n предоставленных опций, мы устанавливаем параметры нашей модели (путем обучения с использованием GD) таким образом, что, если наша модель предсказывает правильное значение с достаточно большим запасом, стоимость равна 0 или меньше 0, иначе стоимость увеличивается линейно настолько, насколько это неверно, насколько модель предсказывает, то есть мы можем сказать, что стоимость прямо пропорциональна тому, насколько неверно наша модель предсказала значение, и, таким образом, это значение стоимости выбирается функцией max (), и наша модель получает штраф.

Применение градиентного спуска:

Фактические значения частных производных, которые являются производными от стоимости по параметрам, будут обсуждаться в другом посте, посвященном практической реализации SVM. Этот пост относится к рабочему.

Теперь, когда мы знаем стоимость нашей модели, у нас есть метрика, позволяющая узнать, как работает наш G.D при минимизации затрат. Пусть производная стоимости по параметру w равна dw.

То есть найти производную dw, тогда

Обновите значение w как:

w = w - (скорость_учения * dw)

и найдите стоимость, используя это значение w.

Мы повторяем вышеупомянутые шаги непрерывно, пока не достигнем минимального значения.

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

Я хотел бы добавить, что приведенная выше функция стоимости svm является выпуклой функцией. То есть не имеет локальных минимумов. Таким образом, нам не нужно беспокоиться о том, что наша модель застрянет на локальных минимумах.

Это все о линейной SVM.

Конструктивная критика приветствуется. Пожалуйста, поправьте меня, если вы почувствовали, что я в чем-то ошибаюсь.