Я взял образцы из многомерного нормального распределения и хотел бы получить градиент их логарифмической вероятности относительно среднего. Поскольку существует много образцов, для этого требуется якобиан:
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 наиболее эффективный расчет Якобиана / Гессиана Требуется сложить входные данные таким образом, который кажется несовместимым с распределением. Я не мог заставить это работать.
В этом гистограмме есть некоторые фрагменты кода для якобиан. В принципе они похожи на подход из вопроса выше.