小白学Pytorch系列- -torch.distributions API Distributions (1)
分布包包含可参数化的概率分布和抽样函数。这允许构造用于优化的随机计算图和随机梯度估计器。这个包通常遵循TensorFlow分发包的设计。
不可能通过随机样本直接反向传播。但是,有两种主要方法可以创建可以反向传播的代理函数。这些是得分函数估计器/似然比估计器/REINFORCE 和路径导数估计器。REINFORCE 通常被视为强化学习中策略梯度方法的基础,而路径导数估计器通常出现在变分自动编码器的重新参数化技巧中。而得分函数只需要样本的值 f ( x ) f(x) f(x), 路径导数需要导数 F ‘ ( x ) F^‘(x) F‘(x). 下一节将在强化学习示例中讨论这两者。有关更多详细信息,请参阅 使用随机计算图进行梯度估计。
评分功能
当概率密度函数关于其参数可微时,我们只需要sample()
并 log_prob()
实现 REINFORCE:
Δ
θ
=
α
r
∂
log
p
(
a
∣
π
θ
(
s
)
)
∂
θ
\Delta \theta=\alpha r \frac{\partial \log p\left(a \mid \pi^\theta(s)\right)}{\partial \theta}
Δθ=αr∂θ∂logp(a∣πθ(s))
其中 θ θ θ是参数, α α α是学习率, r r r是奖励, p ( a ∣ π θ ( s ) ) p(a|πθ(s)) p(a∣πθ(s))是在给定策略πθ的情况下在状态 s s s中采取行动 a a a的概率。
在实践中,我们会从网络的输出中抽取一个动作,将这个动作应用到一个环境中,然后使用log_probb
来构造一个等效的损失函数。请注意,我们使用负数是因为优化器使用梯度下降,而上面的规则假设梯度上升。使用分类策略,实现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()
分布
分布是概率分布的抽象基类。
ExponentialFamily
Bernoulli
Beta
Binomial
Categorical
Cauchy
Chi2
ContinuousBernoulli
Dirichlet
Exponential
FisherSnedecor
Gamma
Geometric
Gumbel
HalfCauchy
HalfNormal
Independent
Kumaraswamy
LKJCholesky
Laplace
LogNormal
LowRankMultivariateNormal
MixtureSameFamily
Multinomial
MultivariateNormal
NegativeBinomial
Normal
OneHotCategorical
Pareto
Poisson
RelaxedBernoulli
LogitRelaxedBernoulli
RelaxedOneHotCategorical
StudentT
TransformedDistribution
基于一个基础分布和一系列分布变换构建一个新的分布。
-
arg_constraints
-
cdf(value) 通过反转变换和计算基本分布的分数来计算累积分布函数。
-
expand(batch_shape, _instance=None)
-
icdf(value) 使用变换和计算基本分布的分数计算逆累积分布函数。
-
log_prob(value) 通过反变换对样本进行评分,并使用基本分布的评分和对数ab(det)雅可比矩阵的评分计算评分。
log_prob(value)是计算value在定义的正态分布(mean,1)中对应的概率的对数,正太分布概率密度函数是
f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{-\frac{(x-\mu)^2}{2 \sigma^2}} f(x)=2πσ1e−2σ2(x−μ)2
对其取对数可得
log ( f ( x ) ) = − ( x − μ ) 2 2 σ 2 − log ( σ ) − log ( 2 π ) \log (f(x))=-\frac{(x-\mu)^2}{2 \sigma^2}-\log (\sigma)-\log (\sqrt{2 \pi}) log(f(x))=−2σ2(x−μ)2−log(σ)−log(2π) -
rsample(sample_shape=torch.Size([])) 如果分布参数是批处理的,则生成一个样本形状的重新参数化样本或重新参数化样本的样本形状的批处理。首先从基本分布中采样,并对列表中的每个转换应用transform()。
-
sample(sample_shape=torch.Size([])) 如果分布参数是批量的,则生成一个样本形状的样本或样本形状的样本批次。首先从基本分布中采样,并对列表中的每个转换应用transform()。