Основы ИИ

Что такое градиентный спуск?

mm
Добавьте Unite.AI в избранные источники в Google

Что такое градиентный спуск?

Если вы читали о том, как обучаются нейронные сети, вы, скорее всего, уже встречали термин “градиентный спуск”. Градиентный спуск – это основной метод оптимизации производительности нейронной сети, снижения скорости ошибок/потерь сети. Однако градиентный спуск может быть немного трудно понять для тех, кто новичок в машинном обучении, и эта статья попытается дать вам приличное представление о том, как работает градиентный спуск.

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

Что такое градиенты?

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

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

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

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

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

Расчет градиентов и градиентного спуска

Градиентный спуск начинается с точки высоких потерь и, пройдя через несколько итераций, делает шаги в направлении наименьших потерь, стремясь найти оптимальную конфигурацию весов. Фото: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

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

Потери = f(коэффициент)

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

дельта = функция_производной(потери)

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

коэффициент = коэффициент – (альфа * дельта)

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

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

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

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

Теперь, когда мы понимаем, как работает градиентный спуск в целом, давайте посмотрим на некоторые из разных типов градиентного спуска.

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

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

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

Блогер и программист с специализацией в Machine Learning и Deep Learning темах. Daniel надеется помочь другим использовать силу ИИ для социального блага.