заглушки Что такое градиентный спуск? - Unite.ИИ
Свяжитесь с нами:
Мастер-класс по ИИ:

AI 101

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

mm
обновленный on

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

Если вы читали о том, как обучаются нейронные сети, вы почти наверняка уже встречали термин «градиентный спуск». Градиентный спуск — это основной метод оптимизации производительности нейронной сети, позволяющий снизить уровень потерь/ошибок в сети. Тем не менее, градиентный спуск может быть немного сложным для понимания новичками в машинном обучении, и эта статья попытается дать вам хорошее представление о том, как работает градиентный спуск.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Блогер и программист со специализацией в Машинное обучение и Глубокое обучение темы. Дэниел надеется помочь другим использовать возможности ИИ на благо общества.