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

Понимание градиентного спуска

Достигнем глобального минимума

Алгоритмы оптимизации - это алгоритмы, которые предназначены для схождения к решению. Решением здесь может быть локальный минимум или глобальный минимум за счет минимизации функции стоимости, например «L».

Что это за функция стоимости?

Функция стоимости - это показатель того, насколько хорошо наша модель делает прогнозы. Форма функции затрат определяет нашу цель оптимизации.

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

Если функция стоимости не является выпуклой функцией, наша цель - найти наименьшее возможное значение в окрестности.

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

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

Это алгоритм оптимизации первого порядка, потому что на каждой итерации алгоритм использует производную первого порядка для обновления параметров. Параметры относятся к коэффициентам в задаче регрессии или весам нейронной сети. Эти параметры обновляются градиентом, который указывает направление наискорейшего подъема. На каждой итерации это выполняется путем обновления параметров в направлении, противоположном градиенту, вычисленному для функции стоимости L, относительно параметров θ. Размер обновления определяется размером шага, который называется скорость обучения α.

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

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

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

Наиболее часто используемые скорости обучения: 0,3, 0,1, 0,03, 0,01, 0,003, 0,001.

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

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

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

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

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

Нормализация

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

Нормализация данных означает масштабирование данных для достижения (среднего) μ = 0 с (стандартным отклонением) σ = 1.

Рассмотрим n переменных характеристик. Экземпляр xᵢ можно масштабировать следующим образом:

Для масштабирования функций можно использовать класс Scikit-Learn StandardScaler.

Процедура оптимизации

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

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

Рассмотрим функцию стоимости L с параметрами θ. Его можно обозначить как L (θ). Наша цель - минимизировать эту функцию стоимости, найдя наилучшие значения параметра θ.

  1. Мы инициализируем наши параметры θ случайными значениями.
  2. Мы выбираем скорость обучения α и выполняем масштабирование функций (нормализацию).
  3. На каждой итерации алгоритма мы вычисляем градиент функции стоимости по каждому параметру и обновляем их следующим образом:

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

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

Если градиент больше 0, мы уменьшаем параметры на значение градиента, умноженное на скорость обучения α.

Вышеупомянутые шаги повторяются до тех пор, пока функция стоимости не сойдется. Под сходимостью мы подразумеваем градиент функции стоимости, равный 0.

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

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

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

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

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

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

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

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

Для реализации этого можно использовать scikit изучает класс SGDRegressor.

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

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

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

Размер партии может быть степенью 2, например 32,64 и т. Д.

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

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

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

Помимо оптимизации первого порядка

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

Итак, как измерить характер функции или ее кривизну? Он определяется производной второго порядка. Искривление влияет на наши тренировки.

Если производная второго порядка равна 0, кривизна называется линейной.

Если производная второго порядка больше 0, говорят, что кривизна движется вверх.

Если производная второго порядка меньше 0, говорят, что кривизна движется вниз.

Заключение

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

Изначально опубликовано на machinelearningmaster.

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

Найди меня в сети

Профиль GitHub: здесь я создаю вилку

Профиль LinkedIn: подключение и публикация профессиональных новостей

Twitter: Обмен техническими твитами

Спасибо