GPyTorch 1.2 Examples : Exact GP (回帰) – スペクトル混合カーネルによる GP 回帰

GPyTorch 1.2 Examples : Exact GP (回帰) – スペクトル混合カーネルによる GP 回帰 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/04/2020 (1.2)

* 本ページは、GPyTorch 1.2 ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

Exact GP (回帰)

ガウスノイズモデルによる回帰はガウス過程の規範的な例題です。これらの例は小 ~ 中サイズ (~ 2,000 データポイント) のデータセットのために動作します。ここでの総ての例は exact GP 推論を利用しています。

  • 単純な GP 回帰 は GPyTorch の回帰のための基本的なチュートリアルです。
  • スペクトル混合回帰 はより複雑なカーネルで前の例の上で拡張します。
  • Fully Bayesian GP 回帰 は NUTS を使用して GP ハイパーパラメータをサンプリングすることにより fully Bayesian 推論をどのように遂行するかを実演します (この例は Pyro がインストールされている必要があります)。
  • Distributional GP 回帰 は入力の不確かさをどのように考慮に入れるかの例です。

 

Exact GP (回帰) – スペクトル混合カーネルによる GP 回帰

イントロダクション

この例題は ExactGP モデル上で SpectralMixtureKernel モジュールをどのように使用するかを示します。このモジュールは以下のために設計されています :

  • exact 推論を利用することを望むとき (e.g. 回帰のため)
  • RBF よりも洗練されたカーネルを使用することを望むとき

スペクトル混合 (SM) カーネルは Wilson et al., 2013 で考案されて議論されています。

import math
import torch
import gpytorch
from matplotlib import pyplot as plt

%matplotlib inline
%load_ext autoreload
%autoreload 2

次のセルでは、この例題のための訓練データをセットアップします。[0, 1] 上で 15 の規則的間隔のポイントを使用していきます、この上で関数を評価して訓練ラベルを得るためにガウスノイズを追加します。

train_x = torch.linspace(0, 1, 15)
train_y = torch.sin(train_x * (2 * math.pi))

 

モデルをセットアップする

モデルは 単純な回帰例題 の ExactGP モデルに非常に類似しているはずです。

唯一の違いがここにあります、より複雑なカーネル (SpectralMixtureKernel) を使用しています。このカーネルは正しく動作するためには注意深い初期化を必要とします。その目的で、モデルの __init__ 関数で、以下を呼び出します :

self.covar_module = gpytorch.kernels.SpectralMixtureKernel(n_mixtures=4)
self.covar_module.initialize_from_data(train_x, train_y)

これは、カーネルのハイパーパラメータを学習するために最適化を遂行するとき、合理的な初期化から始めることを確かなものにします。

class SpectralMixtureGPModel(gpytorch.models.ExactGP):
    def __init__(self, train_x, train_y, likelihood):
        super(SpectralMixtureGPModel, self).__init__(train_x, train_y, likelihood)
        self.mean_module = gpytorch.means.ConstantMean()
        self.covar_module = gpytorch.kernels.SpectralMixtureKernel(num_mixtures=4)
        self.covar_module.initialize_from_data(train_x, train_y)

    def forward(self,x):
        mean_x = self.mean_module(x)
        covar_x = self.covar_module(x)
        return gpytorch.distributions.MultivariateNormal(mean_x, covar_x)


likelihood = gpytorch.likelihoods.GaussianLikelihood()
model = SpectralMixtureGPModel(train_x, train_y, likelihood)

次のセルでは、ガウス過程のハイパーパラメータを訓練するために Type-II MLE の利用を処理しています。スペクトル混合カーネルのハイパーパラメータは initialize_from_data で指定されたものから開始します。

このステップのより多くの情報のためには 単純な回帰例題 を見てください。

# this is for running the notebook in our testing framework
import os
smoke_test = ('CI' in os.environ)
training_iter = 2 if smoke_test else 100

# Find optimal model hyperparameters
model.train()
likelihood.train()

# Use the adam optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=0.1)

# "Loss" for GPs - the marginal log likelihood
mll = gpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)

for i in range(training_iter):
    optimizer.zero_grad()
    output = model(train_x)
    loss = -mll(output, train_y)
    loss.backward()
    print('Iter %d/%d - Loss: %.3f' % (i + 1, training_iter, loss.item()))
    optimizer.step()
