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

ЧТО ТАКОЕ ГРАДИЕНТНЫЙ СПУСК В МАШИННОМ ОБУЧЕНИИ?

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

Теперь у нас возник вопрос: что такое градиент на самом деле? Я прав? Давайте углубимся.

«Градиент измеряет, насколько изменится результат функции, если вы немного измените входные данные». — Лекс Фридман (MIT)

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

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

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

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

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

Обратите внимание, что градиент от X0 до X1 намного длиннее градиента от X3 до X4. Это связано с тем, что крутизна/наклон холма, определяющая длину вектора, меньше. Это прекрасно отражает пример холма, потому что чем выше он поднимается, тем менее крутым становится холм. Таким образом, уменьшенный уклон сопровождается уменьшенным уклоном и уменьшенным размером шага для альпиниста.

Как работает градиентный спуск

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

Уравнение ниже описывает, что делает алгоритм градиентного спуска: b — следующая позиция нашего альпиниста, а a — его текущая позиция. Знак минус относится к части минимизации алгоритма градиентного спуска. Гамма в середине — это фактор ожидания, а член градиента (∆f(a)) — это просто направление самого крутого спуска.

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

Представьте, что у вас есть проблема машинного обучения и вы хотите обучить свой алгоритм градиентному спуску, чтобы минимизировать функцию стоимости J(w, b) и достичь ее локального минимума путем настройки ее параметров (w и b). На изображении ниже показаны горизонтальные оси, представляющие параметры (w и b), а функция стоимости J(w, b) представлена ​​на вертикальных осях. Градиентный спуск — выпуклая функция.

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

Скорость обучения градиентному спуску

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

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

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

Как решить проблемы градиентного спуска

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

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

Когда градиентный спуск больше не может уменьшать функцию стоимости и остается более или менее на том же уровне, она сходится. Количество итераций, необходимых для сходимости градиентного спуска, иногда может сильно различаться. Это может занять 50 итераций, 60 000 или, может быть, даже 3 миллиона, поэтому количество итераций, необходимых для сходимости, трудно оценить заранее.

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

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

Если график показывает, что кривая обучения просто движется вверх и вниз, не достигая на самом деле нижней точки, попробуйте уменьшить скорость обучения. Кроме того, начиная с градиентного спуска для решения конкретной задачи, просто попробуйте 0,001, 0,003, 0,01, 0,03, 0,1, 0,3, 1 и т. д. в качестве скорости обучения и посмотрите, какой из них работает лучше всего.