Хитрый и мощный алгоритм оптимизации

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

Итак, имеем ли мы дело с некоторыми реальными событиями в реальной жизни или с некоторыми технологическими продуктами, оптимизация является нашей конечной целью. Оптимизацию можно рассматривать как один из важнейших компонентов методов машинного обучения и глубокого обучения, которые широко используются в науке о данных. Один из самых популярных методов оптимизации - «Градиентный спуск».

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

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

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

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

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

Точно так же давайте возьмем еще один пример из реальной жизни, чтобы более четко понять концепцию.

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

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

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

Предположим, у нас есть функция стоимости J (θ0, θ1), которая зависит от параметров θ0 и θ1. Предположим, что изначально мы находимся в точке A. Наша цель - минимизировать нашу функцию затрат и достичь ее локального минимума (то есть точки B), настроив ее параметр (то есть θ0 и θ1).

Наброски

Изначально у нас есть функция, то есть J (θ0, θ1), и мы должны минимизировать J (θ0, θ1), настроив θ0 и θ1.

● Начните с некоторых θ0 и θ1.

● Продолжайте изменять θ0 и θ1, чтобы уменьшить J (θ0, θ1), пока мы, надеюсь, не достигнем минимума.

С математической точки зрения мы можем написать:

Мы должны обновить параметры одновременно в указанном порядке,

Здесь α - скорость обучения.

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

Гипотеза обычно представлена ​​в виде

и функция стоимости, представленная как

где m - количество обучающих примеров,

Теперь, чтобы найти θ0 и θ1, для которых мы оказываемся в минимуме функции, мы должны найти производную функции стоимости,

Теперь наш алгоритм градиентного спуска будет выглядеть примерно так:

Теперь у вас может возникнуть вопрос, какова скорость обучения? Каково соответствующее значение нашей скорости обучения альфа (α)? Как мы можем это настроить? Ну что ж, посмотрим.

Скорость обучения (α)

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

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

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

Отладка

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

Если градиентный спуск работает правильно, функция стоимости должна уменьшаться после каждой итерации, а когда функция стоимости уменьшается менее чем на 10–3, мы можем объявить сходимость. Количество итераций, необходимых для схождения градиентного спуска, иногда может сильно различаться. Это может занять 100, 1000 или даже миллион, что затрудняет предварительную оценку количества итераций для сходимости.

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

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

Существует три популярных типа градиентного спуска, которые различаются размером используемых данных:

● Пакетный градиентный спуск

● Стохастический градиентный спуск.

● Мини-пакетный градиентный спуск

1) Пакетный градиентный спуск:

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

2) Стохастический градиентный спуск:

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

3) Мини-пакетный градиентный спуск:

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

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

Будем считать, что m - общее количество обучающих примеров, а b - количество примеров в одном пакете, где b ‹m. Для простоты предположим, что b = 10 и m = 1000. Размер партии можно регулировать. Обычно его используют как степень 2. Причина этого заключается в том, что некоторое оборудование, такое как графические процессоры, обеспечивает лучшее время работы с обычными размерами пакетов, такими как степень 2.

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

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

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

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

Здесь мы узнаем о некоторых советах и ​​приемах, позволяющих максимально эффективно использовать алгоритм градиентного спуска.

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

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

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

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

Заключение

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

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