Bernoulli¶
伯努利分布由取值为 1 的概率 probs 参数进行初始化。
在概率论和统计学中,以瑞士数学家雅各布·伯努利命名的伯努利分布是随机变量的离散概率分布,其取值 1 的概率为 \(p\),值为 0 的概率为 \(q = 1 - p\) 。
该分布在可能的结果 k 上的概率质量函数为:
参数¶
probs (float|Tensor) - 伯努利分布的概率输入。数据类型为 float32 或 float64。范围必须为 \([0, 1]\)。
name (str,可选) - 操作的名称,一般无需设置,默认值为 None,具体用法请参见 Name。
代码示例¶
import paddle
from paddle.distribution import Bernoulli
# init `probs` with a float
rv = Bernoulli(probs=0.3)
print(rv.mean)
# Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
# 0.30000001)
print(rv.variance)
# Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
# 0.21000001)
print(rv.entropy())
# Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
# 0.61086434)
方法¶
sample(shape)¶
生成指定维度的样本。
参数
shape (Sequence[int]) - 指定生成样本的维度。
返回
Tensor,样本,其维度为 \(\text{sample shape} + \text{batch shape} + \text{event shape}\)。
代码示例
import paddle
from paddle.distribution import Bernoulli
rv = Bernoulli(paddle.full((), 0.3))
print(rv.sample([100]).shape)
# [100]
rv = Bernoulli(paddle.to_tensor(0.3))
print(rv.sample([100]).shape)
# [100]
rv = Bernoulli(paddle.to_tensor([0.3, 0.5]))
print(rv.sample([100]).shape)
# [100, 2]
rv = Bernoulli(paddle.to_tensor([0.3, 0.5]))
print(rv.sample([100, 2]).shape)
# [100, 2, 2]
rsample(shape, temperature=1.0)¶
重参数化采样,生成指定维度的样本。
rsample
是连续近似的伯努利分布重参数化样本方法。
[1] Chris J. Maddison, Andriy Mnih, and Yee Whye Teh. The Concrete Distribution: A Continuous Relaxation of Discrete Random Variables. 2016.
[2] Eric Jang, Shixiang Gu, and Ben Poole. Categorical Reparameterization with Gumbel-Softmax. 2016.
注解
rsample
后面需要跟一个 sigmoid
,从而将样本的值转换为单位间隔 \((0, 1)\)。
参数
shape (Sequence[int]) - 指定生成样本的维度。
temperature (float) -
rsample
的温度,必须为正值。
返回
Tensor,样本,其维度为 \(\text{sample shape} + \text{batch shape} + \text{event shape}\)。
代码示例
import paddle
from paddle.distribution import Bernoulli
paddle.seed(2023)
rv = Bernoulli(paddle.full((), 0.3))
print(rv.sample([100]).shape)
# [100]
rv = Bernoulli(0.3)
print(rv.rsample([100]).shape)
# [100]
rv = Bernoulli(paddle.to_tensor([0.3, 0.5]))
print(rv.rsample([100]).shape)
# [100, 2]
rv = Bernoulli(paddle.to_tensor([0.3, 0.5]))
print(rv.rsample([100, 2]).shape)
# [100, 2, 2]
# `rsample` has to be followed by a `sigmoid`
rv = Bernoulli(0.3)
rsample = rv.rsample([3])
rsample_sigmoid = paddle.nn.functional.sigmoid(rsample)
print(rsample, rsample_sigmoid)
# Tensor(shape=[3], dtype=float32, place=Place(gpu:0), stop_gradient=True,
# [-2.37732768, -0.61203325, -3.18344760]) Tensor(shape=[3], dtype=float32, place=Place(gpu:0), stop_gradient=True,
# [0.08491799, 0.35159552, 0.03979339])
# The smaller the `temperature`, the distribution of `rsample` closer to `sample`, with `probs` of 0.3.
print(paddle.nn.functional.sigmoid(rv.rsample([1000, ], temperature=1.0)).sum())
# Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
# 361.06829834)
print(paddle.nn.functional.sigmoid(rv.rsample([1000, ], temperature=0.1)).sum())
# Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
# 288.66418457)
cdf(value)¶
value
的累积分布函数 (CDF)
参数
value (Tensor) - 输入 Tensor。
返回
Tensor, value
的累积分布函数。
代码示例
import paddle
from paddle.distribution import Bernoulli
rv = Bernoulli(0.3)
print(rv.cdf(paddle.to_tensor([1.0])))
# Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
# [1.])
log_prob(value)¶
对数概率密度函数
参数
value (Tensor) - 输入 Tensor。
返回
Tensor, value
的对数概率密度函数。
代码示例
import paddle
from paddle.distribution import Bernoulli
rv = Bernoulli(0.3)
print(rv.log_prob(paddle.to_tensor([1.0])))
# Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
# [-1.20397282])
prob(value)¶
value
的概率密度函数。
参数
value (Tensor) - 输入 Tensor。
返回
Tensor, value
的概率密度函数。
代码示例
import paddle
from paddle.distribution import Bernoulli
rv = Bernoulli(0.3)
print(rv.prob(paddle.to_tensor([1.0])))
# Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
# [0.29999998])
entropy()¶
伯努利分布的信息熵。
返回
Tensor,伯努利分布的信息熵。
代码示例
import paddle
from paddle.distribution import Bernoulli
rv = Bernoulli(0.3)
print(rv.entropy())
# Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
# 0.61086434)
kl_divergence(other)¶
两个伯努利分布之间的 KL 散度。
参数
other (Bernoulli) -
Bernoulli
的实例。
返回
Tensor,两个伯努利分布之间的 KL 散度。
代码示例
import paddle
from paddle.distribution import Bernoulli
rv = Bernoulli(0.3)
rv_other = Bernoulli(0.7)
print(rv.kl_divergence(rv_other))
# Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
# 0.33891910)