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

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

Сегодняшняя тема: линейная регрессия

Итак, прежде всего, что такое линейная регрессия?

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

  • Хотим ли мы классифицировать что-то по набору предопределенных классов? Затем делаем классификацию! (Примером может служить набор данных MNIST, где мы получаем изображение в качестве входных данных и хотим вывести, какую цифру оно показывает. Выходные данные всегда должны находиться в диапазоне от 0 до 9, и только эти 10 значений являются значимым прогнозом, поэтому мы хотим отнесите изображение к одному из 10 классов)
  • Хотим ли мы вывести какое-то непрерывное значение? Тогда сделаем регресс! (Здесь мы можем думать о прогнозировании цены дома. У нас будут некоторые характеристики, такие как количество спален, квадратные футы, расстояние до центра города, и мы хотим вывести стоимость в долларах. Стоимость - это значение в диапазоне например, 100 $ - 1 миллион $. Это не определенный класс, но имеет неограниченное количество возможных результатов, которое называется непрерывным)

Умный читатель, как вы, вы уже догадались, что линейная регрессия - регрессия! Замечательно, поэтому мы знаем, что хотим прогнозировать, и это уже первый шаг в правильном направлении.

Математическое представление данных

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

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

Понятия всегда легче понять, когда у нас есть наглядное объяснение, поэтому на изображении ниже мы видим пример обученного алгоритма линейной регрессии. Ось X в этом случае - это размер дома в квадратных футах, а ось Y - цена дома. Синие точки - это образцы известных нам домов, а красная линия - это то, что предсказывает наш алгоритм. Мы видим, что, хотя он не идеально подходит для всех значений, он имеет довольно хороший средний прогноз по всему пространству.

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

  • m: количество обучающих выборок.
  • x: входная переменная
  • y: выходная переменная

Что мы сейчас сделаем, так это просто объединим имеющуюся у нас информацию и поместим ее в более простой для использования формат. Для этого мы используем векторы и матрицы, и идея довольно проста. Каждая входная переменная x будет одним столбцом нашей входной матрицы X. Итак, если мы представим первый дом размером x₁, а второй дом размером x₂ и так далее, мы можем создать матрицу, которая будет выглядеть так (для 4 образцов):

Поэтому мы можем создать нашу новую входную матрицу X, которая имеет размерность: ℝⁿˣᵐ. Опять же, m - это количество имеющихся у нас образцов, а n - это количество наблюдаемых нами функций (здесь: n = 1). В нашем случае это только одна характеристика (размер дома в квадратных футах), но на самом деле это может быть несколько функций, таких как количество спален, количество ванных комнат, размер сада и т. Д. Если у нас есть только один вход мы выполняем одномерную линейную регрессию, тогда как для нескольких входных функций мы делаем то, что называется многомерной линейной регрессией. Для простоты мы придерживаемся одной функции.

Мы можем проделать такую ​​же операцию с выходными переменными (которые представляют собой все известные нам цены на жилье). Чтобы получить лучшее математическое представление, мы вводим цены всех имеющихся у нас образцов в один вектор. Результирующий вектор y имеет размерность ℝᵐ, потому что он содержит одно значение для каждой выборки (помните: m = количество выборок).

Трубопровод

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

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

Функция гипотезы

Функция гипотезы - это ядро ​​процесса оценки. Мы загружаем наши образцы X в функцию и хотим, чтобы она предсказывала непрерывный вывод (который в основном представлен y с символом ^ наверху). Вы уже узнали, что означает термин регрессия (мы хотим спрогнозировать непрерывный результат, например, цену дома). Теперь мы подошли к термину линейный, потому что форма функции гипотезы - это просто линейная функция. Если вы не уверены, что это значит, я уверен, что это станет ясно, когда вы увидите записанную функцию:

Мы вводим здесь новую переменную под названием θ (theta). Это параметры, которые алгоритм использует для прогнозирования цены дома. Он состоит из n + 1 (придает ему размерность ℝⁿ⁺¹) значений, которые также называются весами, поскольку каждое из них можно рассматривать как вес определенного особенность. В нашем случае у нас есть только одна функция, но в случае n функций она будет выглядеть так:

Итак, для каждой функции у нас есть значение θₓ, на которое мы умножаем ее, придавая ей определенный вес. Мы можем думать об этом так: насколько важна особенность (для окончательной цены дома)? Если он имеет большое влияние на цену (например, квадратные футы), он будет иметь большой вес. С другой стороны, если это лишь незначительно повлияет на окончательную цену (например, количество дверных ручек), он будет иметь небольшой вес.

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

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

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

  • 1: это просто результат функции гипотезы с i-й обучающей выборкой.
  • 2: истинное значение (цена дома) для образца i обозначено y ᶦ. Разница между нашим прогнозом (гипотезой) и правильной функцией дает нам ошибку (насколько далеко мы отошли от нашего прогноза). Затем мы берем квадрат, который имеет только положительные значения и ошибку квадрата.
  • 3: имя нашей функции включает термин среднее, и это то, что мы здесь вычисляем. Поскольку мы суммируем квадраты ошибок для всех обучающих выборок, а затем делим их на m, мы получаем среднюю ошибку. Это важно, поскольку мы хотим хорошо работать со всем набором, а не сосредотачиваться на отдельных сэмплах. (Примечание: вас не смущает множитель 2 перед m. Это упростит следующие шаги, но кроме этого не имеет значения.)

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

Алгоритм обучения

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

Итак, сначала мы строим функцию стоимости J (функция среднеквадратичной ошибки):

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

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

Конечно (не) все мы помним из исчисления, как можно найти минимум функции: вычисление производной! Подход градиентного спуска заключается в вычислении частной производной для всех параметров функции стоимости и вычитании ее (взвешенной с коэффициентом α) из исходного значения параметра.

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

  1. Начните с некоторых (случайных) θ
  2. Вычислить прогнозы и оценить функцию затрат J (θ)
  3. Отрегулируйте параметры θ, чтобы уменьшить ошибку J (θ)
  4. Повторяйте шаги 2 и 3, пока не дойдете до минимума (математически: до сходимости)

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

  • 1: мы определили это раньше, чтобы вычислить, насколько наш прогноз далек от истины.
  • 2: мы берем градиент (т. е. производную по i -ому множителю θ) из этой функции затрат.
  • 3: α-фактор называется скоростью обучения, и это название прекрасно отражает то, что он делает. Если мы выберем небольшое значение (например, 0,001), процесс обучения будет медленным по сравнению с более высокими значениями (например, 0,1). Найти идеальное значение непросто. Если мы выберем слишком большую скорость обучения, мы можем перескочить за идеальное значение и никогда не придумаем отличного решения. Если он слишком мал, обучение занимает (очень) много времени. Взгляните на график ниже, чтобы убедиться в этом сами.

Мы почти подошли к финишу. Теперь мы хотим, наконец, взглянуть на то, как выглядит окончательное уравнение, потому что мы должны сделать важное различие. Сначала давайте рассмотрим общую формулу для расчета градиента в нашем случае прогнозирования цены дома по одному параметру θ(размер дома) и то, что мы назвали смещением. Θ:

Здесь мы заменили функцию стоимости формулой, которую мы для нее определили ранее. Теперь у нас все еще есть функция гипотезы, так что давайте заменим и ее (здесь у нас есть 2 параметра для размера дома θ₁ и bias θ₀):

Теперь у нас есть кое-что, что мы можем довольно просто извлечь. Итак, давайте сначала посмотрим на вывод смещения:

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

Здорово! Теперь у нас есть все необходимое для настройки параметров на основе имеющихся обучающих выборок. Давайте еще раз резюмируем то, что мы здесь узнали.

Резюме

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

Подводя итог, наш рабочий процесс линейной регрессии выглядит следующим образом:

  1. создать матрицу ввода X, содержащую известные образцы, которые у нас есть для нашего варианта использования
  2. прогнозировать значения для каждой выборки с помощью нашей функции гипотез h (θ)
  3. оценить, насколько хорошо наши прогнозы сработали, с помощью нашей среднеквадратичной ошибки функции стоимости J (θ)
  4. отрегулируйте наши параметры с помощью градиентного спуска, чтобы получить лучшие результаты для следующих прогнозов.
  5. повторяйте шаги 2–4, пока наша функция затрат не достигнет самой низкой точки.

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

В заключение я хочу упомянуть, что большая часть обсуждаемой работы на практике выполняется с помощью инструментов. Популярные библиотеки, такие как scikit-learn или tensorflow, сделают за вас тяжелую работу. Однако я думаю, что очень важно знать основные принципы и формулы, чтобы иметь твердое представление о том, как правильно обучать и тестировать алгоритмы, а также выявлять ошибки и проблемы в процессе.

Спасибо, что подписались на этот пост до конца, и не стесняйтесь комментировать, если у вас есть вопросы, или пишите мне в Twitter.