深度概率编程库¶
MindSpore深度概率编程的目标是将深度学习和贝叶斯学习结合,包括概率分布、概率分布映射、深度概率网络、概率推断算法、贝叶斯层、贝叶斯转换和贝叶斯工具箱,面向不同的开发者。对于专业的贝叶斯学习用户,提供概率采样、推理算法和模型构建库;另一方面,为不熟悉贝叶斯深度学习的用户提供了高级的API,从而不用更改深度学习编程逻辑,即可利用贝叶斯模型。
概率分布¶
概率分布(mindspore.nn.probability.distribution
)是概率编程的基础。Distribution
类提供多样的概率统计接口,例如概率密度函数pdf
、累积密度函数cdf
、散度计算kl_loss
、抽样sample
等。现有的概率分布实例包括高斯分布,伯努利分布,指数型分布,几何分布和均匀分布。
概率分布类¶
Distribution
:所有概率分布的基类。Bernoulli
:伯努利分布。参数为试验成功的概率。Exponential
:指数型分布。参数为率参数。Geometric
:几何分布。参数为一次伯努利试验成功的概率。Normal
:正态(高斯)分布。参数为均值和标准差。Uniform
:均匀分布。参数为数轴上的最小值和最大值。Categorical
:类别分布。每种类别出现的概率。LogNormal
:对数正态分布。参数为位置参数和规模参数。Gumbel
: 耿贝尔极值分布。参数为位置参数和规模参数。Logistic
:逻辑斯谛分布。参数为位置参数和规模参数。Cauchy
:柯西分布。参数为位置参数和规模参数。
Distribution基类¶
Distribution
是所有概率分布的基类。
接口介绍:Distribution
类支持的函数包括prob
、log_prob
、cdf
、log_cdf
、survival_function
、log_survival
、mean
、sd
、var
、entropy
、kl_loss
、cross_entropy
和sample
。分布不同,所需传入的参数也不同。只有在派生类中才能使用,由派生类的函数实现决定参数。
prob
:概率密度函数(PDF)/ 概率质量函数(PMF)。log_prob
:对数似然函数。cdf
:累积分布函数(CDF)。log_cdf
:对数累积分布函数。survival_function
:生存函数。log_survival
:对数生存函数。mean
:均值。sd
:标准差。var
:方差。entropy
:熵。kl_loss
:Kullback-Leibler 散度。cross_entropy
:两个概率分布的交叉熵。sample
:概率分布的随机抽样。get_dist_args
:概率分布在网络中使用的参数。get_dist_type
:概率分布的类型。
伯努利分布(Bernoulli)¶
伯努利分布,继承自Distribution
类。
属性:
Bernoulli.probs
:返回伯努利试验成功的概率,类型为Tensor
。
Distribution
基类调用Bernoulli
中私有接口以实现基类中的公有接口。Bernoulli
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入 试验成功的概率probs1
。entropy
:可选择传入 试验成功的概率probs1
。cross_entropy
,kl_loss
:必须传入dist
和probs1_b
。dist
为另一分布的类型,目前只支持此处为“Bernoulli”。probs1_b
为分布b
的试验成功概率。可选择传入分布a
的参数probs1_a
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入试验成功的概率probs
。sample
:可选择传入样本形状shape
和试验成功的概率probs1
。get_dist_args
:可选择传入试验成功的概率probs
。返回值为(probs,)
,类型为tuple。get_dist_type
:返回“Bernoulli”。
指数分布(Exponential)¶
指数分布,继承自Distribution
类。
属性:
Exponential.rate
:返回分布的率参数,类型为Tensor
。
Distribution
基类调用Exponential
私有接口以实现基类中的公有接口。Exponential
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入率参数rate
。entropy
:可选择传入率参数rate
。cross_entropy
,kl_loss
:必须传入dist
和rate_b
。dist
为另一分布的类型的名称, 目前只支持此处为“Exponential”。rate_b
为分布b
的率参数。可选择传入分布a
的参数rate_a
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入率参数rate
。sample
:可选择传入样本形状shape
和率参数rate
。返回值为(rate,)
,类型为tuple。get_dist_args
:可选择传入率参数rate
。返回值为(rate,)
,类型为tuple。get_dist_type
:返回“Exponential”。
几何分布(Geometric)¶
几何分布,继承自Distribution
类。
属性:
Geometric.probs
:返回伯努利试验成功的概率,类型为Tensor
。
Distribution
基类调用Geometric
中私有接口以实现基类中的公有接口。Geometric
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入试验成功的概率probs1
。entropy
:可选择传入 试验成功的概率probs1
。cross_entropy
,kl_loss
:必须传入dist
和probs1_b
。dist
为另一分布的类型的名称,目前只支持此处为“Geometric”。probs1_b
为分布b
的试验成功概率。可选择传入分布a
的参数probs1_a
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入试验成功的概率probs1
。sample
:可选择传入样本形状shape
和试验成功的概率probs1
。get_dist_args
:可选择传入试验成功的概率probs1
。返回值为(probs1,)
,类型为tuple。get_dist_type
:返回“Geometric”。
正态分布(Normal)¶
正态(高斯)分布,继承自Distribution
类。
Distribution
基类调用Normal
中私有接口以实现基类中的公有接口。Normal
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入分布的参数均值mean
和标准差sd
。entropy
:可选择传入分布的参数均值mean
和标准差sd
。cross_entropy
,kl_loss
:必须传入dist
,mean_b
和sd_b
。dist
为另一分布的类型的名称,目前只支持此处为“Normal”。
mean_b
和sd_b
为分布b
的均值和标准差。可选择传入分布的参数a
均值mean_a
和标准差sd_a
。
prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择分布的参数包括均值mean_a
和标准差sd_a
。sample
:可选择传入样本形状shape
和分布的参数包括均值mean_a
和标准差sd_a
。get_dist_args
:可选择传入分布的参数均值mean
和标准差sd
。返回值为(mean, sd)
,类型为tuple。get_dist_type
:返回“Normal”。
均匀分布(Uniform)¶
均匀分布,继承自Distribution
类。
属性:
Uniform.low
:返回分布的最小值,类型为Tensor
。Uniform.high
:返回分布的最大值,类型为Tensor
。
Distribution
基类调用Uniform
以实现基类中的公有接口。Uniform
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入分布的参数最大值high
和最小值low
。entropy
:可选择传入分布的参数最大值high
和最小值low
。cross_entropy
,kl_loss
:必须传入dist
,high_b
和low_b
。dist
为另一分布的类型的名称,目前只支持此处为“Uniform”。high_b
和low_b
为分布b
的参数。可选择传入分布a
的参数即最大值high_a
和最小值low_a
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入分布的参数最大值high
和最小值low
。sample
:可选择传入shape
和分布的参数即最大值high
和最小值low
。get_dist_args
:可选择传入分布的参数最大值high
和最小值low
。返回值为(low, high)
,类型为tuple。get_dist_type
:返回“Uniform”。
多类别分布(Categorical)¶
多类别分布,继承自Distribution
类。
属性:
Categorical.probs
:返回各种类别的概率,类型为Tensor
。
Distribution
基类调用Categorical
以实现基类中的公有接口。Categorical
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入分布的参数类别概率probs
。entropy
:可选择传入分布的参数类别概率probs
。cross_entropy
,kl_loss
:必须传入dist
,probs_b
。dist
为另一分布的类型的名称,目前只支持此处为“Categorical”。probs_b
为分布b
的参数。可选择传入分布a
的参数即probs_a
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入分布的参数类别概率probs
。sample
:可选择传入shape
和类别概率probs
。get_dist_args
:可选择传入分布的参数类别概率probs
。返回值为(probs,)
,类型为tuple。get_dist_type
:返回“Categorical”。
对数正态分布(LogNormal)¶
对数正态分布,继承自TransformedDistribution
类,由Exp
Bijector 和Normal
Distribution 构成。
属性:
LogNormal.loc
:返回分布的位置参数,类型为Tensor
。LogNormal.scale
:返回分布的规模参数,类型为Tensor
。
Distribution
基类调用LogNormal
及TransformedDistribution
中私有接口以实现基类中的公有接口。LogNormal
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入分布的位置参数loc
和规模参数scale
。entropy
:可选择传入分布的位置参数loc
和规模参数scale
。cross_entropy
,kl_loss
:必须传入dist
,loc_b
和scale_b
。dist
为另一分布的类型的名称,目前只支持此处为“LogNormal”。loc_b
和scale_b
为分布b
的均值和标准差。可选择传入分布的参数a
均值loc_a
和标准差sclae_a
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择分布的参数包括均值loc_a
和标准差scale_a
。Distribution
基类调用TransformedDistribution
私有接口。sample
:可选择传入样本形状shape
和分布的参数包括均值loc_a
和标准差scale_a
。Distribution
基类调用TransformedDistribution
私有接口。get_dist_args
:可选择传入分布的位置参数loc
和规模参数scale
。返回值为(loc, scale)
,类型为tuple。get_dist_type
:返回“LogNormal”。
柯西分布(Cauchy)¶
柯西分布,继承自Distribution
类。
属性:
Cauchy.loc
:返回分布的位置参数,类型为Tensor
。Cauchy.scale
:返回分布的规模参数,类型为Tensor
。
Distribution
基类调用Cauchy
中私有接口以实现基类中的公有接口。Cauchy
支持的公有接口为:
entropy
:可选择传入分布的位置参数loc
和规模参数scale
。cross_entropy
,kl_loss
:必须传入dist
,loc_b
和scale_b
。dist
为另一分布的类型的名称,目前只支持此处为“Cauchy”。loc_b
和scale_b
为分布b
的位置参数和规模参数。可选择传入分布的参数a
位置loc_a
和规模scale_a
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入分布的位置参数loc
和规模参数scale
。sample
:可选择传入样本形状shape
和分布的参数包括分布的位置参数loc
和规模参数scale
。get_dist_args
:可选择传入分布的位置参数loc
和规模参数scale
。返回值为(loc, scale)
,类型为tuple。get_dist_type
:返回“Cauchy”。
耿贝尔极值分布(Gumbel)¶
耿贝尔极值分布,继承自TransformedDistribution
类,由GumbelCDF
Bijector和Uniform
Distribution 构成。
属性:
Gumbel.loc
:返回分布的位置参数,类型为Tensor
。Gumbel.scale
:返回分布的规模参数,类型为Tensor
。
Distribution
基类调用Gumbel
中私有接口以实现基类中的公有接口。Gumbel
支持的公有接口为:
mean
,mode
,var
,sd
:无参数 。entropy
:无参数 。cross_entropy
,kl_loss
:必须传入dist
,loc_b
和scale_b
。dist
为另一分布的类型的名称,目前只支持此处为“Gumbel”。loc_b
和scale_b
为分布b
的位置参数和规模参数。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。sample
:可选择传入样本形状shape
。get_dist_args
:可选择传入分布的位置参数loc
和规模参数scale
。返回值为(loc, scale)
,类型为tuple。get_dist_type
:返回“Gumbel”。
逻辑斯谛分布(Logistic)¶
逻辑斯谛分布,继承自Distribution
类。
属性:
Logistic.loc
:返回分布的位置参数,类型为Tensor
。Logistic.scale
:返回分布的规模参数,类型为Tensor
。
Distribution
基类调用logistic
中私有接口以实现基类中的公有接口。Logistic
支持的公有接口为:
mean
,mode
,var
,sd
:可选择传入分布的位置参数loc
和规模参数scale
。entropy
:可选择传入分布的位置参数loc
和规模参数scale
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入分布的位置参数loc
和规模参数scale
。sample
:可选择传入样本形状shape
和分布的参数包括分布的位置参数loc
和规模参数scale
。get_dist_args
:可选择传入分布的位置参数loc
和规模参数scale
。返回值为(loc, scale)
,类型为tuple。get_dist_type
:返回“Logistic”。
泊松分布¶
泊松分布,继承自Distribution
类。
属性:
Poisson.rate
:返回分布的率参数,类型为Tensor。Distribution
基类调用Poisson
中私有接口以实现基类中的公有接口。Poisson
支持的公有接口为:mean
,mode
,var
,sd
:可选择传入分布的率参数 rate 。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入分布的率参数rate
。sample
:可选择传入样本形状shape 和分布的率参数 rate 。get_dist_args
:可选择传入分布的率参数rate
。返回值为(rate,)
,类型为tuple。get_dist_type
:返回“Poisson”。
伽马分布(Gamma)¶
伽马分布,继承自 Distribution
类。
属性:
Gamma.concentration
:返回分布的参数concentration
,类型为Tensor
。Gamma.rate
:返回分布的参数rate
,类型为Tensor
。
Distribution
基类调用 Gamma
中私有接口以实现基类中的公有接口。Gamma
支持的公有接口为:
mean
,mode
,sd
,var
:可选择传入分布的参数concentration
和参数rate
。entropy
:可选择传入分布的参数concentration
和参数rate
。prob
,log_prob
,cdf
,log_cdf
,survival_function
,log_survival
:必须传入value
。可选择传入分布的参数concentration
和参数rate
。cross_entropy
,kl_loss
:必须传入dist
,concentration_b
和rate_b
。dist
为另一分布的类型的名称,目前只支持此处为“Gamma”。concentration_b
和rate_b
为分布b
的参数。可选择传入分布a
的参数即concentration_a
和rate_a
。sample
:可选择传入样本形状shape
和分布的参数包括分布的参数concentration
和参数rate
。get_dist_args
:可选择传入分布的参数concentration
和参数rate
。返回值为(concentration, rate)
,类型为tuple。get_dist_type
:返回“Gamma”。
贝塔分布(Beta)¶
贝塔分布,继承自 Distribution
类。
属性:
Beta.concentration1
:返回分布的参数concentration1
,类型为Tensor
。Beta.concentration0
:返回分布的参数concentration0
,类型为Tensor
。
Distribution
基类调用 Beta
中私有接口以实现基类中的公有接口。Beta
支持的公有接口为:
mean
,mode
,sd
,var
:可选择传入分布的参数concentration1
和参数concentration0
。entropy
:可选择传入分布的参数concentration1
和参数concentration0
。prob
,log_prob
:必须传入value
。可选择传入分布的参数concentration1
和参数concentration0
。cross_entropy
,kl_loss
:必须传入dist
,concentration1_b
和concentration1_b
。dist
为另一分布的类型的名称,目前只支持此处为“Beta”。concentration1_b
和concentration1_b
为分布b
的参数。可选择传入分布a
的参数即concentration1_a
和concentration0_a
。sample
:可选择传入样本形状shape
和分布的参数包括分布的位置参数loc
和规模参数scale
。get_dist_args
:可选择传入分布的参数concentration1
和参数concentration0
。返回值为(concentration1, concentration0)
,类型为tuple。get_dist_type
:返回“Beta”。
概率分布类在PyNative模式下的应用¶
Distribution
子类可在PyNative模式下使用。
以Normal
为例, 创建一个均值为0.0、标准差为1.0的正态分布,然后计算相关函数。
[1]:
import mindspore as ms
import mindspore.nn.probability.distribution as msd
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="GPU")
my_normal = msd.Normal(0.0, 1.0, dtype=ms.float32)
mean = my_normal.mean()
var = my_normal.var()
entropy = my_normal.entropy()
value = ms.Tensor([-0.5, 0.0, 0.5], dtype=ms.float32)
prob = my_normal.prob(value)
cdf = my_normal.cdf(value)
mean_b = ms.Tensor(1.0, dtype=ms.float32)
sd_b = ms.Tensor(2.0, dtype=ms.float32)
kl = my_normal.kl_loss('Normal', mean_b, sd_b)
# get the distribution args as a tuple
dist_arg = my_normal.get_dist_args()
print("mean: ", mean)
print("var: ", var)
print("entropy: ", entropy)
print("prob: ", prob)
print("cdf: ", cdf)
print("kl: ", kl)
print("dist_arg: ", dist_arg)
mean: 0.0
var: 1.0
entropy: 1.4189385
prob: [0.35206532 0.3989423 0.35206532]
cdf: [0.30853754 0.5 0.69146246]
kl: 0.44314718
dist_arg: (Tensor(shape=[], dtype=Float32, value= 0), Tensor(shape=[], dtype=Float32, value= 1))
概率分布类在图模式下的应用¶
在图模式下,Distribution
子类可用在网络中。
[2]:
import mindspore.nn as nn
import mindspore as ms
import mindspore.nn.probability.distribution as msd
ms.set_context(mode=ms.GRAPH_MODE)
class Net(nn.Cell):
def __init__(self):
super(Net, self).__init__()
self.normal = msd.Normal(0.0, 1.0, dtype=ms.float32)
def construct(self, value, mean, sd):
pdf = self.normal.prob(value)
kl = self.normal.kl_loss("Normal", mean, sd)
return pdf, kl
net = Net()
value = ms.Tensor([-0.5, 0.0, 0.5], dtype=ms.float32)
mean = ms.Tensor(1.0, dtype=ms.float32)
sd = ms.Tensor(1.0, dtype=ms.float32)
pdf, kl = net(value, mean, sd)
print("pdf: ", pdf)
print("kl: ", kl)
pdf: [0.35206532 0.3989423 0.35206532]
kl: 0.5
TransformedDistribution类接口设计¶
TransformedDistribution
继承自Distribution
,是可通过映射f(x)变化得到的数学分布的基类。其接口包括:
属性
bijector
:返回分布的变换方法。distribution
:返回原始分布。is_linear_transformation
:返回线性变换标志。
接口函数(以下接口函数的参数与构造函数中
distribution
的对应接口的参数相同)。cdf
:累积分布函数(CDF)。log_cdf
:对数累积分布函数。survival_function
:生存函数。log_survival
:对数生存函数。prob
:概率密度函数(PDF)/ 概率质量函数(PMF)。log_prob
:对数似然函数。sample
:随机取样。mean
:无参数。只有当Bijector.is_constant_jacobian=true
时可调用。
PyNative模式下调用TransformedDistribution实例¶
TransformedDistribution
子类可在PyNative模式下使用。
这里构造一个TransformedDistribution
实例,使用Normal
分布作为需要变换的分布类,使用Exp
作为映射变换,可以生成LogNormal
分布。
[3]:
import numpy as np
import mindspore.nn as nn
import mindspore.nn.probability.bijector as msb
import mindspore.nn.probability.distribution as msd
import mindspore as ms
ms.set_context(mode=ms.PYNATIVE_MODE)
normal = msd.Normal(0.0, 1.0, dtype=ms.float32)
exp = msb.Exp()
LogNormal = msd.TransformedDistribution(exp, normal, seed=0, name="LogNormal")
# compute cumulative distribution function
x = np.array([2.0, 5.0, 10.0], dtype=np.float32)
tx = ms.Tensor(x, dtype=ms.float32)
cdf = LogNormal.cdf(tx)
# generate samples from the distribution
shape = ((3, 2))
sample = LogNormal.sample(shape)
# get information of the distribution
print(LogNormal)
# get information of the underlying distribution and the bijector separately
print("underlying distribution:\n", LogNormal.distribution)
print("bijector:\n", LogNormal.bijector)
# get the computation results
print("cdf:\n", cdf)
print("sample:\n", sample.shape)
TransformedDistribution<
(_bijector): Exp<exp>
(_distribution): Normal<mean = 0.0, standard deviation = 1.0>
>
underlying distribution:
Normal<mean = 0.0, standard deviation = 1.0>
bijector:
Exp<exp>
cdf:
[0.7558914 0.9462397 0.9893489]
sample:
(3, 2)
当构造TransformedDistribution
映射变换的is_constant_jacobian = true
时(如ScalarAffine
),构造的TransformedDistribution
实例可以使用直接使用mean
接口计算均值,例如:
[4]:
normal = msd.Normal(0.0, 1.0, dtype=ms.float32)
scalaraffine = msb.ScalarAffine(1.0, 2.0)
trans_dist = msd.TransformedDistribution(scalaraffine, normal, seed=0)
mean = trans_dist.mean()
print(mean)
2.0
图模式下调用TransformedDistribution实例¶
在图模式下,TransformedDistribution
类可用在网络中。
[5]:
import numpy as np
import mindspore.nn as nn
import mindspore as ms
import mindspore.nn.probability.bijector as msb
import mindspore.nn.probability.distribution as msd
ms.set_context(mode=ms.GRAPH_MODE)
class Net(nn.Cell):
def __init__(self, shape, dtype=ms.float32, seed=0, name='transformed_distribution'):
super(Net, self).__init__()
# create TransformedDistribution distribution
self.exp = msb.Exp()
self.normal = msd.Normal(0.0, 1.0, dtype=dtype)
self.lognormal = msd.TransformedDistribution(self.exp, self.normal, seed=seed, name=name)
self.shape = shape
def construct(self, value):
cdf = self.lognormal.cdf(value)
sample = self.lognormal.sample(self.shape)
return cdf, sample
shape = (2, 3)
net = Net(shape=shape, name="LogNormal")
x = np.array([2.0, 3.0, 4.0, 5.0]).astype(np.float32)
tx = ms.Tensor(x, dtype=ms.float32)
cdf, sample = net(tx)
print("cdf: ", cdf)
print("sample: ", sample.shape)
cdf: [0.7558914 0.86403143 0.9171715 0.9462397 ]
sample: (2, 3)
概率分布映射¶
Bijector(mindspore.nn.probability.bijector
)是概率编程的基本组成部分。Bijector描述了一种随机变量的变换方法,可以通过一个已有的随机变量X和一个映射函数f生成一个新的随机变量\(Y = f(x)\)。
Bijector
提供了映射相关的四种变换方法。它可以当做算子直接使用,也可以作用在某个随机变量Distribution
类实例上生成新的随机变量的Distribution
类实例。
Bijector类接口设计¶
Bijector基类¶
Bijector
类是所有概率分布映射的基类。其接口包括:
属性
name
:返回name
的值。is_dtype
:返回dtype
的值。parameter
:返回parameter
的值。is_constant_jacobian
:返回is_constant_jacobian
的值。is_injective
:返回is_injective
的值。
映射函数
forward
:正向映射,创建派生类后由派生类的_forward
决定参数。inverse
:反向映射,创建派生类后由派生类的_inverse
决定参数。forward_log_jacobian
:正向映射的导数的对数,创建派生类后由派生类的_forward_log_jacobian
决定参数。inverse_log_jacobian
:反向映射的导数的对数,创建派生类后由派生类的_inverse_log_jacobian
决定参数。
Bijector
作为函数调用:输入是一个Distribution
类:生成一个TransformedDistribution
(不可在图内调用)。
幂函数变换映射(PowerTransform)¶
PowerTransform
做如下变量替换:\(Y = g(X) = {(1 + X \times power)}^{1 / power}\)。其接口包括:
属性
power
:返回power
的值,类型为Tensor
。
映射函数
forward
:正向映射,输入为Tensor
。inverse
:反向映射,输入为Tensor
。forward_log_jacobian
:正向映射的导数的对数,输入为Tensor
。inverse_log_jacobian
:反向映射的导数的对数,输入为Tensor
。
指数变换映射(Exp)¶
Exp
做如下变量替换:\(Y = g(X)= exp(X)\)。其接口包括:
映射函数
forward
:正向映射,输入为Tensor
。inverse
:反向映射,输入为Tensor
。forward_log_jacobian
:正向映射的导数的对数,输入为Tensor
。inverse_log_jacobian
:反向映射的导数的对数,输入为Tensor
。
标量仿射变换映射(ScalarAffine)¶
ScalarAffine
做如下变量替换:\(Y = g(X) = scale\times X + shift\)。其接口包括:
属性
scale
:返回scale
的值,类型为Tensor
。shift
:返回shift
的值,类型为Tensor
。
映射函数
forward
:正向映射,输入为Tensor
。inverse
:反向映射,输入为Tensor
。forward_log_jacobian
:正向映射的导数的对数,输入为Tensor
。inverse_log_jacobian
:反向映射的导数的对数,输入为Tensor
。
Softplus变换映射(Softplus)¶
Softplus
做如下变量替换:\(Y = g(X) = \frac{log(1 + e ^ {sharpness \times X}\ \ \ \ \ \ )} {sharpness}\)。其接口包括:
属性
sharpness
:返回sharpness
的值,类型为Tensor
。
映射函数
forward
:正向映射,输入为Tensor
。inverse
:反向映射,输入为Tensor
。forward_log_jacobian
:正向映射的导数的对数,输入为Tensor
。inverse_log_jacobian
:反向映射的导数的对数,输入为Tensor
。
耿贝尔累计密度函数映射(GumbelCDF)¶
GumbelCDF
做如下变量替换:\(Y = g(X) = \exp(-\exp(-\frac{X - loc}{scale}))\)。其接口包括:
属性
loc
:返回loc
的值,类型为Tensor
。scale
:返回scale
的值,类型为Tensor
。
映射函数
forward
:正向映射,输入为Tensor
。inverse
:反向映射,输入为Tensor
。forward_log_jacobian
:正向映射的导数的对数,输入为Tensor
。inverse_log_jacobian
:反向映射的导数的对数,输入为Tensor
。
逆映射(Invert)¶
Invert
对一个映射做逆变换,其接口包括:
属性
bijector
:返回初始化时使用的Bijector
,类型为Bijector
。
映射函数
forward
:正向映射,输入为Tensor
。inverse
:反向映射,输入为Tensor
。forward_log_jacobian
:正向映射的导数的对数,输入为Tensor
。inverse_log_jacobian
:反向映射的导数的对数,输入为Tensor
。
PyNative模式下调用Bijector实例¶
在执行之前,我们需要导入需要的库文件包。双射类最主要的库是mindspore.nn.probability.bijector
,导入后我们使用msb
作为库的缩写并进行调用。
下面我们以PowerTransform
为例。创建一个指数为2的PowerTransform
对象。
[6]:
import numpy as np
import mindspore.nn as nn
import mindspore.nn.probability.bijector as msb
import mindspore as ms
ms.set_context(mode=ms.PYNATIVE_MODE)
powertransform = msb.PowerTransform(power=2.)
x = np.array([2.0, 3.0, 4.0, 5.0], dtype=np.float32)
tx = ms.Tensor(x, dtype=ms.float32)
forward = powertransform.forward(tx)
inverse = powertransform.inverse(tx)
forward_log_jaco = powertransform.forward_log_jacobian(tx)
inverse_log_jaco = powertransform.inverse_log_jacobian(tx)
print(powertransform)
print("forward: ", forward)
print("inverse: ", inverse)
print("forward_log_jacobian: ", forward_log_jaco)
print("inverse_log_jacobian: ", inverse_log_jaco)
PowerTransform<power = 2.0>
forward: [2.236068 2.6457515 3. 3.3166249]
inverse: [ 1.5 4. 7.5 12.000001]
forward_log_jacobian: [-0.804719 -0.9729551 -1.0986123 -1.1989477]
inverse_log_jacobian: [0.6931472 1.0986123 1.3862944 1.609438 ]
图模式下调用Bijector实例¶
在图模式下,Bijector
子类可用在网络中。
[7]:
import numpy as np
import mindspore.nn as nn
import mindspore as ms
import mindspore.nn.probability.bijector as msb
ms.set_context(mode=ms.GRAPH_MODE)
class Net(nn.Cell):
def __init__(self):
super(Net, self).__init__()
# create a PowerTransform bijector
self.powertransform = msb.PowerTransform(power=2.)
def construct(self, value):
forward = self.powertransform.forward(value)
inverse = self.powertransform.inverse(value)
forward_log_jaco = self.powertransform.forward_log_jacobian(value)
inverse_log_jaco = self.powertransform.inverse_log_jacobian(value)
return forward, inverse, forward_log_jaco, inverse_log_jaco
net = Net()
x = np.array([2.0, 3.0, 4.0, 5.0]).astype(np.float32)
tx = ms.Tensor(x, dtype=ms.float32)
forward, inverse, forward_log_jaco, inverse_log_jaco = net(tx)
print("forward: ", forward)
print("inverse: ", inverse)
print("forward_log_jacobian: ", forward_log_jaco)
print("inverse_log_jacobian: ", inverse_log_jaco)
forward: [2.236068 2.6457515 3. 3.3166249]
inverse: [ 1.5 4. 7.5 12.000001]
forward_log_jacobian: [-0.804719 -0.9729551 -1.0986123 -1.1989477]
inverse_log_jacobian: [0.6931472 1.0986123 1.3862944 1.609438 ]