python实现采样函数_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现

刘浚嘉:PR:机器人学的概率方法学习路径​zhuanlan.zhihu.com

PR 采样分章 第一节:蒙特卡洛采样、重要性采样

引言

还记得我们之前学过的贝叶斯推断吗?刘浚嘉:PR Ⅱ:贝叶斯估计/推断及其与MAP的区别​zhuanlan.zhihu.com

贝叶斯推断要解决的不是如何估计参数,而是用来估计新测量数据出现的概率,对于新出现的数据

那么实际项目中,我们如何计算贝叶斯估计里这个积分呢?基于采样的马尔可夫链蒙特卡罗(Markov Chain Monte Carlo,简称MCMC)方法

基于近似的变分推断(Variational Inference,简称VI)方法

本文主要介绍采样方法,其余的会在后续文章出现。

采样 —— 一种近似技术

当我们需要以较小的代价近似许多项的和或某个积分时,采样是一种很灵活且明智的选择。所以这不只是贝叶斯推断特有的方法,是一种普适性的积分近似技术。对于近似一个分布来说,从其中按概率分布采样来实现是一个非常自然的想法。

蒙特卡洛采样基础简述Monto Carlo:

1.蒙特卡洛方法Monte Carlo 可以通过采用随机投点法来求解不规则图形的面积。求解结果并不是一个精确值,而是一个近似值。当投点的数量越来越大时,该近似值也越接近真实值。

2. 蒙特卡洛方法也可以用于根据概率分布来随机采样的任务。

思路

把和或者积分视作某分布下的期望,然后通过估计对应的平均值来近似这个期望

这种思路就是加权求和,其权重为随机变量 x 的概率分布(求和时)或者概率密度函数(求积分时)。概率越高的地方,该变量被采样的几率越大,对应函数值的权重越大,故通过采样数据的经验平均可以近似整体的和或积分。

开始采样

我们根据

抽取 n 个样本

计算期望从而得到 s 的近似:

理论保障上述经验平均值是 无偏 的,

根据 大数定律,若样本

是独立同分布的,其平均值几乎必然收敛到期望值,

根据 中心极限定理,

的分布会收敛到以

为均值、

