Два года назад меня очень вдохновило произведение искусства машинного обучения от Studio Drift в Stedelijk Museum в Амстердаме. С энтузиазмом я начал курс Стэнфордское машинное обучение и смог получить бизнес-кейс в работе по обработке естественного языка. В процессе изучения машинного обучения я был обескуражен (например, некоторые концепции, такие как рекуррентные нейронные сети, чрезвычайно трудно понять, и я чувствовал себя самозванцем) и задавался вопросом, в чем именно заключалась проблема в реализации моделей машинного обучения, если инструменты делают работу за вас. (например, Azure Machine Learning Studio или Automated ML позволяют реализовать множество моделей и выбрать лучшую из них). Я отложил это на один год, пока недавно не вдохновился ML. Я понял, что во время Введения Эндрю Нг в машинное обучение и других книг и курсов я узнал так много классных вещей и жил и дышал в то время, что было бы стыдно потерять эти знания. Поэтому я решил сделать краткий обзор некоторых основных концепций машинного обучения. Кто знает, куда может завести меня это путешествие. Давайте разберемся! Сначала: линейная регрессия. Я недавно купил дом, так что давайте возьмем поиск дома в качестве примера.

Линейная регрессия — это форма контролируемого обучения.

Линейная регрессия относится к разделу обучение с учителем машинного обучения. Сначала мы обсудим одномерную линейную регрессию, то есть имеем дело только с одной входной переменной и одной выходной переменной. В нашем случае поиска дома мы можем задать себе вопрос: «В какой степени размер дома (независимая переменная) влияет на цену дома (зависимая переменная или целевая переменная)?»

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

Цель линейной регрессии — найти подобранную линию, которая лучше всего представляет точки обучающих данных. Эти точки данных обычно состоят из исторических данных. Он направлен на создание линейной линии, которая максимально точно соответствует историческим точкам данных, чтобы предсказать результат на основе одной входной переменной. В случае поиска домов обучающие данные будут состоять из обзора размеров домов (независимая переменная) и соответствующих цен проданных домов (зависимая переменная). Применение одномерной линейной регрессии для определения цены дома не очень реалистично; когда я купил дом, я принял во внимание различные факторы, чтобы определить мою ставку, помимо размера дома, такие как местоположение, год постройки и внешняя жилая площадь. Но для расчета моей окончательной цены предложения я вернулся к основам и просмотрел обзор цен на дома и их размеров на kadaster.nl, голландском веб-сайте по вопросам жилья, который регистрирует все цены на проданные дома. Давайте представим, что Kadaster был моим единственным источником данных для определения моей ставки.

Используйте линейную регрессию для прогнозирования непрерывной выходной переменной

Мы используем линейную регрессию для прогнозирования непрерывной выходной переменной. Непрерывная выходная переменная означает, что выход может иметь любое действительное значение. Например, исходя из количества квадратных метров, мы хотим спрогнозировать стоимость жилья. Цена дома может варьироваться от 1 евро (что маловероятно) до миллионов евро.

Определите подобранную линию, которая лучше всего представляет исторические данные

Для линейной регрессии наша подобранная линия является линейной. Возможно, вы давно помните из школы, что линейная линия представляется формулой y = a + bx, где a — точка, пересекающая ось y, а b — наклон линии. Цель состоит в том, чтобы найти значения a и b, которые лучше всего представляют наши исторические цены на жилье. Получив эти значения, мы можем подставить любое значение в гипотезу и получить прогнозируемое значение. Значения a и b называются параметрами. В области машинного обучения эти параметры, которые нам нужно определить, называются тета. Чтобы различать разные параметры, мы называем «а» тета-нулем и «b» тета-единицей. Я согласен с тем, что слово «тета» звучит не так уж и много, но пока давайте просто примем это странное название и перейдем к более захватывающим выводам.

Теперь я дал вам функцию гипотезы, но как именно мы можем рассчитать эти оптимальные значения тета-ноль и тета-единица?

Минимизируйте стоимость J, чтобы придумать наилучшую подогнанную линию

