Введение

Градиентный спуск (GD) — это алгоритм оптимизации первого порядка, который используется для поиска минимума заданной функции. Он обычно используется при обучении алгоритмов машинного обучения и глубокого обучения.

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

Градиентный спуск работает для дифференцируемых и выпуклых функций.

Во-первых, из исчисления производная функции:

или некоторые могут знать это как:

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

Математически:

Функция f(x) является выпуклой, если для любых двух точек x1​ и x2​ в его области определения и любого λ в интервале [0,1] выполняется следующее неравенство:

Это неравенство по существу утверждает, что функция лежит ниже прямой линии, соединяющей две точки (x1​, f(x1​)) и (x2​, f(x2​)) для любого выбора λ от 0 до 1. Если это условие выполняется для всех пар точек и всех λ, то функция выпуклая. Подробнее можно узнать здесь

более простой способ узнать, выпукла ли она, - проверить, больше ли вторая производная функции 0.

Алгоритм градиентного спуска

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

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

В этой формуле:

  • θi+1​ представляет обновленные значения параметров в следующей итерации.
  • θi​ представляет текущие значения параметров.
  • α — это скорость обучения, положительная скалярная величина, определяющая размер шага.
  • J(θi​) представляет собой градиент функции затрат (или потерь) J относительно параметров θi​.

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

Реализация

Шаги реализации GD:

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

Допустим, у нас есть функция:

производная становится:

В питоне:

Затем у нас есть наша реализация градиентного спуска:

вызов функции:

На анимации выше показано, как использовать алгоритм градиентного спуска, когда скорость обучения равна 0,01, когда скорость обучения увеличивается примерно до 0,9.

Давайте проверим скорость обучения 1,0!

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

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

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

Получить код визуализации можно здесь

Если вы дочитали до конца, то вот вам крутая визуализация :)