Плохо подходит для простых двумерных гауссовских процессов в 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 ответ

Я столкнулся с подобными проблемами, пытаясь подогнать многомерные гауссовские процессы. Пара предложений (не уверен, сработают ли они):

  1. Попробуйте использовать ZeroMean, а не постоянное среднее. Возможно, наличие большего количества гиперпараметров (постоянных средних значений гиперпараметров) может привести к -mllстремиться к локальным минимумам, а не к глобальным минимумам. Используя другой оптимизатор, например lbfgs (который является вторым порядком, а не adam или же sgd, которые оба относятся к первому порядку) также могут помочь в этом.

  2. Попробуйте нормализовать ваши входные данные с помощью нормализации min-max , а ваши цели - с помощью стандартной нормальной N(0,1)нормализация. Короче говоря, эти шаги нормализации гарантируют, что ваши данные соответствуют априорным значениям по умолчанию для этих моделей георадара. Чтобы узнать больше об этом, ознакомьтесь с этой проблемой на GitHub.

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

  4. Если вы видите какие-либо проблемы с числовой точностью (особенно после нормализации, если вы решите ее использовать), попробуйте изменить свою модель и наборы данных на удвоенную, 64-битную точность, преобразовав тензоры резака в тензоры двойной точности с помощью tensor.double().

Опять же, не могу гарантировать, что это решит проблемы, с которыми вы столкнулись, но, надеюсь, они помогут!

Вот несколько уроков, которые я собрал.

Другие вопросы по тегам