小白学Pytorch系列- -torch.distributions API Distributions (1)

小白学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π σ1e2σ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μ)2log(σ)log(2π )

  • rsample(sample_shape=torch.Size([])) 如果分布参数是批处理的,则生成一个样本形状的重新参数化样本或重新参数化样本的样本形状的批处理。首先从基本分布中采样,并对列表中的每个转换应用transform()。

  • sample(sample_shape=torch.Size([])) 如果分布参数是批量的,则生成一个样本形状的样本或样本形状的样本批次。首先从基本分布中采样,并对列表中的每个转换应用transform()。

Uniform

VonMises

Weibull

Wishart

KL Divergence

Transforms

Constraints

Constraint Registry

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发呆的比目鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值