为方差的正态分布(只要

有界,那么方差

必然会趋于0。同时我们可以利用正态分布的累计函数来估计

的置信区间。

问题

这种方法过于理想,所有结论依赖于我们可以从基准分布 p(x) 中轻易地采样,因为大部分时候 p(x) 都是未知的或者是形状诡异的分布 。一个直观的改进方法是:能不能通过某种变换,将概率分布函数转化成我们熟知的一些简单分布,这样我们从标准分布中采样即可得到 p(x) 中采样一样的结果。

重要性采样 Importance Sampling (IS)

在上一节我们理所当然的把 p(x) 当成概率分布,f(x) 视为被积函数。 p(x)f(x)当然不是唯一的分解方式啦,当从 p(x) 中采样不可行时,我们也可以构造一个分解:

这样我们就可以把更便于采样的 q(x) 视作采样概率,然后估计

在此分布下的期望。相当于在新的采样函数下,函数值 f(x) 被乘上了一个采样权重或likelihood ratio

学RL的同学应该很熟悉重要性采样,在off-policy的算法中用来处理产生动作的策略和学习策略不一致的问题。通过一个简单的可预测的分布去估计一个服从另一个分布的随机变量的均值。

在实际应用off-policy时,迭代过程通常会有两个策略:Behavior policy,用于生成学习过程所需要选择的动作,这一个简单的,探索性非常强的关于动作选择的分布;

Target policy,这是我们最终希望得到的最优动作选择分布。

应用Importance Sampling可以通过Behavior policy估计Target policy可能反馈回来的收益的均值,即用一个简单分布去估计服从另一个分布的随机变量的均值。

Implementation

# 定义一个函数 f(x)

def f_x(x):

return 1/(1 + np.exp(-x))

# 定义两个分布 p(x), q(x)

def distribution(mu=0, sigma=1):

# return probability given a value

distribution = stats.norm(mu, sigma)

return distribution

# 采样点数

n = 1000

mu_target = 3.5

sigma_target = 1

mu_appro = 3

sigma_appro = 1

p_x = distribution(mu_target, sigma_target)

q_x = distribution(mu_appro, sigma_appro)

# 从 p(x) 采样,这里为了图方便p(x)也设定成了正态分布,所以看起来采样很容易,对于非高斯还是很麻烦的

s = 0

for i in range(n):

# draw a sample

x_i = np.random.normal(mu_target, sigma_target)

s += f_x(x_i)

print("simulate value", s/n) # 0.954

# 从 q(x) 进行重要性采样

value_list = []

for i in range(n):

# sample from different distribution

x_i = np.random.normal(mu_appro, sigma_appro)

value = f_x(x_i)*(p_x.pdf(x_i) / q_x.pdf(x_i))

value_list.append(value)

# mean: 0.949, variance: 0.304

从构造出的近似分布采样得到的均值很接近原分布的采样期望,验证了重要性采样的理论。

这个q(x)难道就可以随意设定吗?我们试验一下,当两个分布dissimilar的时候:

# 采样点数

n = 5000

mu_target = 3.5

sigma_target = 1

mu_appro = 1

sigma_appro = 1

p_x = distribution(mu_target, sigma_target)

q_x = distribution(mu_appro, sigma_appro)

通过 q(x) 得到的均值为 0.995,方差为83.86。

方差过大的原因是,当两个分布过于不同时,p(x)/q(x) 的值会有巨大的差异,从而增加了方差。正如PRML中所述:Hence a major drawback of the importance sampling method is the potential to produce results that are arbitrarily in error and with no diagnostic indication. This also highlights a key requirement for the sampling distribution

, namely that it should not be small or zero in regions where

may be significant.

即,approximate distribution的大体趋势应该和desired distribution保持一致,不能出现差别很大的分布特性。

一个好的 q 分布的选择可以显著地提高蒙特卡罗估计的效率,而一个糟糕的 q 分布选择则会使效率更糟糕。一般的经验是 q(x) 定义在 p(x)|f(x)| 较大的地方,由此我们引出了最优采样函数的概念。

最优采样函数——方差最小

我们可以推导出最优的采样函数

,对于任意蒙特卡洛采样:

可以转化为重要性采样:

显然,估计的期望和采样分布 q 的选择无关,

。但是方差却有关:

方差想要最小,q 就应该满足:

Z 为归一化常数,选择适当的 Z 使得

之和或者积分为 1。

一个好的采样函数,应该把更多的权重放在被积函数较大的地方。

观察上式,如果 f(x) 的符号一致,

,这意味着采样一个样本就足以得到原来的积分或和的值了。理论上确实是很美好,但这也意味着计算

和计算之前的 p(x)f(x) 没区别,这并没有什么实际意义。

有偏重要性采样

最优采样函数并不一定是适合采样的那个,只是方差最小的一个而已,其他能降低方差的 q 其实都可以。这种方法有一个优势,即不需要归一化的 p 或 q 分布。在处理离散变量时,有偏重要采样估计可以表示为

有偏是指

,只有当

且上式分母收敛到 1 时,等式才渐进成立。故也称为渐进无偏。

实际中,我们会倾向于将采样函数构造成常用的分布形式——高斯分布等,以方便采样。故有偏重要性采样更为常见。

延伸阅读Importance Sampling for Keras​www.idiap.ch

在神经网络训练中,通过重要性采样来取代之前的uniform data sampling,从而加速训练收敛。Importance Sampling & Sequential Importance Sampling - Berkeley​people.eecs.berkeley.edu

关联阅读刘浚嘉:PR Sampling Ⅱ:马尔可夫链蒙特卡洛 MCMC及python实现​zhuanlan.zhihu.com刘浚嘉:PR Sampling Ⅲ: M-H and Gibbs 采样​zhuanlan.zhihu.com刘浚嘉:Reinforcement-Learning-in-Robotics 专栏目录​zhuanlan.zhihu.com

更多系列文章见关联库Reinforcement-Learning-in-Robotics​github.com

Reference

你可能感兴趣的:(python实现采样函数)