Чтобы получить подобранную линию, которая лучше всего представляет наши исторические данные, мы хотим измерить, в какой степени наша гипотеза действительно хорошо подходит для наших точек данных. Мы используем стоимость J, чтобы помочь нам в этом упражнении. Эта формула поможет нам рассчитать, в какой степени наша подобранная линия соответствует историческим точкам обучающих данных. Цель состоит в том, чтобы минимизировать сумму квадратов разностей между прогнозами цен на жилье и фактических ценами на жилье. Чем выше стоимость J, тем хуже наша линия соответствует нашим данным. Следовательно, чтобы найти нашу лучшую подогнанную линию, мы хотим минимизировать стоимость! Кстати, опять же, это название «стоимость J» звучит не очень интуитивно. Однако просто помните, что каждая из линий, которые вы начертите, чтобы проверить, соответствуют ли они вашим историческим данным, имеет определенную стоимость. Эта стоимость называется стоимостью J.

Вот что нужно шаг за шагом, чтобы рассчитать стоимость J.

Шаг 1. Создайте гипотезу для конкретных значений параметров Theta 0 и Theta 1.

Шаг 2. Нарисуйте линию, соответствующую этим параметрам.

Шаг 3. Рассчитайте разницу между прогнозируемым выходным значением, основанным на гипотезе, и фактической (исторической) точкой обучающих данных. Повторите для всех точек тренировочных данных: посмотрите, как далеко линия находится от каждой точки тренировочных данных.

Шаг 4. Сократите эти различия.

Шаг 5. Добавьте эти различия для всех точек обучающих данных.

Шаг 6. Умножьте на 1/(2м).

Шаг 7. Результат — это ваши затраты.

Шаг 8. Постройте J в соответствии с вашими параметрами. Появится выпуклая (чаша) функция.

Шаг 9. Продолжайте этот процесс, пока не достигнете минимальной стоимости J.

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

Простой вариант использования: мы на рынке кукольных домиков.

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

Затем мы получим случайные значения для тета 0 и тета 1, которые мы включим в гипотезу. Мы начинаем с тета 0 = 0 и тета 1 = 0 и вычисляем стоимость. Мы сопоставляем стоимость с нашими тэтами и смотрим, что происходит со стоимостью. Мы повторяем этот процесс для тета 0 = 0 и тета 1 = 0,5, и тета 0 = 0 и тета 1 = 1. В конце концов, мы приходим к пониманию, что наша стоимость J минимизируется для тета 1 = 1. Следовательно, для тета 1 = 1, мы можем нарисовать линию, которая лучше всего представляет наши исторические точки данных. Для этого мы вставляем это значение тета-значения в нашу функцию гипотезы и генерируем нашу подобранную линию h(x) = x. Допустим, сейчас мы смотрим на роскошный кукольный домик в центре Амстердама с видом на реку Амстел. Это 10 квадратных метров. Сколько будет стоить дом? Подставим это в гипотезу и узнаем: h(10) = 10. Цена дома будет 10 евро!

Обучение через градиентный спуск автоматически приводит нас к самой низкой стоимости J

Как вы могли заметить, чтобы рассчитать нашу стоимость для конкретной гипотезы, мы учитываем все наши обучающие примеры (например, наши исторические цены на проданное жилье). Если бы у нас был набор данных с миллионами записей, нам потребовалась бы целая вечность, чтобы добраться до минимальной стоимости, потому что нам пришлось бы снова и снова просматривать каждую из миллионов записей, чтобы придумать новую стоимость, пока мы не получим Нашел минимальную стоимость. Кроме того, в предыдущем примере мы выбрали 3 случайных набора значений тета 0 и тета 1 (тета 0 = 0 и тета 1 = 0, тета 0 = 0 и тета 1 = 0,5 и тета 0 = 0 и тета 1 = 1). ), и удалось найти значения параметров, при которых стоимость была минимизирована (это оказалось так для тета 0 = 0 и тета 1 = 1), но для миллионов обучающих примеров невозможно найти эти оптимальные значения параметров путем стечение обстоятельств. Так что нам очень нужна помощь. К счастью, на помощь приходит градиентный спуск.

