通过 pytorch 中 Beta 分布的样本进行反向传播的问题

问题描述 投票:0回答:1

假设我已经从神经网络获得了一些 alphasbetas 作为参数,这些参数将成为 Beta 分布的参数。现在,我从 Beta 分布中进行采样,然后计算一些损失并通过获得的样本进行反向传播。可以这样做吗?鉴于在采样过程之后我对样本执行 .requires_grad_(True) 然后计算损失?这确实有效,但看起来损失没有收敛,在 Pytorch 中还有其他方法可以做到这一点吗?

比如说,我通过一些神经网络得到以下变量:

mu, sigma, pred = model.forward(input)

其中,mu是(batch_size x 30)形状的张量,类似地,sigma是(batch_size x 30)形状的张量。我使用从神经网络获得的 musigma(两者形状相同 (batch_size x 30))计算 alphasbetas,然后通过 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,对其执行一些操作,然后计算损失。我预计梯度会通过它传播,但看起来损失没有收敛。

任何线索都会有所帮助。请注意,这并不像标准正态分布中的重新参数化技巧那么简单。

python pytorch gradient-descent autograd
1个回答
0
投票

看起来

.rsample()
在这里发挥了作用,让计算图保持活力......

© www.soinside.com 2019 - 2024. All rights reserved.