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

Еще одна причина, побудившая меня написать эту статью, — интервью, данное одной фирме некоторое время назад. Интервью прошло гладко, пока не дошло до того, что мне пришлось объяснять различные методы оптимизации, используемые в машинном обучении в целом. О, парень! Это было откровением, учитывая, как мало я знал об этих алгоритмах, хотя мы щедро используем «Адам», «RMS prop» и т. д. в обучении моделей!

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

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

Также здесь представлена ​​простая 3D-визуализация созданного набора данных, где x1, x2 — признаки, а y — регрессионное значение или фактическая метка. Показанный набор данных является идеальным минимально жизнеспособным кандидатом для тестирования будущих алгоритмов!

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

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

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

Целью любого алгоритма машинного обучения является минимизация функции стоимости. Это связано с тем, что меньшая ошибка между фактическими и прогнозируемыми значениями означает, что алгоритм отлично справился с обучением. Поскольку нам нужно наименьшее значение ошибки, нам нужны такие значения «w» — веса и «b» — смещения, которые дают наименьшую возможную ошибку или стоимость.

Пусть функция регрессии представляет собой простую линейную регрессию, которая может быть выражена как y = w*X + b, где w и b — соответствующие веса и коэффициенты смещения. w будет векторизован в большинстве случаев.

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

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

учитывая стоимость 'm'количества выборок, функция стоимости выражается как

Веса и смещения могут быть дополнительно выражены

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

На изображении выше J(w) обозначает функцию стоимости. В дальнейшем это будет называться только Cost или стоимостной функцией.

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

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

Если мы поместим это в код Python, пакетный градиентный спуск будет выглядеть так:

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

Стоимость и количество итераций можно изобразить, как показано ниже.

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

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

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

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

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

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

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

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

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

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

Ниже приведены методы, с помощью которых можно улучшить Vanilla SGD, Mini-batch и т. д., регулируя скорость их обучения на лету.

Градиентный спуск + Импульс

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

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

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

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

Ускоренный градиент Нестерова (NAG)

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

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

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

  1. Пакетный градиентный спуск
  2. Пакетный градиентный спуск с Momentum
  3. Ускоренный градиент Нестерова

Код, приведенный ниже, выполняет задание

каждая их эффективность также может быть визуализирована

Мы можем наблюдать колебания, используя Нестеров Ускоренный градиент меньше, чем оптимизатор SGD + Momentum. Из-за его способности смотреть вперед и замедляться.

Адаград

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

Adagrad использует разную скорость обучения для каждого параметра на каждом шаге или итерации.

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

Они визуализируются на графике ниже.

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

Поддержка RMS

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

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

Название RMS prop происходит от применяемого знаменателя (среднеквадратичного экспоненциального скользящего среднего члена Gt) к скорости обучения при обновлении весов. Код для реализации того же приведен ниже

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

Адам

ADAM или Adaptive Moment Estimation — это метод эффективной стохастической оптимизации, который требует только градиентов первого порядка с небольшими требованиями к памяти. Метод вычисляет индивидуальные скорости адаптивного обучения для различных параметров на основе оценок первого и второго моментов градиентов. Имя Адам происходит от адаптивной оценки момента. Он сочетает в себе преимущества двух ранее упомянутых методов: AdaGrad, который хорошо работает с разреженными градиентами, и RMSProp. Некоторые из преимуществ Адама заключаются в том, что величины обновлений параметров инвариантны к масштабированию градиента, размеры его шагов приблизительно ограничены гиперпараметрами размера шагов.

Экспоненциально затухающие параметры вычисляются следующим образом

Здесь Mt и Vt — первый и второй моменты градиентов соответственно. Точно так же для члена смещения можно вычислить моменты. Согласно интуиции Авторов, имя «Адам» получено из этих мгновенных терминов.

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

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

Фрагмент кода для реализации того же приведен ниже.

Итак, было замечено, что ADAM превосходит два других. Это наблюдение из реальной жизни при работе со сложными моделями с глубокими нейронными сетями. Еще одно наблюдение, которое можно было сделать, заключалось в том, что производительность Адама увеличивается с увеличением скорости обучения по сравнению с двумя другими.