Скажем, я получил несколько
альфа и
бета в качестве параметров нейронной сети, которые будут параметрами бета-распределения. Теперь я беру выборку из бета-распределения, затем вычисляю некоторые потери и делаю обратное распространение по полученным выборкам. Возможно ли это сделать? учитывая, что после процесса выборки я выполняю
.requires_grad_(True) для выборки, а затем вычисляю потери? Это, конечно, работает, но похоже, что потери не сходятся. Есть ли другой способ сделать это в Pytorch?
Скажем, я получаю следующие переменные через некоторую нейронную сеть:
Скажем, я получаю следующие переменные через некоторую нейронную сеть:
Скажем, я получаю следующие переменные: p>
Где, скажем,
mu — это тензор в форме (batch_size x 30), аналогично
sigma — это тензор в форме (batch_size x 30). Я вычисляю
альфа и
бета, используя
мю и
сигму, полученные из нейронной сети (обе имеют одинаковую форму). (batch_size x 30)), а затем попробовать его с помощью бета-дистрибутива следующим образом:
Код: Выделить всё
def sample_from_beta_distribution(alpha, beta, eps=1e-6):
# Clamp alpha and beta to be positive
alpha_positive = torch.clamp(alpha, min=eps)
beta_positive = torch.clamp(beta, min=eps)
# Create a Beta distribution
# This will automatically broadcast to handle the batch dimension
beta_dist = torch.distributions.beta.Beta(alpha_positive, beta_positive)
# Sample from the distribution
# This will return samples of shape [38, 30]
samples = beta_dist.sample()
return samples
Здесь я беру
выборки, имеющие ту же форму, что и (batch_size x 30), выполняю над ними некоторые операции, а затем вычисляю потери. Я ожидал, что градиент будет распространяться через это, но похоже, что потери не сходятся.
Любые выводы могут помочь. Обратите внимание: это не так просто, как трюк с перепараметризацией в стандартном нормальном распределении.
Подробнее здесь:
https://stackoverflow.com/questions/793 ... in-pytorch