Применение Градиентного Спуска На Реальной Земле

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

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

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

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

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

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

Но здесь мы ничего не прогнозируем, поэтому «ошибок» у нас нет, поэтому адаптация к наземным путешествиям требует немного расширения контекста обычного машинного обучения.

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

То есть мы определяем «веса» как широту и долготу, а «функцию стоимости» как текущую высоту.

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

К сожалению, у нас нет математической функции для всей земной поверхности, поэтому значения стоимости будем рассчитывать с помощью растра набор данных о высоте от НАСА:

  
  
   

import rasterio # Open the elevation dataset src = rasterio.open(sys.argv[1]) band = src.read(1) # Fetch the elevation def get_elevation(lat, lon): vals = src.index(lon, lat) return band[vals] # Calculate our 'cost function' def compute_cost(theta): lat, lon = theta[0], theta[1] J = get_elevation(lat, lon) return J

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

Он корректирует переменные так, чтобы они уменьшали функцию стоимости.

Это легко, если ваша функция стоимости является математической метрикой, такой как среднеквадратическая ошибка.

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



Применение градиентного спуска на реальной Земле

К счастью, градиент можно аппроксимировать так же, как путешественника в нашей аналогии: осмотревшись вокруг.

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

Это должно работать очень хорошо:

def gradient_descent(theta, alpha, gamma, num_iters): J_history = np.zeros(shape=(num_iters, 3)) velocity = [ 0, 0 ] for i in range(num_iters): cost = compute_cost(theta) # Fetch elevations at offsets in each dimension elev1 = get_elevation(theta[0] + 0.001, theta[1]) elev2 = get_elevation(theta[0] - 0.001, theta[1]) elev3 = get_elevation(theta[0], theta[1] + 0.001) elev4 = get_elevation(theta[0], theta[1] - 0.001) J_history[i] = [ cost, theta[0], theta[1] ] if cost <= 0: return theta, J_history # Calculate slope lat_slope = elev1 / elev2 - 1 lon_slope = elev3 / elev4 - 1 # Update variables theta[0][0] = theta[0][0] - lat_slope theta[1][0] = theta[1][0] - lon_slope return theta, J_history

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

Давайте запустим это гора Олимп в Вашингтоне:

Применение градиентного спуска на реальной Земле

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

Оптимизация по инерции Стандартный градиентный спуск — не единственный инструмент, поэтому давайте попробуем его.

оптимизация по инерции (оптимизация импульса).

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

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

здесь:

def gradient_descent(theta, alpha, gamma, num_iters): J_history = np.zeros(shape=(num_iters, 3)) velocity = [ 0, 0 ] for i in range(num_iters): cost = compute_cost(theta) # Fetch elevations at offsets in each dimension elev1 = get_elevation(theta[0] + 0.001, theta[1]) elev2 = get_elevation(theta[0] - 0.001, theta[1]) elev3 = get_elevation(theta[0], theta[1] + 0.001) elev4 = get_elevation(theta[0], theta[1] - 0.001) J_history[i] = [ cost, theta[0], theta[1] ] if cost <= 0: return theta, J_history # Calculate slope lat_slope = elev1 / elev2 - 1 lon_slope = elev3 / elev4 - 1 # Calculate update with momentum velocity[0] = gamma * velocity[0] + alpha * lat_slope velocity[1] = gamma * velocity[1] + alpha * lon_slope # Update variables theta[0][0] = theta[0][0] - velocity[0] theta[1][0] = theta[1][0] - velocity[1] return theta, J_history

После некоторой настройки переменных градиентный спуск должен иметь больше шансов найти океан:

Применение градиентного спуска на реальной Земле

Успех! Интересно наблюдать за поведением оптимизатора.

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

Последние мысли На самом деле Земля должна быть Очень простая функция для оптимизации.

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

Но наша планета страдает от локальных минимумов и невыпуклой географии.

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

Похоже, на Олимпе они неплохо поработали, так что давайте считать обычную аналогию, объясняющую градиентный спуск, «подтверждённой»! Если у вас есть какие-либо мысли по этому поводу, пожалуйста, дайте мне знать.

Твиттер ! Код проекта Здесь .

Теги: #Машинное обучение #Алгоритмы #Работа с 3D-графикой #градиентный спуск #инерция #оптимизация импульса #алгоритмы оптимизации

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.