假设我已经从神经网络获得了一些 alphas 和 betas 作为参数,这些参数将成为 Beta 分布的参数。现在,我从 Beta 分布中进行采样,然后计算一些损失并通过获得的样本进行反向传播。可以这样做吗?鉴于在采样过程之后我对样本执行 .requires_grad_(True) 然后计算损失?这确实有效,但看起来损失没有收敛,在 Pytorch 中还有其他方法可以做到这一点吗?
比如说,我通过一些神经网络得到以下变量:
mu, sigma, pred = model.forward(input)
其中,mu是(batch_size x 30)形状的张量,类似地,sigma是(batch_size x 30)形状的张量。我使用从神经网络获得的 mu 和 sigma(两者形状相同 (batch_size x 30))计算 alphas 和 betas,然后通过 beta 分布对其进行采样,如下所示:
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)形状相同的samples,对其执行一些操作,然后计算损失。我预计梯度会通过它传播,但看起来损失没有收敛。
任何线索都会有所帮助。请注意,这并不像标准正态分布中的重新参数化技巧那么简单。
看起来
.rsample()
在这里发挥了作用,让计算图保持活力......