Https://arxiv.org/abs/1806.07366

Нейронные обыкновенные дифференциальные уравнения пытаются решить проблему данных временных рядов. Это новый подход, предложенный Университетом Торонто и Vector Institute. Эта статья была удостоена награды за лучшую работу Neurips 2018. В ней описывается новый метод решения проблем, открывший так много возможностей для традиционных подходов к машинному обучению.

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

Что мы освещаем

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

Что это за подход?
Как он работает?
Как это работает? (Обсуждено во 2-м блоге)

Это блог из 2 серий. Это первый из них, который охватывает основы. Чтобы понять динамику нейронного ODE и его обучение, я напишу вторую часть этого блога. Так что следите за обновлениями!

Чтобы понять основы, мы собираемся осветить предысторию, которая поможет нам собрать части вместе.

  • Основы машинного обучения
  • Основы нейронных сетей
  • Основы остаточных нейронных сетей
  • Дифференциальные уравнения
  • Обыкновенные дифференциальные уравнения.
  • Уравнения с частными производными
  • Решатели обыкновенных дифференциальных уравнений
  • Метод Эйлера

Машинное обучение с оптимизацией

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

Например, при переводе температуры из шкалы Фаренгейта в шкалу Цельсия. Нам дан некоторый ввод x в градусах Фаренгейта, мы применяем к нему функцию f и получаем результат y в шкале Цельсия.

(x°F − 32) × 5/9 = y°C

Здесь мы применяем эту функцию к нашему входу x и получаем результат y.

Но что, если мы не знаем функцию f?
Вот тут-то и вмешивается машинное обучение. Нам дается ввод x и вывод y. И нам нужно изучить функцию f, которая преобразует x в y.

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

Теперь машинное обучение работает так: оно принимает входной сигнал x, применяет к нему какое-то случайное преобразование с использованием линейной функции (m x + b) и производит результат y '.
Здесь случайный означает, что наклон m и смещение b случайны.

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

Затем предположим, что мы нашли почти правильные значения m и b, для которых x сопоставляется на y.

Но здесь есть одна загвоздка. На самом деле два.

  1. Как узнать, какие значения m и b изменить после вычисления ошибки?
  2. Это линейная функция. Как мы моделируем, если соответствие между x и y не является линейным?

Чтобы ответить на 1-й вопрос, нам нужно будет узнать, что такое оптимизация в машинном обучении и как она работает.

Оптимизация - это процесс использования некоторой потери (значения ошибки, мы будем использовать их взаимозаменяемость).
Поскольку мы собираемся оптимизировать m и b, потому что это параметры, которые можно изучить. Мы собираемся проверить, насколько их изменение меняет значение y.
Вам это кажется знакомым?

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

да

Дифференциальные уравнения.

Итак, в нашем случае у нас есть d (y) / d (m) и d (y) / d (b) (это частная производная. Мы вернемся к этому позже)

В основном мы хотим увидеть, насколько изменение m и b повлияет на y. Мы берем частную производную, потому что хотим изменить только m и b, а не x. Поскольку x является вводом и не может быть изменен. Скорость обучения определяет, насколько большие изменения мы хотим внести.

На второй вопрос отвечает функция, называемая функцией активации. Функция активации - это в основном функция, которая помогает моделировать нелинейное или сложное сопоставление между x и y. Есть много функций активации, о которых я не буду рассказывать в этой статье. Но нужно знать одно: эти функции должны быть дифференцируемыми.

So

  1. y ’= ACTIVATION_FUNTION (mx + b)
  2. L = Ошибка (y, y ’)
  3. d(y) / d(L) = 1
  4. d(y) / d(m) = ( d(L) / d(m) ) * ( d(y) / d(L) )
  5. d(y) / d(b) = ( d(L) / d(b) ) * ( d(y) / d(L) )
  6. m = m - (скорость_учения * (d (y) / d (m )))
  7. b = b - (скорость_учения * (d (y) / d (b )))
  8. ПОВТОРИТЬ

Нейронные сети

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

НАМ НУЖНО БОЛЬШЕ ФУНКЦИЙ.

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

Шаги, связанные с оптимизацией, такие же. За исключением некоторых изменений.

y1 = ACTIVATION_FUNTION (m1 x + b1)
y2 = ACTIVATION_FUNTION (m2 y1
+ b2)
y3 = ACTIVATION_FUNTION (m3 y2
+ b3)
….
….
….
y '= ACTIVATION_FUNTION (m n y ( n-1 ) + b n )

Идея состоит в том, чтобы добавить такие слои.

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

