distributions程序包包含可参数化的概率分布和采样函数。 这允许构造用于优化的随机计算图和随机梯度估计器。 该软件包通常遵循 TensorFlow Distributions 软件包的设计。
无法直接反向传播随机样本。 但是,有两种主要的方法可以创建可以反向传播的代理功能。 它们是得分函数估计器/似然比估计器/ REINFORCE 和路径导数估计器。 REINFORCE 通常被认为是强化学习中策略梯度方法的基础,而路径派生估计器通常出现在变分自动编码器的重新参数化技巧中。 虽然得分函数仅需要样本
的值,但路径导数需要导数
。 下一节将在强化学习示例中讨论这两个方面。
评分功能
当概率密度函数的参数可微时,我们只需要sample()和log_prob()即可实现 REINFORCE:
其中
是参数,
是学习率,
是奖励,
是在给定策略
的状态下在
状态下采取行动
的概率。
在实践中,我们将从网络的输出中采样一个动作,将该动作应用于环境中,然后使用log_prob构造等效的损失函数。 请注意,由于优化程序使用梯度下降,因此我们使用负值,而上述规则假定梯度上升。 使用分类策略,用于实现 REINFORCE 的代码如下:
probs = policy_network(state)
# Note that this is equivalent to what used to be called multinomial
m = Categorical(probs)
action = m.sample()
next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward
loss.backward()
路径导数
实现这些随机/策略梯度的另一种方法是使用rsample()方法中的重新参数化技巧,其中可以通过无参数随机变量的参数化确定性函数构造参数化随机变量。 因此,重新参数化的样本变得可微。 用于实现按路径导数的代码如下:
params = policy_network(state)
m = Normal(*params)
# Any distribution with .has_rsample == True could work based on the application
action = m.rsample()
next_state, reward = env.step(action) # Assuming that reward is differentiable
loss = -reward
loss.backward()
分配
class torch.distributions.distribution.Distribution(batch_shape=torch.Size([]), event_shape=torch.Size([]), validate_args=None)¶
基数:object
分布是概率分布的抽象基类。
property arg_constraints¶
返回从参数名称到 Constraint 对象的字典,此分布的每个参数都应满足该对象。 不是 tensor 的 Args 不必出现在此字典中。
property batch_shape¶
返回批处理参数的形状。
cdf(value)¶
返回以值评估的累积密度/质量函数。
参数
值 (tensor)–
entropy()¶
返回分配的熵,在 batch_shape 中批处理。
退货
形状 batch_shape 的张量。
enumerate_support(expand=True)¶
返回包含离散分布支持的所有值的张量。 结果将在维度 0 上枚举,因此结果的形状将为(基数)+ batch_shape + event_shape (其中对于单变量分布,其中 event_shape =())。
注意,这枚举所有以锁步 [[0,0],[1,1],…] 组成的张量。 在 expand = False 的情况下,枚举沿暗淡 0 进行,但其余批次尺寸为单例尺寸 [[0],[1],.. 。
要遍历整个笛卡尔积,请使用 itertools.product(m.enumerate_support())。
Parameters
扩展 (bool )–是否扩展对批次暗淡的支持以匹配发行版的 batch_shape 。
Returns
张量在维度 0 上迭代。
property event_shape¶
返回单个样品的形状(不分批)。
expand(batch_shape, _instance=None)¶
返回一个新的分发实例(或填充派生类提供的现有实例),其批次尺寸扩展为 batchshape 。 此方法在发行版的参数上调用 expand 。 因此,这不会为扩展的分发实例分配新的内存。 此外,首次创建实例时,此操作不会在 \_init**.py 中重复任何参数检查或参数广播。
Parameters
batch_shape (torch尺寸)–所需的扩展尺寸。
_instance -子类提供的需要重写 .expand 的新实例。
Returns
具有批次尺寸的新分发实例已扩展为 batch_size 。
icdf(value)¶
返回以值评估的逆累积密度/质量函数。
Parameters
value (Tensor) –
log_prob(value)¶
返回以值评估的概率密度/质量函数的对数。
Parameters
value (Tensor) –
property mean¶
返回分布的平均值。
perplexity()¶
返回分配的复杂性,按 batch_shape 批处理。
Returns
Tensor of shape batch_shape.
rsample(sample_shape=torch.Size([]))¶
如果分配了分布参数,则生成一个 sample_shape 形状的重新参数化样本或 sample_shape 形状的一批重新参数化样本。
sample(sample_shape=torch.Size([]))¶
如果分配参数是批处理的,则生成 sample_shape 形状的样本或 sample_shape 形状的样本批。
sample_n(n)¶
如果分配了分布参数,则生成 n 个样本或 n 个样本批次。
property stddev¶
返回分布的标准偏差。
property support¶
返回表示此发行版支持的 Constraint 对象。
property variance¶
返回分布的方差。
指数家族
class torch.distributions.exp_family.ExponentialFamily(batch_shape=torch.Size([]), event_shape=torch.Size([]), validate_args=None)¶
碱基: torch.distributions.distribution.Distribution
ExponentialFamily 是属于指数族的概率分布的抽象基类,其概率质量/密度函数的形式如下
其中
表示自然参数,
表示足够的统计量,
是给定族的对数归一化函数,
是载波测量。
注意
此类是分布类和属于指数家族的分布之间的中介,主要是检查 .entropy()和分析性 KL 散度方法的正确性。 我们使用此类使用 AD 框架和 Bregman 散度来计算熵和 KL 散度(由 Frank Nielsen 和 Richard Nock 提供,指数族的熵和交叉熵)。
entropy()¶
使用对数归一化器的 Bregman 散度来计算熵的方法。
伯努利
class torch.distributions.bernoulli.Bernoulli(probs=None, logits=None, validate_args=None)¶
碱基: torch.distributions.exp_family.ExponentialFamily
创建一个由 probs 或 logits 参数化的伯努利分布(但不能同时包含两者)。
样本为二进制(0 或 1)。 它们以概率 p 取值 1 ,以概率 1 -p 取值 0 。
例:
>>> m = Bernoulli(torch.tensor([0.3]))
>>> m.sample() # 30% chance 1; 70% chance 0
tensor([ 0.])
Parameters
概率(编号 , tensor)–采样 1 的概率
对数(编号 , tensor)–采样的对数奇数 1
arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}¶
entropy()¶
enumerate_support(expand=True)¶
expand(batch_shape, _instance=None)¶
has_enumerate_support = True¶
log_prob(value)¶
logits¶
property mean¶
property param_shape¶
probs¶
sample(sample_shape=torch.Size([]))¶
support = Boolean()¶
property variance¶
贝塔
class torch.distributions.beta.Beta(concentration1, concentration0, validate_args=None)¶
Bases: torch.distributions.exp_family.ExponentialFamily
由 concentration1 和 concentration0 参数化的 Beta 分布。
Example:
>>> m = Beta(torch.tensor([0.5]), torch.tensor([0.5]))
>>> m.sample() # Beta distributed with concentration concentration1 and concentration0
tensor([ 0.1046])
Parameters
浓度 1 (python:float 或 tensor)–分布的第一浓度参数(通常称为浓度参数) α)
浓度 0 (python:float 或 tensor)–分布的第二个浓度参数(通常称为 Beta)
arg_constraints = {'concentration0': GreaterThan(lower_bound=0.0), 'concentration1': GreaterThan(lower_bound=0.0)}¶
property concentration0¶
property concentration1¶
entropy()¶
expand(batch_shape, _instance=None)¶
has_rsample = True¶
log_prob(value)¶
property mean¶
rsample(sample_shape=())¶
support = Interval(lower_bound=0.0, upper_bound=1.0)¶
property variance¶
二项式
class torch.distributions.binomial.Binomial(total_count=1, probs=None, logits=None, validate_args=None)¶
Bases: torch.distributions.distribution.Distribution
创建由total_count和 probs 或 logits (但不是全部)参数化的二项分布。 total_count必须可与 probs / logits 广播。
Example:
>>> m = Binomial(100, torch.tensor([0 , .2, .8, 1]))
>>> x = m.sample()
tensor([ 0., 22., 71., 100.])
>>> m = Binomial(torch.tensor([[5.], [10.]]), torch.tensor([0.5, 0.8]))
>>> x = m.sample()
tensor([[ 4., 5.],
[ 7., 6.]])
Parameters
total_count (python:int 或 tensor)–伯努利试验次数
概率 (tensor)–事件概率
logits (tensor)–事件对数
arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0), 'total_count': IntegerGreaterThan(lower_bound=0)}¶
enumerate_support(expand=True)¶
expand(batch_shape, _instance=None)¶
has_enumerate_support = True¶
log_prob(value)¶
logits¶
property mean¶
property param_shape¶
probs¶
sample(sample_shape=torch.Size([]))¶
property support¶
property variance¶
分类的
class torch.distributions.categorical.Categorical(probs=None, logits=None, validate_args=None)¶
Bases: torch.distributions.distribution.Distribution
创建由 probs 或 logits (但不是全部)参数化的分类分布。
Note
等效于 torch.multinomial() 采样的分布。
样本是来自
的整数,其中 K 为probs.size(-1)。
如果 probs 为一维且长度为 K ,则每个元素都是在该索引处采样类别的相对概率。
如果 probs 为 2D,则将其视为一批相对概率向量。
Note
probs 必须为非负数,有限且总和为非零,并且将其归一化为 1。
另请参见: torch.multinomial()
Example:
>>> m = Categorical(torch.tensor([ 0.25, 0.25, 0.25, 0.25 ]))
>>> m.sample() # equal probability of 0, 1, 2, 3
tensor(3)
Parameters
概率 (tensor)–事件概率
logits (tensor)–事件对数
arg_constraints = {'logits': Real(), 'probs': Simplex()}¶
entropy()¶
enumerate_support(expand=True)¶
expand(batch_shape, _instance=None)¶
has_enumerate_support = True¶
log_prob(value)¶
logits¶
property mean¶
property param_shape¶
probs¶
sample(s