Iter 1/100 - Loss: 1.281
Iter 2/100 - Loss: 1.258
Iter 3/100 - Loss: 1.232
Iter 4/100 - Loss: 1.212
Iter 5/100 - Loss: 1.192
Iter 6/100 - Loss: 1.172
Iter 7/100 - Loss: 1.156
Iter 8/100 - Loss: 1.143
Iter 9/100 - Loss: 1.131
Iter 10/100 - Loss: 1.121
Iter 11/100 - Loss: 1.114
Iter 12/100 - Loss: 1.110
Iter 13/100 - Loss: 1.106
Iter 14/100 - Loss: 1.103
Iter 15/100 - Loss: 1.101
Iter 16/100 - Loss: 1.098
Iter 17/100 - Loss: 1.094
Iter 18/100 - Loss: 1.089
Iter 19/100 - Loss: 1.085
Iter 20/100 - Loss: 1.080
Iter 21/100 - Loss: 1.076
Iter 22/100 - Loss: 1.072
Iter 23/100 - Loss: 1.069
Iter 24/100 - Loss: 1.067
Iter 25/100 - Loss: 1.065
Iter 26/100 - Loss: 1.063
Iter 27/100 - Loss: 1.061
Iter 28/100 - Loss: 1.060
Iter 29/100 - Loss: 1.057
Iter 30/100 - Loss: 1.054
Iter 31/100 - Loss: 1.051
Iter 32/100 - Loss: 1.048
Iter 33/100 - Loss: 1.044
Iter 34/100 - Loss: 1.039
Iter 35/100 - Loss: 1.035
Iter 36/100 - Loss: 1.029
Iter 37/100 - Loss: 1.023
Iter 38/100 - Loss: 1.015
Iter 39/100 - Loss: 1.006
Iter 40/100 - Loss: 0.995
Iter 41/100 - Loss: 0.981
Iter 42/100 - Loss: 0.965
Iter 43/100 - Loss: 0.946
Iter 44/100 - Loss: 0.924
Iter 45/100 - Loss: 0.898
Iter 46/100 - Loss: 0.870
Iter 47/100 - Loss: 0.839
Iter 48/100 - Loss: 0.806
Iter 49/100 - Loss: 0.770
Iter 50/100 - Loss: 0.731
Iter 51/100 - Loss: 0.686
Iter 52/100 - Loss: 0.637
Iter 53/100 - Loss: 0.583
Iter 54/100 - Loss: 0.523
Iter 55/100 - Loss: 0.460
Iter 56/100 - Loss: 0.394
Iter 57/100 - Loss: 0.327
Iter 58/100 - Loss: 0.260
Iter 59/100 - Loss: 0.194
Iter 60/100 - Loss: 0.133
Iter 61/100 - Loss: 0.078
Iter 62/100 - Loss: 0.032
Iter 63/100 - Loss: -0.005
Iter 64/100 - Loss: -0.040
Iter 65/100 - Loss: -0.086
Iter 66/100 - Loss: -0.144
Iter 67/100 - Loss: -0.206
Iter 68/100 - Loss: -0.264
Iter 69/100 - Loss: -0.313
Iter 70/100 - Loss: -0.354
Iter 71/100 - Loss: -0.392
Iter 72/100 - Loss: -0.430
Iter 73/100 - Loss: -0.472
Iter 74/100 - Loss: -0.518
Iter 75/100 - Loss: -0.567
Iter 76/100 - Loss: -0.616
Iter 77/100 - Loss: -0.662
Iter 78/100 - Loss: -0.703
Iter 79/100 - Loss: -0.740
Iter 80/100 - Loss: -0.775
Iter 81/100 - Loss: -0.816
Iter 82/100 - Loss: -0.860
Iter 83/100 - Loss: -0.902
Iter 84/100 - Loss: -0.940
Iter 85/100 - Loss: -0.975
Iter 86/100 - Loss: -1.008
Iter 87/100 - Loss: -1.042
Iter 88/100 - Loss: -1.077
Iter 89/100 - Loss: -1.112
Iter 90/100 - Loss: -1.145
Iter 91/100 - Loss: -1.173
Iter 92/100 - Loss: -1.199
Iter 93/100 - Loss: -1.226
Iter 94/100 - Loss: -1.254
Iter 95/100 - Loss: -1.279
Iter 96/100 - Loss: -1.302
Iter 97/100 - Loss: -1.321
Iter 98/100 - Loss: -1.341
Iter 99/100 - Loss: -1.361
Iter 100/100 - Loss: -1.379

良いハイパーパラメータを学習した今、予測を行なうためにモデルを利用するときです。スペクトル混合カーネルは特に 外挿 (= extrapolation) にて良いです。その目的のため、モデルが区間 [0, 1] を過ぎてどのように上手く外挿する (= extrapolate) かを見ます。

次のセルで、ガウス過程モデルの平均と信頼領域をプロットします。confidence_region メソッドは平均の上と下の 2 標準偏差を返すヘルパーメソッドです。

# Test points every 0.1 between 0 and 5
test_x = torch.linspace(0, 5, 51)

# Get into evaluation (predictive posterior) mode
model.eval()
likelihood.eval()

# The gpytorch.settings.fast_pred_var flag activates LOVE (for fast variances)
# See https://arxiv.org/abs/1803.06058
with torch.no_grad(), gpytorch.settings.fast_pred_var():
    # Make predictions
    observed_pred = likelihood(model(test_x))

    # Initialize plot
    f, ax = plt.subplots(1, 1, figsize=(4, 3))

    # Get upper and lower confidence bounds
    lower, upper = observed_pred.confidence_region()
    # Plot training data as black stars
    ax.plot(train_x.numpy(), train_y.numpy(), 'k*')
    # Plot predictive means as blue line
    ax.plot(test_x.numpy(), observed_pred.mean.numpy(), 'b')
    # Shade between the lower and upper confidence bounds
    ax.fill_between(test_x.numpy(), lower.numpy(), upper.numpy(), alpha=0.5)
    ax.set_ylim([-3, 3])
    ax.legend(['Observed Data', 'Mean', 'Confidence'])

 
(訳注: 以下は gpytorch 1.1 ドキュメントのグラフ)

 

以上