Плохо подходит для простых двумерных гауссовских процессов в GPyTorch
У меня много трудностей при установке простого 2-мерного GP с помощью GPyTorch. Как вы можете видеть ниже, подгонка очень плохая и не сильно улучшается при замене ядра RBF на что-то вроде Matern. Оптимизация, кажется, сходится, но не в чем-то разумном.
class GPRegressionModel(gpytorch.models.ExactGP):
def __init__(self, train_x, train_y, likelihood):
super(GPRegressionModel, self).__init__(train_x, train_y, likelihood)
self.mean_module = gpytorch.means.ConstantMean()
self.covar_module = gpytorch.kernels.ScaleKernel(
gpytorch.kernels.RBFKernel(ard_num_dims=2),
)
def forward(self, x):
mean_x = self.mean_module(x)
covar_x = self.covar_module(x)
return gpytorch.distributions.MultivariateNormal(mean_x, covar_x)
У кого-нибудь есть хорошие учебные примеры помимо тех, которые включены в документы?
1 ответ
Я столкнулся с подобными проблемами, пытаясь подогнать многомерные гауссовские процессы. Пара предложений (не уверен, сработают ли они):
Попробуйте использовать
ZeroMean
, а не постоянное среднее. Возможно, наличие большего количества гиперпараметров (постоянных средних значений гиперпараметров) может привести к-mll
стремиться к локальным минимумам, а не к глобальным минимумам. Используя другой оптимизатор, напримерlbfgs
(который является вторым порядком, а неadam
или жеsgd
, которые оба относятся к первому порядку) также могут помочь в этом.Попробуйте нормализовать ваши входные данные с помощью нормализации min-max , а ваши цели - с помощью стандартной нормальной
N(0,1)
нормализация. Короче говоря, эти шаги нормализации гарантируют, что ваши данные соответствуют априорным значениям по умолчанию для этих моделей георадара. Чтобы узнать больше об этом, ознакомьтесь с этой проблемой на GitHub.Попробуйте изменить скорость обучения для оптимизации ваших гиперпараметров или количество эпох, для которых вы это тренируете.
Если вы видите какие-либо проблемы с числовой точностью (особенно после нормализации, если вы решите ее использовать), попробуйте изменить свою модель и наборы данных на удвоенную, 64-битную точность, преобразовав тензоры резака в тензоры двойной точности с помощью
tensor.double()
.
Опять же, не могу гарантировать, что это решит проблемы, с которыми вы столкнулись, но, надеюсь, они помогут!