Что такое градиентный спуск?

Градиентный спуск — это процедура, которая помогает нам найти минимальную стоимость J, позволяя нам получить наши оптимальные значения тета-параметров для представления наших обучающих данных. Он состоит из двух шагов: во-первых, мы вычисляем изменение — или шаг/градиент — наших значений тета-параметров. Затем мы обновляем значения наших параметров. Если градиентный спуск работает правильно, наши шаги должны становиться все меньше и меньше. Для расчета шага мы используем наклон стоимости J. Расчет наклона стоимости J состоит из суммирования наклонов между каждым обучающим примером и его прогнозируемым значением. Мы достигли глобального минимума стоимости J, когда его наклон близок к 0.

Почему мы используем градиентный спуск?

Мы используем градиентный спуск, чтобы найти значения параметров тета 0 и тета 1, при которых стоимость J минимальна. Значения этих параметров позволят нам создать наилучшую аппроксимирующую линию с помощью обучающих данных и предсказать выходную переменную для новых входящих входных данных (т. е. предсказать цену дома (целевая переменная) на основе определенного размера дома (входные данные). переменная/независимая переменная)). Мы будем придумывать линейные линии на каждом шаге градиентного спуска, но как только мы достигнем глобального минимума, мы сможем исправить подобранную линию, потому что мы нашли наши значения параметров тета 0 и тета 1, которые лучше всего представляют исторический набор данных.

Градиентный спуск шаг за шагом

Шаг 1. Расчет гипотезы (предсказания)

Шаг 2. Используйте это для расчета стоимости. Обратите внимание, что для расчета стоимости мы учитываем ВСЕ обучающие примеры (следовательно, вычисляем гипотезу также для каждого обучающего примера).

Шаг 3. Выполняем градиентный спуск, чтобы через наклон каждого обучающего примера x(i) получить обновленные значения параметров. Знак уклона подскажет, в каком направлении двигаться.

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

Шаг 5. Если все идет хорошо (например, вы выбрали хорошую скорость обучения), градиентный спуск должен делать меньшие шаги с течением времени, потому что наклон через x (i) должен уменьшаться. Когда наклон равен 0, вы достигли глобального минимума.

Обновлять до конвергенции

«Обновление до конвергенции» может показаться немного расплывчатым. Это означает, что вы должны обновить значения тета 0 и тета 1.

  • тета (j) = тета (j) — альфа * наклон J (производный термин). Нижний индекс «j» относится к признаку j.
  • Когда скорость обучения альфа слишком велика, градиентный спуск превысит минимум, но когда он слишком мал, для сходимости потребуется слишком много времени. Вот почему необходимо выбрать правильную скорость обучения.

Склоны 101

Давайте посмотрим на небольшое освежение склона.

  • Если наклон положителен, градиентный спуск будет обновлен отрицательным числом и станет меньше, потому что вторая часть градиентного спуска ( — альфа * наклон J ) положительна ( — альфа * положительное число = отрицательное число, следовательно, X — отрицательное число становится меньше). Градиентный спуск будет двигаться влево. Это имеет смысл, поскольку он движется к глобальному минимуму функции стоимости.
  • Если наклон отрицательный, градиентный спуск будет обновлен положительным числом и станет больше, потому что вторая часть градиентного спуска отрицательна (-альфа * отрицательное число = положительное число, следовательно, X + положительное число становится больше). Градиентный спуск будет двигаться вправо. Это имеет смысл, поскольку градиентный спуск будет двигаться к глобальному минимуму.
  • Когда градиентный спуск достигает глобального минимума, вторая часть градиентного спуска (скорость обучения * производный член) будет становиться все меньше и меньше, потому что наклон будет становиться все более пологим (следовательно, меньшим) с каждым шагом. Вы знаете, что достигли глобального минимума, если шаги градиентного спуска становятся меньше и в конечном итоге приближаются к 0, потому что глобальный минимум имеет наклон 0.

Важность тщательного выбора скорости обучения

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

