在 Pytorch 的 Distributions Package 中,Normal 的张量参数应该意味着什么?

What is a tensor argument to Normal supposed to mean in Distributions Package of Pytorch?

我理解torch.Normal(loc, scale)是一个class对应pytorch中的单变量正态分布。 我了解当 loc 和 scale 是数字时它是如何工作的。 问题是 torch.Normal 的输入是张量而不是数字。在那种情况下,我不太了解。这种张量参数的确切 interpretation/usage 是多少? 请参见下面代码中的示例 y_dist。 loc 和 scale 是 y_dist 的张量。这到底是什么意思?我不认为这会将单变量分布转换为多变量,是吗?它是否形成了一组单变量分布?

import torch as pt
ptd = pt.distributions
x_dist = ptd.Normal(loc = 2, scale = 3)
x_samples = x_dist.sample()

batch_size = 256
y_dist = ptd.Normal(loc = 0.25 * pt.ones(batch_size, dtype=pt.float32), scale = pt.ones(batch_size, dtype=pt.float32))

如你所说,如果loc (a.k.a. mu) 和scale ( a.k.a. sigma) 是浮点数然后它将从 normal distribution 中采样,loc 作为 mean , scale 作为 标准偏差.

提供张量而不是 floats 只会使其从多个正态分布中独立采样(当然不像 torch.distributions.MultivariateNormal

如果您查看 source code,您会看到 loc 和比例在 __init__ 上广播到相同的形状。


下面是展示此行为的示例:

>>> mu = torch.tensor([-10, 10], dtype=torch.float)
>>> sigma = torch.ones(2, 2)
>>> y_dist = Normal(loc=mu, scale=sigma)

以上mu是一维的,而sigma是二维的,但是:

>>> y_dist.loc
tensor([[-10.,  10.],
        [-10.,  10.]])

所以它将从 N(-10, 1) 获得两个样本,从 N(10, 1)

获得两个样本
>>> y_dist.sample()
tensor([[ -9.1686,  10.6062],
        [-10.0974,   8.5439]])

同样:

>>> mu = torch.zeros(2, 2)
>>> sigma = torch.tensor([0.001, 1000], dtype=torch.float)
>>> y_dist = Normal(loc=mu, scale=sigma)

广播scale是:

>>> y_dist.scale
tensor([[1.0000e-03, 1.0000e+01],
        [1.0000e-03, 1.0000e+01]])

>>> y_dist.sample()
tensor([[-8.0329e-04,  1.4213e+01],
        [-1.4907e-03,  3.1190e+02]])