Построение масштабируемой и гибкой модели GP с помощью GPyTorch

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

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

Примечание. Это руководство не обязательно предназначено для изучения математических основ GP, но скорее предназначено для его создания с помощью GPyTorch. Я настоятельно рекомендую прочитать главу 2 Гауссовских процессов для машинного обучения для очень подробного введения в регрессию GP.

Настраивать

Прежде чем мы начнем, нам сначала нужно установить библиотеку gpytorch. Вы можете сделать это с помощью pip или conda, используя следующую команду:

# Install using pip
pip install gpytorch
# Install using conda
conda install gpytorch -c gpytorch

Вы также можете ознакомиться с требованиями и инструкциями по установке на их веб-сайте здесь.

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

Генерация данных

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

Мы оценим указанную выше функцию на 15 равноотстоящих точках из [0,1]. Сгенерированные данные обучения изображены на следующем графике:

Построение модели

Теперь, когда мы сгенерировали наши обучающие данные, мы можем приступить к построению нашей модели GP. GPyTorch предлагает нам гибкий способ построения моделей GP, создавая компоненты модели самостоятельно. Это аналогично построению нейронных сетей в стандартной библиотеке PyTorch. Для большинства регрессионных моделей GP вам потребуется построить следующие компоненты:

  1. Модель GP: для точных (т. е. без вариационных) моделей GP мы будем использовать gpytorch.models.ExactGP.
  2. Функция правдоподобия: функцию правдоподобия для регрессии GP, мы обычно используем gpytorch.likelihoods.GaussianLikelihood.
  3. Функция среднего: априорное среднее значение GP. Если вы не знаете, какую функцию среднего значения использовать, gpytorch.means.ConstantMean() обычно хорошее место для начала.
  4. Функция ядра: априорная ковариация GP. Для этого урока мы будем использовать ядро Spectral Mixture (SM) (gpytorch.kernels.SpectralMixtureKernels()).
  5. Многомерное нормальное распределение: многомерное нормальное распределение в GP (gpytorch.distributions.MultivariateNormal)

Мы можем построить нашу модель GP, построив указанные выше компоненты следующим образом:

Позвольте мне разобрать приведенный выше код построчно:

  • Вышеупомянутая модель GP состоит из двух основных компонентов: метода __init__ и forward.
  • Метод __init__ принимает обучающие данные и вероятность в качестве входных данных и создает любые объекты, необходимые для метода forward модели. Чаще всего это такие объекты, как функция среднего и функция ядра.
  • Метод forward принимает данные x и возвращает многомерное нормальное распределение с предварительным средним значением и ковариацией, оцененными в x.
  • Наконец, мы инициализируем функцию правдоподобия для модели GP. Здесь мы используем гауссовское правдоподобие, которое представляет собой простейшую функцию правдоподобия, которая предполагает гомоскедастическую модель шума (т.е. все входные данные имеют одинаковый шум).

Обучение модели

Теперь, когда мы построили модель, мы можем обучить ее находить оптимальные гиперпараметры. Обучение модели GP в GPyTorch также аналогично обучению нейронной сети в стандартной библиотеке PyTorch. Цикл обучения в основном состоит из следующих шагов:

  1. Установка всех градиентов параметров на ноль
  2. Вызов модели и вычисление убытка
  3. Обратный вызов потери, чтобы заполнить градиенты
  4. Шаг за шагом к оптимизатору

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

Код для цикла обучения приведен ниже:

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

Делаем прогнозы с помощью модели

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

В приведенном выше коде происходит несколько вещей:

  • Сначала мы генерируем тестовые данные, используя 50 равноотстоящих точек из [0, 5].
  • Мы переводим модель в режим оценки, вызывая model.eval() и likelihood.eval().
  • Мы используем gpytorch.settings.fast_pred_var(), чтобы получать более быстрые прогнозные распределения с помощью LOVE.
  • При переходе в режим оценки обученная модель GP возвращает MultivariateNormal, содержащий апостериорное среднее значение и ковариацию. Таким образом, мы можем получить прогнозное среднее и ковариационную матрицу из многомерного нормального распределения.
  • Наконец, мы наносим на график среднее значение и область достоверности подобранной модели GP. Метод confidence_region() - это вспомогательный метод, который возвращает 2 стандартных отклонения выше и ниже среднего.

Итоговый сюжет изображен ниже:

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

Выводы

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

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

Спасибо за прочтение!

  • Следуйте за мной на Medium, чтобы узнать больше
  • Давайте подключимся к LinkedIn

Если вам это понравилось, вам также могут понравиться: