在 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]])
我理解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]])