Что нужно помнить о линейной регрессии

  • Выбирайте скорость обучения с умом: когда скорость обучения слишком велика, вы превысите минимум. Когда скорость обучения слишком мала, для сходимости потребуется слишком много времени.
  • Для линейной регрессии будет один глобальный минимум, поскольку J является выпуклой (чашеобразной) квадратичной функцией.
  • Градиентный спуск для линейной регрессии использует пакетный градиентный спуск. Это означает, что для каждого шага градиентного спуска учитываются все точки обучающих данных. Это имеет смысл, потому что для того, чтобы создать новую аппроксимированную линию, необходимо знать местоположение каждой точки данных, прежде чем он сможет правильно оценить, какой должна быть следующая аппроксимированная линия.
  • Важно одновременно обновлять тета 0 и тета 1, потому что линия настраивается как единое целое. Если вы не обновите их сразу, вы не сможете придумать новую строку, что мешает вам придумать обновленную стоимость, что, в свою очередь, мешает вам выполнить градиентный спуск.
  • Тета 0 указывает, где пересечь ось Y, тогда как тета 1 определяет наклон линии.
  • Количество итераций относится к тому, сколько раз градиентный спуск запускается заново для обновления тета. Вопрос в том, сколько итераций достаточно, чтобы добраться до минимума. Существуют разные способы решения этой проблемы, а сейчас предположим, что мы использовали фиксированное количество итераций и предположим, что последняя итерация приведет нас очень близко к нулевому наклону и невероятно маленькому обновлению наших тета-параметров, что приблизит нас достаточно близко к достижение глобального минимума и предоставление нам оптимальных значений параметров для построения линейной линии.
  • Вы можете достичь глобального минимума даже с фиксированной скоростью обучения, потому что с уменьшением наклона на каждом шаге градиентного спуска обновления тета становятся меньше, пока они больше не будут обновляться, как только вы достигнете нулевого наклона.

Линейная регрессия в действии

Давайте завершим практическим примером из задания второй недели Стэнфордского машинного обучения.

Основные выводы: линейная регрессия с одной переменной

Подведем итог тому, что мы узнали:

  • Цель линейной регрессии состоит в том, чтобы построить линейную линию, максимально соответствующую вашему обучающему набору (точки исторических данных).
  • Получив эту линейную линию, вы сможете делать прогнозы на основе новых входных данных.
  • Вы получаете эту линейную линию, нанося различные линейные линии снова и снова и вычисляя стоимость J для каждой линии. Стоимость J — это мера того, насколько хорошо ваша линейная линия соответствует историческим точкам данных. Он вычисляет сумму квадратов ошибок. Проще говоря, он проверяет, насколько далека каждая точка исторических данных от своего прогнозируемого значения, возводит эти различия в квадрат и умножает их на определенное число.
  • Поскольку невозможно рассчитать стоимость J для огромных наборов данных (и придумывать новые комбинации тета-значений снова и снова), на помощь приходит градиентный спуск. .
  • Градиентный спуск поможет нам найти значения параметров тета 0 и тета 1, при которых стоимость минимальна. Получив значения этих параметров, мы можем построить линейную линию и начать прогнозировать с новыми входными значениями.
  • Градиентный спуск ищет глобальный минимум стоимости J, вычисляя стоимость J для различных линейных линий, и ищет направление, в котором нужно двигаться, чтобы добраться до этого глобального минимума. Для линейной регрессии всегда будет только один глобальный минимум, потому что мы имеем дело с чашеобразной функцией.
  • Чтобы проверить, достигли ли вы глобального минимума, стоимость J должна становиться все меньше и меньше (мы ищем стоимость, близкую к 0). Кроме того, производный член градиентного спуска должен стать меньше, потому что стоимость J достигнет глобального минимума, где наклон равен нулю.
  • Убедитесь, что вы выбрали подходящую скорость обучения для градиентного спуска, которая не является ни слишком маленькой, ни слишком большой, так как вы не хотите, чтобы градиентный спуск длился вечно или позволял ему превышать глобальный минимум.
  • Чтобы градиентный спуск работал правильно, важно обновить значения параметров тета 0 и тета 1 одновременно, потому что эти два значения помогут вам создать новую линейную линию. Если вы не обновляете эти значения одновременно, вы не будете выполнять градиентный спуск с обновленной линейной линией.

