Часть 2 из серии «Начало работы с глубоким обучением»

Что мы знаем до сих пор

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

  1. Определить, какое животное изображено на данной картинке (задача классификации);
  2. Определите цену подержанного автомобиля на основе его марки, даты производства, пробега и т. Д. (Проблема регрессии).

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

  1. Смоделируйте выход y как функцию входа x, параметризованную θ;
  2. Определите ошибку этой модели как функцию параметров θ;
  3. Найдите параметры θ, которые минимизируют функцию ошибок / потерь;
  4. Замените параметры значениями, найденными на предыдущем шаге, в функции шага 1.

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

Оптимизация машинного обучения

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

Производная полезна для минимизации функции, потому что она говорит нам, как изменить x, чтобы немного улучшить y.

Производная: определение и основы

Производное функции f определяется как

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

Величина и знак

Если f сильно изменяется в районе x, то числитель предела (1) будет большим по величине, и, следовательно, будет быть величиной f '. И наоборот, если f не сильно меняется вокруг x, то величина его производной будет небольшой. Таким образом, величина производной показывает, насколько изменяется f.

Теперь давайте посмотрим, что знак f ’ может сказать нам о функции. Если f ' положительно, то по (1), f (x + ε) ›f (x), и, следовательно, функция увеличивается. И наоборот, если f ’ отрицательно, тогда f (x + ε)‹ f (x), и поэтому f уменьшается.

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

Так что же происходит, когда производная равна 0?

Критические точки

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

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

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

Как можно использовать производную для решения задач оптимизации?

Вернемся к определению производной и посмотрим, насколько она полезна для задач оптимизации. Для небольшого ε мы можем аппроксимировать (1) с помощью

В задачах минимизации мы хотели бы сделать шаг ε, который приблизит нас к минимуму f, то есть так, чтобы f (x + ε) ‹F (x). Это приближение сообщает, как изменить x таким образом :

У нас есть 2 кейса:

  1. f ’(x)› 0. Тогда для выполнения последнего неравенства ε должно быть отрицательным.
  2. f ’(x)‹ 0. Точно так же ε должно быть положительным.

В любом случае ε должен иметь знак, противоположный f ’(x).

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

Сделайте шаг к минимуму

Поскольку ε должен иметь знак, противоположный f ’(x), мы можем определить его как

где α - небольшое положительное значение, называемое размером шага, которое определяет, насколько велик наш шаг. Таким образом мы гарантируем, что наш шаг ε находится в направлении, противоположном производной. Затем мы делаем шаг ε, обновляя x как

Пример: движение под уклон

Давайте посмотрим на пример, что наше правило обновления приближает нас к минимуму. Предположим, мы хотим минимизировать функцию f (x) = x² с производной f ’(x) = 2x. Пусть α = 0,1.

Начиная с x = 2:
Используя правило обновления, мы переходим к

На графике ниже мы показываем начальную точку синим цветом, а новую - красным. Мы можем заметить, что правило обновления приблизило нас к минимуму (x = 0).

Начиная с x = -1:
Если мы начнем с -1, правило обновления снова приблизит нас к минимуму:

Многомерный случай

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

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

Во-первых, нам нужно определить концепцию частной производной, которая является производной от f по заданной входной переменной в i-е измерение.

Частную производную можно вычислить так же, как и обычную производную, если вы думаете о f как о функции только от x_i (все другие переменные остаются постоянными).

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

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

Многомерный случай: сделайте шаг к минимуму

Помните правило производного обновления для одномерного случая:

Чтобы сделать шаг к минимуму в многомерном случае, нам нужно определить направление для каждого измерения x. Таким образом, мы выполняем не 1, а n обновлений (по одному для каждого измерения x), и мы заменяем производную ранее частной производной:

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

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

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

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

Резюме

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

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

использованная литература

[1] Книга Глубокое обучение Иэна Гудфеллоу, Йошуа Бенжио, Аарона Курвилля.

Благодарности

Эта публикация была написана с помощью Андре Пинто, также организатора сессий Deep Learning Sessions Lisboa.