Практические приложения и методы алгоритмов градиентного спуска в машинном обучении

машинное обучение

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

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

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

Оптимизирован для широкого спектра приложений

  • Механика: проектирование поверхностей для аэрокосмической продукции;
  • Экономика: минимизация затрат;
  • Физика: время оптимизации в квантовых вычислениях;
  • Выбирайте лучшие маршруты доставки, оптимизируйте пространство на полках и многое другое.

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


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

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

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

Теперь давайте опишем этот сценарий в математических терминах.

Предположим, мы хотим узнать оптимальные параметры (θ0) и (θ1) алгоритма обучения. Как и в приведенном выше примере с альпинизмом, аналогичные горы и долины были обнаружены, когда мы построили трехмерное изображение функции J (θ) пространства стоимости. Когда ось z представляет стоимость J(θ), а ось x и ось z соответствуют параметрам θ0 и θ1 соответственно, холмы представлены красными областями с высокой стоимостью, а долины представлены синими районы с низкой стоимостью. Пространство затрат — это не что иное, как производительность алгоритма при выборе определенного значения параметра.

В настоящее время существует два основных типа алгоритмов градиентного спуска:

1.1 Метод сравнительного анализа приема данных

  1. Алгоритм градиентного спуска полной партии (полная партия)
  2. Стохастический градиентный спуск

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

1.2 Сравнительный анализ навыков дифференциации

  1. дифференциал первого порядка
  2. дифференциал второго порядка

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


2. Проблемы реализации градиентного спуска

Градиентный спуск — это метод, который работает в большинстве ситуаций. Но иногда градиентный спуск тоже не работает или не работает вообще. Есть три основные причины, по которым это происходит:

2.1 Проблемы с данными

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

2.2 Проблемы градиентов

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

2.3 Проблемы из-за сложности практического применения

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


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

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

3.1 Ванильный градиентный спуск

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

update = learning_rate * gradient_of_parameters
parameters = parameters - update

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


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

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

update = learning_rate * gradient
velocity = previous_update * momentum
parameter = parameter + velocity – update

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

3.3 Adagrad

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

grad_component = previous_grad_component + (gradient * gradient)
rate_change = square_root(grad_component)+epsilon
adapted_learning_rate = learning_rate * rate_change
update = adapted_learning_rate * gradient
parameter = parameter – update

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

3.4 Adam

Адам — это адаптивная техника, основанная на Адаграде, что еще больше смягчает его недостатки. Другими словами, это Импульс + Адаград. Псевдокод выглядит следующим образом:

adapted_gradient = previous_gradient + 
 ((gradient – previous_gradient) * (1 – beta1))
gradient_component = (gradient_change – previous_learning_rate)
adapted_learning_rate = previous_learning_rate + 
 (gradient_component * (1 – beta2))
update = adapted_learning_rate * adapted_gradient
parameter = parameter – update

где beta1 и beta2 — константы для проверки изменений градиента и скорости обучения.


4. Практическое применение алгоритма градиентного спуска.

Базовое применение градиентного спуска с использованием Python.

Затем мы используем оптимизацию градиентного спуска, чтобы найти лучшие параметры для модели глубокого обучения и использовать ее для задачи распознавания изображений. Наша задача: Распознать цифры на заданном изображении 28x28. Среди подготовленных изображений некоторые изображения используются для обучения, а остальные — для тестирования модели.

Вот основной код, определяющий Vanilla Gradient Descent:

params = [weights_hidden, weights_output, bias_hidden, bias_output]
def sgd(cost, params, lr=0.05):
 grads = T.grad(cost=cost, wrt=params)
 updates = []
 for p, g in zip(params, grads):
 updates.append([p, p - g * lr])
 return updates
updates = sgd(cost, params)

Давайте разберем и разберем этот код. Определим функцию sgd как зависимую переменную стоимости, params и lr, которая совпадает с J(θ), как упоминалось выше, а предыдущие θ0 и θ1 являются здесь параметрами и скоростью обучения алгоритма глубокого обучения. Мы установили скорость обучения по умолчанию на 0,05, но это значение можно изменить в любое время.

def sgd(cost, params, lr=0.05):


Затем мы определяем градиент по параметрам функции стоимости J(θ). Здесь мы используем библиотеку theano для поиска соответствующих градиентов и импортируем theano как T

grads = T.grad(cost=cost, wrt=params)

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

for p, g in zip(params, grads):
 updates.append([p, p - g * lr]

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

Prediction is: 8

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


5. Практические советы по применению градиентного спуска

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

  • заБыстрая сборкаПрототип, пожалуйста, используйте адаптивные методы, такие как Adam/Adagrad. Они очень недолговечны и не требуют особой настройки гиперпараметров.
  • получитьлучший эффект, вы должны использовать Vanilla Gradient Descent или Momentum. Хотя вычисления очень медленные, эти результаты в основном более точны, чем результаты адаптивных методов.
  • еслиданных малои подходит для одной итерации, вы можете использовать методы второго порядка, такие как l-BFGS. Потому что методы второго порядка очень быстрые и точные для достаточно малых данных.

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

Вот некоторые общие соображения при применении градиентного спуска:

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

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