Градиенты текут одинаково. Здесь снова все дифференцируемо. И это важно

  1. y1 = ACTIVATION_FUNTION (m1 x + b1)
  2. y2 = ACTIVATION_FUNTION (m2 y1 + b2)
  3. y ’= ACTIVATION_FUNTION (м3 y2 + b3)
  4. L = Ошибка (y, y ’)
  5. d(y) / d(L) = 1
  6. d(y) / d(m3) = ( d(L) / d(m3) ) * ( d(y) / d(L) )
  7. d(y) / d(b3) = ( d(L) / d(b3) ) * ( d(y) / d(L) )
  8. d(y) / d(m2) = ( d(L) / d(m2) ) * ( d(y) / d(m3) )
  9. d(y) / d(b2) = ( d(L) / d(b2) ) * ( d(y) / d(m3) )
  10. d(y) / d(m1) = ( d(L) / d(m1) ) * ( d(y) / d(m2) )
  11. d(y) / d(b1) = ( d(L) / d(b1) ) * ( d(y) / d(m2) )
  12. m3 = m3 - (скорость_обучения * (d (y) / d (m3 )))
  13. b3 = b3 - (скорость_обучения * (d (y) / d (b3 )))
  14. m2 = m2 - (скорость_учения * (d (y) / d (m2 )))
  15. b2 = b2 - (скорость_обучения * (d (y) / d (b2 )))
  16. m1 = m1 - (скорость_обучения * (d (y) / d (m1 )))
  17. b1 = b1 - (скорость_обучения * (d (y) / d (b1 )))
  18. ПОВТОРИТЬ

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

А теперь как нам определиться с количеством слоев. Ответ на это: мы не знаем, как

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

Есть две конкретные причины,

  1. Переоснащение
  2. Исчезающие градиенты

Переоснащение можно пояснить на диаграмме ниже.

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

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

Остаточные нейронные сети

Остаточная нейронная сеть в точности такая же, как нейронная сеть, только с одной небольшой модификацией.

В обычной нейронной сети входные данные с одного уровня передаются на следующий уровень. Но в повторной сети (будет взаимозаменяемо использовать остаточную сеть и повторную сеть), мы не просто отправляем вывод некоторого слоя k на слой k + 1. Вместо этого мы вводим вывод k-го слоя, добавленного к входному k-слою.

хк + 1 = хк + Fxk

F - функция, представляющая один слой. F (xk) представляет собой результат k-го слоя. xk представляет вход k-го слоя. Они оба добавляются до того, как мы перейдем к следующему слою.

Производные против дифференциальных уравнений

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

Производная функции

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

Следовательно, производная - это просто оператор, вход которого является функцией, а выход также является функцией.

Дифференциальное уравнение

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

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

Например

f’’(x)+2f’(x) +f(x) = 7

Дифференциальные уравнения делятся на две основные части.

  1. Обыкновенные дифференциальные уравнения.
  2. Уравнения с частными производными

Уравнения с частными производными

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

Обыкновенные дифференциальные уравнения.

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

В приведенных выше примерах у нас есть только одна независимая переменная x.

Простым ODE будет df = f ’(x) .dx.

Решение обыкновенного дифференциального уравнения

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

Теперь есть несколько методов решения и ОДУ. Но обычно они предполагают использование антипроизводной или интеграла функции.

Попробуем решить простое ОДУ.

d(f) / d(x)=f’

F(x) = ∫ f(x)dx

F’(x) = f

Методы Эйлера

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

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

В этой ссылке дается очень хорошее объяснение метода Эйлера.

В основном метод утверждает, что дана некоторая начальная точка (x0, y0) и дифференциальное уравнение. Используя этот метод, мы можем оценить исходную функцию.

y(t+δ)=y(t)+δf(t,y)

Это формула метода Эйлера. Мы не собираемся видеть, как это происходит, но на самом деле посмотрим, как это работает.

Представьте, что мы хотим оценить функцию, которая является синей линией. Метод Эйлера гласит: начать с некоторой начальной точки A0, провести касательную с помощью дифференциального уравнения и достичь точки A1 и так далее. (Это очень наглядно показано в ссылке на видео).

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

Давай расслабимся

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

Основы машинного обучения

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

Некоторые базовые вычисления

Приближение функции f на основе заданного обыкновенного дифференциального уравнения.

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

Итак, в Neural ODE мы используем метод Эйлера для решения чего-то, что выглядит как остаточная сеть, но имеет только одну непрерывную единицу вместо множества дискретных единиц.
И способ оптимизации заключается в том, что мы используем
1. Изменение параметра Loss wrt (единица)
2. Изменение значения Loss относительно скрытого состояния (время t)
3. Изменения самих скрытых состояний

Целью этого блога было дать относительно более простое понимание основ для понимания нейронной ODE. Я расскажу о самой Neural ODE во второй части этой серии. Так что следите за обновлениями и спасибо.

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

Https://arxiv.org/abs/1806.07366

Https://jontysinai.github.io/jekyll/update/2019/01/18/understanding-neural-odes.html

Http://tutorial.math.lamar.edu/Classes/DE/EulersMethod.aspx

Https://www.khanacademy.org/math/ap-calculus-bc/bc-differential-equations-new/bc-7-5/v/eulers-method

Https://www.youtube.com/watch?v=AD3K8j12EIE&t=1491s

Https://rkevingibson.github.io/blog/neural-networks-as-normal-differential-equations/