Практические руководства

Пакетная многомерная гауссовская регрессия процесса с помощью GPyTorch

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

GPyTorch [2], пакет, разработанный для гауссовских процессов, использует значительные достижения в области аппаратного ускорения за счет бэкэнда PyTorch, пакетного обучения и вывода и аппаратного ускорения через CUDA. .

В этой статье мы рассмотрим конкретное приложение GPyTorch: подгонка моделей регрессии гауссовского процесса для пакетной, многомерной интерполяции.

Импорт и требования

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

Монтажный блок

Чтобы использовать GPyTorch для вывода, вам необходимо установить gpytorch и pytorch:

# Alternatively, you can install pytorch with conda
pip install gyptorch pytorch numpy matplotlib scikit-learn

Блокировка импорта

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

# GPyTorch Imports
import gpytorch
from gpytorch.models import ExactGP, IndependentModelList
from gpytorch.means import ConstantMean, MultitaskMean
from gpytorch.kernels import ScaleKernel, MultitaskKernel
from gpytorch.kernels import RBFKernel, RBFKernel, ProductKernel
from gpytorch.likelihoods import GaussianLikelihood, LikelihoodList, MultitaskGaussianLikelihood
from gpytorch.mlls import SumMarginalLogLikelihood, ExactMarginalLogLikelihood
from gpytorch.distributions import MultivariateNormal, MultitaskMultivariateNormal

# PyTorch
import torch

# Math, avoiding memory leak, and timing
import math
import gc
import math

Создание пакетной модели GPyTorch

Чтобы создать пакетную модель и вообще любую модель в GPyTorch, мы подклассифицируем класс gpytorch.models.ExactGP. Как и в стандартных моделях PyTorch, нам нужно только определить конструктор и forward методы для этого класса. В этой демонстрации мы рассматриваем два класса: один с ядром по всему нашему входному пространству, а другой с факторизованным ядром [5] по нашим различным входным данным.

Полный ввод, пакетная модель:

Эта модель вычисляет ядро ​​между всеми измерениями ввода, используя экспоненциальное ядро ​​RBF / Squared Exponential, которое заключено в гиперпараметр outputscale. Кроме того, у вас есть возможность использовать автоматическое определение релевантности (ARD) [2] для создания одного параметра масштаба длины для каждого измерения объекта.

Факторная модель ядра:

Эта модель вычисляет факторное ядро ​​между всеми измерениями входных данных, используя продукт RBF / Squared Exponential Kernels, каждое из которых учитывает отдельные измерения пространства функций. Это факторизованное ядро ​​продукта затем оборачивается гиперпараметром outputscale. Кроме того, у вас есть возможность использовать автоматическое определение релевантности (ARD) [2] для создания одного параметра масштаба длины для каждого измерения объекта в обоих ядрах RBF.

Предварительная обработка данных

Чтобы подготовить данные для подгонки регрессора гауссовского процесса, полезно подумать о том, как наши модели будут соответствовать. Чтобы воспользоваться преимуществами аппаратного ускорения и пакетной обработки с помощью PyTorch [3] и CUDA [4], мы будем моделировать каждый результат нашего предсказанного набора переменных как независимый.

Следовательно, если у нас есть B пакетов данных, которые нам нужно подогнать для интерполяции, каждый из них содержит N выборок с размером X C и Y-размер D, затем мы сопоставляем наши наборы данных со следующими измерениями:

  1. X-данные: (B, N, C) → (B * D, N, C)… Это достигается с помощью мозаики.
  2. Данные Y: (B, N, D) → (B * D, N)… Это достигается с помощью наложения.

В каком-то смысле мы мозаично размещаем наши X-мерные данные таким образом, что функции повторяются D раз для каждого значения, которое принимает вектор Y. Это означает, что каждая модель в нашем наборе пакетных моделей будет отвечать за изучение сопоставления между функциями одного пакета X и отдельной выходной функцией в том же пакете Y , в результате получается всего B * D моделей в нашей пакетной модели. Эта предварительная обработка (мозаика и укладка) выполняется с помощью следующего блока кода:

# Preprocess batch data
B, N, XD = Zs.shape
YD = Ys.shape[-1]
batch_shape = B * YD

if use_cuda:  # If GPU available
    output_device = torch.device('cuda:0')  # GPU

# Format the training features - tile and reshape
train_x = torch.tensor(Zs, device=output_device)
train_x = train_x.repeat((YD, 1, 1))

# Format the training labels - reshape
train_y = torch.vstack(
    [torch.tensor(Ys, device=output_device)[..., i] for i in range(YD)])
# train_x.shape
# --> (B*D, N, C)
# train_y.shape
# --> (B*D, N)

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

Обучение пакетным многомерным моделям георадара!

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

  1. Шкала длины
  2. Масштаб вывода
  3. Ковариационный шум (чистый и ограниченный)

Пожалуйста, посетите эту страницу [5] для получения дополнительной информации о роли каждого из этих гиперпараметров.

Эта обучающая функция представлена ​​ниже:

Выполнение вывода

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

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

X = {xi}, xi ~ N(0_d, I_d), i.i.d.

Y = sin (X) поэлементно, т.е. yi = sin (xi) для всех i

(Где 0_d и I_d относятся к d-мерному нуль-вектору (нулевое среднее) и d-мерной единичной матрице (тождественная ковариация). X и Y, указанные выше, будут служить нашими тестовыми данными.

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

Полученные результаты

В результате описанного выше эксперимента среднее значение RMSE по партиям составляет примерно 0,01. Попробуйте сами!

Ниже приведены результаты, полученные с помощью приведенного выше скрипта, где показаны прогнозируемые и истинные значения для каждого параметра в X и Y:

Ниже представлена ​​таблица со значениями RMSE, усредненными за 10 итераций для различных степеней дисперсии основного распределения данных:

Резюме

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

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

Следите за обновлениями, чтобы увидеть полный репозиторий GitHub!

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

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

[1] Оливер, Маргарет А. и Ричард Вебстер. «Кригинг: метод интерполяции для географических информационных систем». Международный журнал географической информационной системы 4.3 (1990): 313–332.

[2] Гарднер, Джейкоб Р. и др. «Gpytorch: гауссовский вывод матрично-матричного процесса Blackbox с ускорением графического процессора». Препринт arXiv arXiv: 1809.11165 (2018).

[3] Адам Пашке, Сэм Гросс, Франсиско Масса, Адам Лерер, Джеймс Брэдбери, Грегори Чанан, Тревор Киллин, Земинг Линь, Наталья Гимельшейн, Лука Антига, Альбан Десмезон, Андреас Копф, Эдвард Ян, Захари Де Вито, Мартин Рейсон, Алихан Теджани , Сасанк Чиламкурти, Бенуа Штайнер, Лу Фанг, Джунджи Бай и Сумит Чинтала. Pytorch: высокопроизводительная библиотека глубокого обучения императивного стиля. В: Х. Уоллах, Х. Ларошель, А. Бейгельзимер, Ф. дальче-Бук, Э. Фокс и Р. Гарнетт, редакторы, Успехи в системах обработки нейронной информации 32, страницы 8024–8035. Curran Associates, Inc., 2019.

[4] NVIDIA, Вингельманн, П., и Фитцек, Ф. Х. П. (2020). CUDA, выпуск: 10.2.89. Получено с https://developer.nvidia.com/cuda-toolkit.

[5] Kernel Cookbook, https://www.cs.toronto.edu/~duvenaud/cookbook/.