Одна из первых вещей, с которой вы обязательно столкнетесь, когда впервые войдете в область машинного обучения и науки о данных, — это градиентный спуск. Но вопрос в том, что именно ЕСТЬ градиентный спуск? Что оно делает? Это одно или есть разные версии Gradient Descent? К концу этой статьи вы сможете ответить на все эти вопросы.

К концу этой статьи у вас будет (надеюсь):

  1. Понял, что на самом деле ЯВЛЯЕТСЯ градиентным спуском и что он делает.
  2. Узнайте о различных «вкусах» градиентного спуска.

Во второй части мы будем кодировать все, что узнали в этой статье, с нуля. Итак, следите за обновлениями!

Без дальнейших церемоний, начнем!

Визуальное понимание градиентного спуска

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

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

  1. Оглянитесь вокруг и посмотрите, в каком направлении лучше всего спускаться.
  2. Сделайте шаг в этом направлении.
  3. Повторяйте процесс, пока не окажетесь внизу.

Примечание. Из этой аналогии следует помнить два важных фактора:

  1. Шаг: Насколько большим/маленьким должен быть размер шага?
  2. Повторить: Сколько раз нужно повторить процесс?

А теперь, помня об этой аналогии, давайте перейдем к техническим аспектам!

Функции стоимости

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

  1. Среднеквадратическая ошибка
  2. Средняя абсолютная ошибка
  3. Перекрестная энтропия
  4. Среднеквадратичная ошибка

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

Если вы когда-либо участвовали в соревнованиях Kaggle, их обычно называют метриками оценки. Как правило, чем меньше потери, тем выше производительность вашей модели. Так что, если, например, вы прогнозировали цены на жилье и использовали среднеквадратичную ошибку, а ваша стоимость составила 25 000 долларов США, это означает, что ваша модель работает плохо, так как ошибка прогноза составляет 25 000 долларов США.

Возвращаясь к нашей аналогии, если представить, что вместо горы есть U-образная кривая, а вместо человека есть функция стоимости, возможно, с начальным значением стоимости 25 500. Целью градиентного спуска будет минимизация этой стоимости либо до 0 (глобальный минимум), либо до гораздо меньшего значения (локальный минимум).

Математическое понимание градиентного спуска

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

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

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

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

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

θj: это один из ваших параметров в ваших векторах параметров или коэффициентах. По сути, это то, на что вы умножаете свои значения и что вы оптимизируете.

α:Помните нашу аналогию с горой и спуском с вершины по ступенькам? Ну, это контролирует размер шага. Его часто называют скоростью обучения вMachine Learning Lingo.

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

h(x): ваши прогнозы значений

y: фактические значения

x(i)j: относится к вашей переменной X в i-м столбце j-й строки. Я не собираюсь вдаваться в технические подробности, так что не беспокойтесь об этом слишком сильно, так как Python делает за нас большую часть сложной работы.

Σ: Это просто говорит о том, что мы суммируем значения, которые собираемся вычислить.

:= Это означает, что мы заменяем текущее значение значением, которое собираемся вычислить.

По сути, в этом алгоритме говорится следующее:

{

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

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

}

Теперь важное замечание о скорости обучения и начальных параметрах:

  1. Если скорость обучения слишком велика, градиентный спуск пропустит локальный минимум и будет бесконтрольно колебаться в разных точках
  2. Если скорость обучения слишком мала, алгоритму потребуется слишком много времени, чтобы достичь минимума, и потреблять мощность вашего компьютера.
  3. Исходные параметры обычно задаются случайным образом. Это известно как (да) случайная инициализация. Различные инициализации могут привести к тому, что алгоритм достигнет только локальных минимумов, а не глобального минимума.

Типы градиентного спуска

Алгоритм, описанный выше, называется пакетным градиентным спуском. Это название дано потому, что на каждом этапе вычисляется градиент для всего (пакета) набора данных. Вы, возможно, уже догадались, что для больших наборов данных это просто невыполнимо, так как время и вычислительная мощность, необходимые для такой работы, слишком велики. Это приводит нас к двум другим популярным «разновидностям» градиентного спуска:

  1. Стохастический градиентный спуск
  2. Мини-пакетный градиентный спуск

Стохастический градиентный спуск

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

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

Мини-пакетный градиентный спуск

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

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

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

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

  1. Градиентный спуск шаг за шагом от Statquest
  2. Градиентный спуск: ИИ для роботов от Udacity
  3. Курс Эндрю Н.Г. по машинному обучению на Coursera

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

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

Большое спасибо за прочтение этой статьи, и скоро у меня выйдет вторая часть, так что будьте к этому готовы, потому что именно тогда начинается настоящее веселье!