Градиентный спуск - это широко используемый алгоритм оптимизации, используемый рядом алгоритмов машинного обучения. Алгоритмы машинного обучения имеют функции стоимости, которые вычисляют ошибку (прогнозируемое значение - фактическое значение) модели. Итак, лучшей моделью должна быть модель с минимальной стоимостью. Цель градиентного спуска - найти параметры модели, которые имеют минимальную стоимость. Когда мы передаем модель, которую хотели бы использовать, для градиентного спуска, она вычисляет стоимость с различными параметрами для модели и возвращает параметры, для которых стоимость является самой низкой. Вот визуальное представление о том, как это работает:

Представьте, что мы графически отображаем стоимость и параметры функции. Для реализации градиентного спуска функция должна быть выпуклой (U-образной). А теперь посмотрите на мяч, вот так происходит градиентный спуск. Обратите внимание, как мяч перестает катиться, когда достигает самой нижней точки? В этом суть нашей минимальной стоимости. Затем алгоритм возвращает значения параметров для этой стоимости.

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

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

Представьте, что у нас есть функция f (x) = x + 2, мы уже знаем, что наклон функции определяется изменением y / изменением x.

Это было довольно просто. Такие функции имеют постоянную скорость изменения. Что происходит, когда мы имеем дело с функцией, у которой нет постоянной скорости изменения? Как этот здесь:

Что ж, представьте секущую линию, проходящую через две точки. мы можем найти разницу между двумя точками в функции и вычислить скорость изменения этого участка функции. Если значение y определяется как f (x), то теперь наклон равен:

Теперь, как нам найти скорость изменения в конкретной точке функции? Как это вообще возможно, если формула наклона требует от нас найти разницу между двумя точками? Мы можем сделать это, используя две концепции: исчисление, пределы и дифференцирование. Не волнуйтесь, если вы плохо разбираетесь в исчислении, мы собираемся рассмотреть те части исчисления, которые нам нужны для этого алгоритма.

Ограничения:

Представьте себе построение минутной линии между двумя точками, очень близкими к определенному значению x с каждой стороны. Например, мы строим линию, которая соединяет точки 3.99 и 4.01, если конкретное значение x равно 4, и вычисляем наклон этой крошечной линии. Чтобы помочь нам построить эту линию, нам сначала нужно понять концепцию ограничений.

Итак, что такое лимит и почему нас это волнует?

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

При x = 2, f (x) = 4. Судя по всему, когда x = 1,99, тогда f (x) будет иметь значение немного ниже 4, а при x = 2,11 f (x) будет иметь значение немного выше 4. Таким образом, функция приближается к тому же значению 4 слева и справа от точки. Это дает нам ценную информацию о том, что функция является непрерывной и можно построить крошечную линию между x = 1,99 и x = 2,11.

Когда вы удлиняете эту линию, вы получаете касательную, наклон которой нам нужно вычислить.

Теперь посмотрим на эту прерывистую функцию:

В этой функции, когда x = 1,99, f (x) приближается к 1, а когда x = 2,11, f (x) приближается к 2. Они не приближаются к одному и тому же значению с обеих сторон, и функция является разрывной.

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

· Шаг 1: Представьте, что мы знаем, что x2 - x1 = h, если мы теперь подставим это в наше уравнение наклона, мы получим:

· Шаг 2: поскольку нам нужно найти две точки очень близко друг к другу, и мы хотим, чтобы значение h было как можно ближе к 0. Итак, мы берем предел при h → 0. Это производная функции. Производная функции y = f (x) переменной x является мерой скорости, с которой значение y функции изменяется относительно изменения переменной x. Дифференциация - это действие по вычислению производной. Он также чаще всего представлен как dy / dx.

Подставьте функцию и h = 0, и вы получите наклон функции в точке x. Аккуратный.

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

  1. Правило мощности. Производная по правилу мощности определяется по формуле:

2) 1) Цепное правило: Допустим, у нас есть переменная z, которая зависит от y, а y зависит от x. В этом случае мы используем серию функций для нахождения z, также известных как составные функции. Чтобы взять производную в такой ситуации, мы используем цепное правило. Где мы сначала дифференцируем dz / dy, а затем dy / dx и умножаем их.

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

Поздравляю! Теперь вы знаете, как найти наклон в точке функции.

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

· Используйте частичное дифференцирование, если функция является многомерной.

Теперь, когда мы вооружены этими знаниями, давайте посмотрим, как мы можем применить их в градиентном спуске.

Градиентный спуск:

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

Заметили минимум? Его также называют глобальным минимумом, самой низкой точкой функции. Это модель с параметрами, которая дает идеальный компромисс между смещением и дисперсией. Цель алгоритма градиентного спуска - найти глобальный минимум и вернуть его параметры.

Рассмотрим вашу модельную функцию с параметрами 0 и 1. По оси Y отложено значение стоимости, а по оси X - значения параметра. Алгоритм выполняет итерацию и выполняет следующие действия:

Где J (Θ) - функция стоимости, а j = 1,2 …… n, для каждого параметра α - скорость обучения, которая определяет размер шага, который мы делаем в определенном направлении. Это назначается разработчиком. Давайте разберемся:

1. Сначала мы инициализируем модель со случайными начальными параметрами.

2. Используя дифференцирование, алгоритм вычисляет скорость изменения в этой точке (представьте наклон касательной)

3. Обновляем значения параметров:

· Если наклон положительный, - α ∂ / ∂θj J (Θ) часть формулы будет отрицательным числом. Это означает, что это снизит значение теты. Визуально это означает, что мы вышли за рамки минимальной стоимости, и функция сделает шаг назад.

· Если наклон отрицательный, -α ∂ / ∂θj J (Θ) часть формулы будет положительным числом. Это означает, что это увеличит значение теты. Визуально это означает, что впереди минимальная стоимость и функция сделает шаг вперед.

· Если наклон равен нулю, - α ∂ / ∂θj J (Θ) будет равно нулю. Это означает, что он не будет обновлять значение теты. Это означает, что мы вышли на минимальную стоимость.

4. Функция возвращает значение параметров при достижении глобального минимума стоимости.

Даже самые незначительные действия - это шаги в правильном направлении

Убедитесь, что ваш алгоритм работает правильно:

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

· Количество итераций: количество итераций до сходимости зависит от размера ваших данных. Чтобы найти наилучшее количество итераций, нанесите на график минимальное количество и количество итераций. Вы можете видеть здесь, что после 300 линия выравнивается. Так что это хорошее количество итераций, и что-либо сверх этого бессмысленно.

· Скорость обучения α: хотя ваша скорость обучения уменьшается или увеличивается по мере продвижения, все же важно установить разумное значение. Если скорость обучения слишком мала, алгоритм будет медленно достигать глобального минимума. Если он слишком большой, он может никогда не достичь глобального минимума и, следовательно, никогда не сойтись.

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

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

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

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

Примечание. Если ваша функция стоимости имеет более одного минимума (локальный минимум), нет гарантии, что градиентный спуск достигнет глобального минимума.

Готово! Теперь вы знаете, как работает градиентный спуск. Надеюсь, это было полезно!

Источник:

1) https://towardsdatascience.com/understanding-the-mat Mathematics-behind-gradient-descent-dde5dc9be06e

2) Курс машинного обучения от Эндрю Нг

3) Основы математики для машинного обучения: курс Python Edition Edx