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

  1. Под капотом - линейная регрессия
  2. Под капотом - логистическая регрессия
  3. Под капотом - дерево решений

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

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

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

Линейная регрессия

Линейная регрессия составляет основу машинного обучения и основана на простой концепции подбора кривой -

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

По сути, «модель» создает линейное уравнение, связывающее входные характеристики (X) с целевой переменной (Y).

Рассмотрим следующие данные с двумя входными переменными - X1, X2 и одной целевой переменной Y.

Линейная регрессия попытается найти оптимальное значение для w1, w2 и b, чтобы для каждой строки данных -

Здесь w1 и w2 - это коэффициенты входных переменных, а b - член смещения. Это известно как «линия наилучшего соответствия» для данных, и алгоритм итеративно пытается найти эту линию наилучшего соответствия, используя следующие шаги:

  1. Назначьте случайные значения параметрам w1, w2 и b.
  2. Выберите один экземпляр в данных и рассчитайте

3. Рассчитайте убытки - Насколько отличается наш объем производства от фактического?

4. Рассчитайте градиент для w1, w2 и b - как нам изменить веса, чтобы приблизиться к фактическому результату?

5. Обновите w1, w2 и b.

6. Повторяйте шаги 2–5 до схождения.

Следующий набор изображений передает шаги для одной переменной -

1. Назначьте случайные значения для w1, w2 и b

Начнем с наших предположений -

2. Выберите один экземпляр из данных и вычислите ŷ

Начнем с первой строки наших данных

Вводя наши предполагаемые значения для параметров, мы рассчитываем предполагаемый выход

Наша цель - обновить параметры таким образом, чтобы предполагаемый результат (ŷ) был равен фактическому результату (y).

3. Рассчитайте потери - насколько расчетный выход отличается от фактического?

Здесь все становится интересно.

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

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

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

Давайте посчитаем убыток исходя из наших предположений -

4. Расчет градиентов

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

Начнем с записи наших потерь как функции параметров модели -

Чтобы определить, как мы должны изменить наши параметры, чтобы приблизиться к фактическому результату, мы вычисляем наши градиенты (частные производные) для каждого из наших коэффициентов и член смещения относительно потерь -

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

5. Обновите w1, w2 и b.

Ух ты! Похоже, наши предположения сильно отклонились!

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

Учитывая η = 0,01, наши обновления выглядят более разумными -

Это выглядит более разумным.

На этом завершается одна итерация алгоритма. Теперь мы повторяем эти шаги до схождения . Т.е. до тех пор, пока наши веса не изменятся так сильно и / или наши потери не приблизятся к 0.

Давайте сделаем еще одну итерацию с другими строками данных с нашими обновленными параметрами.

Продолжая тот же процесс еще несколько итераций *, произвольно выбирая строку из первых четырех строк данных (мы сохраняем последнюю строку для проверки нашей модели), мы получаем следующие значения параметров:

Используя их, давайте посмотрим, как выглядит ошибка в нашем контрольном образце (последняя строка).

У нас потери почти 0. Можно сказать, что модель нашла оптимальные параметры для этих данных.

Вот и все. По сути, это то, что делает линейная регрессия.

Это действительно ВСЕ, что делает линейная регрессия?

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

Хотя это правда, что линейная регрессия делает по своей сути именно это, для создания хорошей модели линейной регрессии нужно гораздо больше, например:

1. Регуляризация - L1 и L2

2. Планирование скорости обучения

3. Нормальное уравнение

4. Стохастик, мини-пакет или пакетный градиентный спуск.

5. Ранняя остановка

Я рассмотрю эти концепции в параллельной серии статей, посвященной общим точкам оптимизации алгоритмов.

Что дальше?

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

* За 15 итераций вот как изменились наши потери, градиенты и значения параметров -