Линейная регрессия с несколькими переменными (многомерная линейная регрессия)

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

Сравнение многомерной регрессии с одномерной регрессией

  • Функция стоимости осталась прежней, за исключением того, что гипотеза изменилась и теперь включает больше параметров.
  • Вместо того, чтобы обновлять только 2 тета (тета 0, чтобы знать, где линейная линия пересекает ось Y, и тета 1, чтобы знать наклон линейной линии для одномерной регрессии), мы теперь выполняем градиентный спуск для n признаков (все еще принимая учитывать все обучающие примеры для каждого шага градиентного спуска). Например, для тета 4 (количество спален) мы учитываем значения признаков числа спален всех обучающих примеров (j = 4) и умножаем их на ошибки (гипотеза — реальные значения y) всех обучающих примеров. для расчета наклона для тета 4 и последующего обновления до тета 4.
  • По-прежнему важно обновлять все тета одновременно.
  • При выполнении многомерной регрессии важно применять масштабирование признаков и нормализацию среднего, чтобы ускорить градиентный спуск, потому что тета-вектор с тета для каждой переменной будет спускаться быстрее на небольших диапазонах.
  • Средняя нормализация означает, что вы вычитаете среднее значение тренировочного набора для входной переменной, чтобы функции имели нулевое среднее значение. Например, если вы смотрите на размер дома, а средний размер нескольких обучающих примеров составляет 1000 кв. м, вы вычитаете 1000 из площади функционального дома для каждого обучающего примера.
  • Масштабирование функций гарантирует, что ваши функции находятся в диапазоне от -1 до 1. Для функции n каждого обучающего примера разделите (исходное значение функции — среднее) на диапазон (максимум-минимум) или стандартное отклонение.
  • Для векторизованного подхода расчета стоимости J и выполнения градиентного спуска помните, что тета-вектор содержит все параметры (по вертикали). Матрица данных X содержит данные всех обучающих примеров. Каждая строка содержит данные для 1 примера; столбцы представляют функции. Тета 0 — это точка пересечения оси Y. Чтобы сопоставить тета-вектор с матрицей дизайна (у которой на один столбец меньше, чем у тета-вектора, поскольку он не соответствует x (0) (обучающие примеры начинаются с первого признака x (1)), мы создаем x (0) = 1 , Таким образом, матричное умножение возможно.Другой способ взглянуть на это состоит в том, что, поскольку тета-вектор имеет на один элемент больше, чем x (i)-вектор, представление данных в обучающем примере функций (поскольку вектор учебный пример начинается с размера дома x1, количества спален x2 и т. д.) Следовательно, чтобы выполнить умножение векторов, мы «создаем» x0, так что тета-вектор и x-вектор имеют одинаковый размер.
  • Если вы не выберете векторизованный подход, ваша гипотеза будет h = тета-транспонирование * x, где x — вектор, содержащий данные об особенностях одного обучающего примера.
  • Вам нужно транспонировать тета, потому что, если вы хотите умножить два вектора, по крайней мере один из них должен быть транспонирован, чтобы иметь возможность умножать.
  • В то время как гипотеза для векторизованного подхода приведет к вектору m * 1, невекторизованный подход будет выполнять цикл for, вычисляющий гипотезу для каждого обучающего примера.
  • Чтобы помнить о векторизации: в табличном формате каждая строка содержит данные 1 обучающего примера m. Если вы посмотрите на 1 обучающий пример в векторной форме, данные представлены вертикально.
  • Помимо градиентного спуска, есть еще один метод получения оптимальных значений параметров: использование нормального уравнения. Вы можете найти оптимальные значения тета за один шаг, не выполняя масштабирование функций, но градиентный спуск легче понять.
  • Матрица дизайна содержит обучающие примеры m в матрице, в которой транспонируется индивидуальный вектор каждого обучающего примера.

Вот и все, что касается линейной регрессии! Следите за новостями о логистической регрессии.

Исходные данные: Машинное обучение, Стэнфордский университет, неделя 1 и 2.