PyTorch 中 Distribution 采样对参数的梯度

13 篇文章 0 订阅
7 篇文章 0 订阅

Reparameterization Trick 及 Inverse Transform Sampling

Distribution 采样对参数的梯度

我们知道 Reparameterization Trick 是用简单的分布配合一些参数转化为更复杂的分布, 如标准正态分布 N ( 0 , 1 ) N(0,1) N(0,1) 配合参数 μ , σ \mu, \sigma μ,σ, 在从 N ( 0 , 1 ) N(0,1) N(0,1) 采样得到样本 x x x 后, 计算 y = x ∗ σ + μ y = x*\sigma + \mu y=xσ+μ 就得到对分布 N ( μ , σ ) N(\mu, \sigma) N(μ,σ) 的采样.

指数分布的累积分布函数为 F ( x ) = 1 − e − λ x ,   x > 0 F(x) = 1 - e^{-\lambda x}, ~ x>0 F(x)=1eλx, x>0, 根据逆变换采样方法, u = F ( x ) ∼ U n i f o r m ( 0 , 1 ) u = F(x) \sim Uniform(0,1) u=F(x)Uniform(0,1), 从均匀分布中采样一个 u u u, 再计算 x = F − 1 ( u ) = − 1 λ l n ( 1 − u ) x = F^{-1}(u) = -\frac{1}{\lambda}ln(1-u) x=F1(u)=λ1ln(1u) 就得到对指数分布的采样.

无论是简单分布的 Transform, 还是 Inverse Transform, 可以看到, 对于带参数的概率分布, 是可以计算样本 x x x 对参数 ( μ , σ ) (\mu, \sigma) (μ,σ) λ \lambda λ梯度的, 以便在模型优化过程中对概率分布的参数进行调整.

torch.distribution 模块实现了大多数常见的分布. 对于复杂的分布, 你可以继承基类 Distribution 自己实现. 如果参数设置为 requires_grad=True:

import torch
from torch import distributions, autograd

rate = torch.tensor(5.0, requires_grad=True)
exp_distri = distributions.Exponential(rate)

x = exp_distri.rsample()
print(x)

g = autograd.grad(x, rate)
print(g)

u = exp_distri.cdf(x)
print(torch.log(1 - u) / rate ** 2)

output:

样本:  tensor(0.5938, grad_fn=<DivBackward0>)
rate 的梯度:  (tensor(-0.1188),)
根据 Inverse Transform 计算的 rate 的梯度:  tensor(-0.1188, grad_fn=<DivBackward0>)

可见, PyTorch 中指数分布的采样应该是根据 Inverse Transform 进行采样的. 但无论怎样, 都是一个模式:

所以, 不必纠结梯度是怎样的, 它的计算要根据简单分布的 SamplingTransform 参数两部分得到.

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值