Как получить Якобиан с Pytorch для логарифмической вероятности многомерного нормального распределения - PullRequest
5 голосов
/ 29 октября 2019

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

import torch

mu = torch.ones((2,), requires_grad=True)
sigma = torch.eye(2)
dist = torch.distributions.multivariate_normal.MultivariateNormal(mu, sigma)

num_samples=10
samples = dist.sample((num_samples,))
logprobs = dist.log_prob(samples)

Теперь я хотел бы получить производную каждой записи в logprobs относительно каждой записи в mu.

* 1007. * Простое решение - цикл питона:
grads = []
for logprob in logprobs:
    grad = torch.autograd.grad(logprob, mu, retain_graph=True)
    grads.append(grad)

Если вы сложите грады, результатом будет желаемый якобиан. Есть ли встроенная и векторизованная поддержка для этого?

Смежные вопросы / интернет-ресурсы:

Это огромная тема, есть много связанных постов. Тем не менее, я думаю, что на этот конкретный вопрос (относительно дистрибутивов) еще не ответили:

  • Этот вопрос, в основном, такой же, как мой (но без примера кода и попытки решения), к сожалениюэто без ответа: Пользовательская функция Pytorch градиент Якоби

  • Этот вопрос показывает вычисление якобиана в Pytorch, но я не думаю, что решение применимо к моейзадача: Pytorch наиболее эффективный расчет Якобиана / Гессиана Требуется сложить входные данные таким образом, который кажется несовместимым с распределением. Я не мог заставить это работать.

  • В этом гистограмме есть некоторые фрагменты кода для якобиан. В принципе они похожи на подход из вопроса выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...