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

ЗАДНИЙ ПЛАН

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

Допустим, вы живете в одном из этих домов. И вы планируете продать свой дом. Как бы вы эффективно выбрали порог, до которого вы должны продавать? Вот где этот алгоритм может помочь. Особенности в этой задаче — это характеристики вашего дома. Такие как :

  • Сколько лет дому?
  • Общее количество спален в вашем доме.
  • Количество ванных комнат в вашем доме.
  • Общая площадь, которую занимает ваш дом.
  • У него есть парковка? Если да, то сколько машин я могу припарковать?
  • Есть ли у него задний двор, где я могу сидеть под дождем и читать романтические романы?
  • Есть ли у него бассейн, где я могу наслаждаться летом?

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

Итак, идея состоит в том, чтобы предсказать цену, по которой ваш дом может быть продан, на основе выученных примеров, которые имеют одинаковые множественные характеристики. Если вы поняли вышеизложенное, поздравляем! Теперь вы можете начать работать над самым известным конкурсом Kaggle, в котором участвуют все начинающие претенденты на машинное обучение — Конкурс цен на жилье — это был и мой первый конкурс. Хватит болтать, давайте перейдем к математике.

ФУНКЦИЯ ГИПОТЕЗЫ — ПЕРЕОПРЕДЕЛЕНА

Здесь, на основе гипотезы, которую мы определили в предыдущей статье, если у нас есть функция с несколькими переменными/признаками, такими как x1, x2, x3… xn; тогда мы бы представили функцию гипотезы как:

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

ГРАДИЕНТНЫЙ СПУСК ДЛЯ МНОЖЕСТВЕННЫХ ПЕРЕМЕННЫХ

Пусть n обозначает количество признаков, заданных в наборе данных. Раньше у нас было n = 1, что было всего одной функцией, но теперь у нас может быть больше двух функций. Таким образом, алгоритм градиентного спуска имеет небольшое изменение, например следующее:

На следующем изображении градиентный спуск с одной переменной сравнивается с градиентным спуском с несколькими переменными:

Обратите внимание на переменную «j», которая идет от 0 до n, то есть она повторяется на всем пути от члена смещения до последней функции (n). Мы вычисляем частные производные по каждому из признаков и обновляем тета-значения — вектор параметров. Здесь есть проблема, вы ее заметили? Мы итерируем все пространство признаков, вычисляем градиенты, обновляем тета-значения за один шаг. И мы неизбежно повторяем это до тех пор, пока разница между этими тета-значениями не станет значительно низкой. Из-за этого Gradient Descent работает медленно. Например, настолько медленно, что у вас возникает желание просто прекратить изучение машинного обучения и вернуться в свою зону комфорта. Шучу, давайте рассмотрим несколько способов улучшить общую скорость алгоритма оптимизации.

КАК МОЖНО УСКОРИТЬ ГРАДИЕНТНЫЙ СПУСК?

  • Мы можем ускорить градиентный спуск, имея каждое из наших входных значений примерно в одном и том же диапазоне, чтобы контурные графики, которые сильно перекошены, можно было свести к кругам, чтобы градиентному спуску было легче добраться до глобального/локального минимума. .
  • В идеале мы можем выбрать диапазон наших входных значений от -1 до 1. Мы можем изменить значения входных объектов, чтобы все они примерно попадали в один и тот же диапазон во всем наборе данных.
  • Для этого мы можем использовать одну из двух техник среди множества других. Масштабирование признаков или нормализация среднего. Мы можем приступить к написанию целой книги всего за один этот шаг, неудивительно, их уже много. В любом случае, давайте посмотрим, что делают эти две техники.
  • Масштабирование признаков. В этом методе мы делим входные значения на диапазон (максимальное значение минус минимальное значение) набора данных, в результате чего новый диапазон равен всего 1.
  • Нормализация среднего: в этом методе мы можем вычесть среднее значение входного признака с входной переменной и разделить его на стандартное отклонение или на диапазон входного признака. Обратите внимание, что деление его на стандартное отклонение на дает другие результаты по сравнению с погружением на диапазон. Например, если xi представляет цены на жилье в диапазоне от 100 до 2000 и среднее значение 1000, то xi = (xi — 1000)/1900.

Теперь, когда вы понимаете пару шагов, которые вы можете предпринять, чтобы ускорить градиентный спуск, как бы вы удостоверились в сходимости оптимизации? Действительно ли он изучил параметры, достиг ли он глобального минимума? Или он все еще делает крошечные, детские шаги к глобальному/локальному минимуму? Или он просто выстрелил из контура в бесконечность? Давайте ответим на эти вопросы

ОТЛАДКА ГРАДИЕНТНОГО СПУСКАНИЯ

Визуальный способ — построить график

Одним из эффективных способов визуально проверить, правильно ли работает градиентный спуск, является построение графика. Чтобы отладить градиентный спуск, сделайте график с количеством итераций по оси x. Теперь постройте функцию стоимости J (θ) по количеству итераций градиентного спуска. Если J(θ) когда-либо увеличится, вам, вероятно, придется уменьшить α.

Автоматический тест сходимости

Объявить сходимость, если J(θ) уменьшается менее чем на E за одну итерацию, где E — небольшое значение, например 10^−3. Однако на практике выбрать это пороговое значение затруднительно.

Доказано, что если скорость обучения α достаточно мала, то J(θ) будет уменьшаться на каждой итерации. Это не означает, что нужно выбирать чрезвычайно низкую скорость обучения, которая потенциально еще больше замедлит градиентный спуск. если α слишком мало: медленная сходимость. Если α слишком велико: оно может не уменьшаться на каждой итерации и, следовательно, может не сходиться. Итак, разумно выбирайте скорость обучения альфа в зависимости от набора данных, с которым вы имеете дело. Поработайте и нарисуйте стоимость, и вы ясно увидите, какое значение альфа-канала идеально подходит для вашего набора данных.

ПОЛИНОМИАЛЬНАЯ РЕГРЕССИЯ

  • Наша функция гипотезы не всегда должна быть линейной, чтобы разумно соответствовать данным. На самом деле, многие наборы данных следуют полиномиальному тренду, а не линейному тренду. Мы можем также включить полиномиальные члены в функцию, чтобы получить хорошую гипотезу.
  • Мы можем улучшить нашу функцию гипотезы, объединив несколько признаков в один. Например, мы можем объединить функции x1 и x2 как x1*x2 и сделать новую функцию x3 = x1*x2.
  • Помните, что когда вы включаете полиномиальные члены, масштабирование признаков становится очень важным. Потому что некоторые функции могут достигать очень больших значений, что делает кривую довольно нестабильной. Скажем, включая признак x3 = x1*(x2³). В этом случае, если значение x2 равно 100, а x1 равно 10, то значение x3 будет равно 100 000 000, что очень много. В этом случае удобно использовать масштабирование функции, чтобы снизить это значение до желаемого диапазона, чтобы кривая не была нестабильной.

СКРЫТЫЙ СПОСОБ ВЫЧИСЛЕНИЯ ПАРАМЕТРОВ — ИЗБЕЖАНИЕ ГРАДИЕНТНОГО СПУСКАНИЯ

  • Мы также можем вычислить тета вектора параметров, используя аналитические методы, такие как: тета = inv(X^T * X) * (X^T * y). Это известно как Нормальное уравнение для линейной регрессии.
  • Нет необходимости масштабировать признаки при аналитическом поиске параметров. Ниже показан пример для 4 обучающих примеров.

Собираем все вместе

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

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

Так что никогда, никогда не прекращайте учиться — несмотря ни на что!

Для драгоценных, с терпением.