Monte Carlo
概率论
X:随机变量 (stochastic variables)
x:观察X的变量(observation of X), 或者普通变量
f(x):变量x的函数
p(x):随机变量x的概率密度, 满足:
∫p(x)dx=1,p(x)≥0
联合概率密度:
p(x,y)=p(x)p(y)
条件概率密度:
p(y∣x)=p(x)p(x,y)
I^:结果I的估计器
E[X]X∼p:随机变量的期望, 满足:
E[X]X∼p=∫xp(x)dx
期望有很多性质:
E[aX+bX]=aE[X]+bE[X]
- Law of the unconscious statistician
E[f(X)]X∼p=∫f(x)p(x)dx
E[X]=N→∞lim(N1i=0∑Nxi)
注意xi独立且同分布(independent and identically distributed)
方差是随机变量与其期望之间的二次偏差的期望(实际上是统计的内容, 不过就放这里吧):
S(X)=E[(X−E[X])2]=E[X2]−E[X]2
不相关X的线性组合的方差
S(∑NaX)=a2∑NS(X)
Cumulative Distribution Function(CDF)
性质:
P(x)=∫−∞xp(x)dx
因此pdf是cdf的导数
p(x)=dxdP(x)
∫abp(x)dx=P(b)−P(a)
蒙特卡洛法求解积分
如何直接求解定积分
回顾一下定积分
我们有个函数f(x), 我们想在a和b之间进行数值积分, 换句话数, 我们要计算曲线下的面积I, 也就是:
I=∫abf(x)dx
如果把这块区域近似成矩形, 求它的面积非常好求
I≈f(x)Δx
如果我们细分这块矩形, 它的结果将会更加精确
I≈i=0∑Nf(xi)Δx
细分数量是N, 我们很容易得知每一块矩形的长是
Δx=Nb−a
因此, 细分还可以改写成
I≈Nb−ai=0∑Nf(xi)
如果我们对N取极限, 就是准确的积分结果
I=N→∞limNb−ai=0∑Nf(xi)
实际上这就是定积分的标准求解方法
如果我们把函数维度扩展到二维呢?
I=∫Df(x,y)dxdy
同样的步骤, 分割成小长方体, 计算体积, 细分
最后得到
I=N→∞,M→∞lim(NMDi=0∑Nj=0∑Mf(xi,yj))
三维也是一样…扩展到N维, 都是可以工作的
但是, 等等!
由于不知道积分的解析解, 为了计算二维积分, 我们需要在二维上进行抽样, 复杂度是O(n2), 维度越高复杂度越高, 这几乎是一件不可接受的事情
想想渲染方程, 甚至有好多好多个维度
那如果我们减小精度, 让Δx更大一些呢?
结果明显走样 (aliasing) 了, 计算结果完全错误, 采样频率太低了, (Nyquist frequency描述了准确采样需要的最低频率)
或许我们可以在采样前应用低通滤波器
但有更好的方法, 我们需要一个更好的积分估计器
Monte Carlo 估计器
啥是估计器 (Estimator) ?
总之, 我们先把公式变形一下, 让它看起来更好看一些
I≈Nb−ai=0∑Nf(xi)=N1i=0∑N(b−a)f(xi)
相同的采样数量, 唯一不同的是, 采样点是均匀随机分布在函数上
结果看起来好像有点正确了, 它的结果真的是正确的吗?
回顾一下概率论
我们在[a,b]范围内均匀采样, 那么随机变量的概率密度就是
p(x)=b−a1
因为
∫abp(x)dx=1
把概率密度函数带入积分估计里面
I≈N1i=0∑N(b−a)f(xi)=N1i=0∑Np(xi)f(xi)
xi服从分布X∼p
回顾一下大数定理
E[X]=N→∞lim(N1i=0∑Nxi)
大数定理和我们上面计算的式子是不是很像?
E[p(X)f(X)]=N→∞lim(N1i=0∑Np(xi)f(xi))
再根据Law of the unconscious statistician
E[f(X)]X∼p=∫f(x)p(x)dx
我们把期望带进去
E[p(X)f(X)]=∫p(x)f(x)p(x)dx=∫f(x)dx=I
这种方法就是蒙特卡洛法
甚至, p(x)可以是任意一种概率分布, 不一定要均匀分布!
等等, 如果p(x)是0呢? 虽然在公式里它被约去了
如果p(x)是0, 计算结果将会是错误的, 而且计算机除以0会产生NaN…
因此我们需要约定
p(x)>0,∀x∈D
最终, 蒙特卡洛估计器的表达式是
I^=N1i=0∑Np(xi)f(xi)
Error
通常, 估计器都会有两种错误
蒙特卡洛估计器是无偏估计, 它没有偏差
计算一下蒙特卡洛估计器的方差
S(I^)=S(N1∑Np(X)f(X))=N21∑NS(p(X)f(X))=N21NS(p(X)f(X))=N1S(p(X)f(X))
方差与 N 成反比, 而且方差来源只有函数与概率函数的比值
因此蒙特卡洛估计器的偏差会随着采样数量增加而降低
那有没有快速降低方差的方法?
Importance Sampling
我们有个很大的f(x), 但只有个很小很小的p(x), 这意味着f比p的方差非常大
前面说过我们可以自由选择概率密度函数, 因此我们可以选择这个
可以看到选一个与f(x)几乎成比例的p(x)很重要
p(x)=sf(x)
定义一个常数s来缩放f(x)
由于p(x)在积分与上积分的值是1
因此
s=∫f(x)dx1
应用这个缩放后
S(p(X)f(X))=S(sf(X)f(X))=S(s1)=0
方差是0! 完美!
但实践中这几乎不可能, 为了得到这样的概率密度, 我们需要的s涉及到归一化f(x)
如果我们可以归一化f(x), 这意味着我们可以求解定积分, 这样应用蒙特卡洛就没有意义了
但我们还是有办法来逼近这样的概率密度
Inversion Method
假设输入的随机变量ξ具有性质:
-
连续
-
均匀分布
-
范围是[0,1)
cdf一定是单调递增, 一个随机变量有且只有一个对应的概率, 这意味着cdf一般都具有反函数
这意味着, 给定一个概率, 我们可以用cdf的反函数直接找到它唯一对应的随机变量
Xi=Px−1(ξ)
更准确来说, 我们可以通过以下步骤从任意pdf中得到随机样本Xi:
-
计算cdf:P(x)=∫0xp(x′)dx′
-
计算cdf的反函数P−1(x)
-
获取一个均匀分布的随机数ξ
-
计算Xi=P−1(ξ)
例子: 幂分布
给定指数分布的pdf:
p(x)=cxn
c是规范化pdf的常数, 我们需要先找出pdf的正确表达式
由于pdf积分一定等于1, 而且我们只输入[0,1)的值, 因此可以写出:
∫01cxndxcn+11xn+101n+1cc=1=1=1=n+1
因此p(x)=(n+1)xn
现在, 我们可以计算它的cdf了:
P(x)=∫0xp(x)dx=∫0x(n+1)xndx=(n+1)∫0xxndx=xn+10x=xn+1
它的反函数是:
P−1(x)=n+1x
因此, 给定一个概率, 我们可以算出它的随机变量
X=n+1ξ
Inversion Method (2D)
二维的反演方法与一维有许多区别…
如果我们分别对两个pdf应用反演方法, 并输出结果, 结果是错误的
怎么样才能正确得到需要的二维分布?
例子: Unifom Disk
现在我们想在单位圆盘上均匀采样
但是如果我们在圆盘的外接矩形, 也就是单位矩形里均匀采样, 会有一些采样点落到圆盘外
如果使用内接矩形, 这些点又无法完全覆盖圆盘
我们知道除了直角坐标系, 有一种和圆关系密切的坐标系叫做极坐标系
由于是圆盘, 所以我们使用二维极坐标系
定义:
r∈[0,1)
θ∈[0,2π)
与直角坐标系的转换
{xy=rcosθ=rsinθ
是不是可以直接拿两个不相关的随机变量ξ转换到r和θ, 再转换到直角坐标系?
很遗憾, 结果是错的, 为什么?
我们知道圆盘的面积是πr2
如果我们把圆盘看作许多个宽为Δr的同心圆环, 我们的方法实际上就是在所有同心圆环上应用相同数量的采样点
但是同心圆环的周长一直在边长, 那外围能应用的采样点就变少了
也就是说, 分布情况在沿着r的变化而变化
第j个圆环的半径等于rj=jΔr, 它包含了(rrj)2N个采样点
反过来, 第i个采样点应该在圆环的位置是:ri=rNi
所以实际上ri=rξi
所以r还要开个根号
是的, 这是正确的, 但这样直接针对图像来分析几乎是不可能的, 也不通用
我们需要一种更加通用的推导方法
错误如何发生
我们来分析一下之前我们为什么错了
左边是原始输入的二维随机变量, 右边成比例缩放[0,1]
右边网格最右边的矩形被压缩到原来的二分之一
右上角被压缩到原来的四分之一, 左下角放大了四倍
因此, 二维pdf实际上是一个无限小区域面积, 并且在变换pdf时被缩放到另一个区域里
这与我们变换圆盘时发现的现象一致
这种变换改变了我们的样本分布
如果我们知道是什么改变了分布, 我们就可以在蒙特卡洛里加权, 或者在变换后补偿
假设一个随机变量A, 它在非线性双射转换(bijective transformation)变换后是B, B=T(A)
非线性双射变换意味着b=T(a)随着a单调递增或递减
这意味着每一个Ai都对应着唯一的Bi, 反之亦然
这种情况下, 两个随机变量的cdf满足PB(T(a))=PA(a)
如果b随着a单调递增, 得到:
dadPB(b)=dadPA(a)
如果b随着a单调递减, 得到:
−dadPB(b)=dadPA(a)
根据pdf和cdf的性质, 我们知道pX是PX的非负导数
dydPX(x)=dypX(x)dx
用这个性质重写单调递增的等式
dadPB(b)dapB(b)dbpB(b)∣dadb∣pB(b)=dadPA(a)=dapA(a)da=pA(a)=∣dadb∣−1pA(a)
当尝试把这个方法应用到单位圆盘,会发现它结果错了,不起作用,因为转换的不仅仅是一个变量的函数,而是两个
我们需要同时考虑到a和b两个变量的变化
解决方法
样本变化
将一组N个的值写为多维变量a, 将变换后的输出写为b
a=a1⋮an,b=b1⋮bn=T1(a)⋮TN(a)=T(a)
必须确保当一个多维变量转化为另一个时,包含联合pdf的全部变化
Jacobian矩阵包含我们可以用向量 a 和 b 形成的所有可能的偏导数的值
JT(a)=∂a1∂b1⋮∂a1∂bM⋯⋱⋯∂aN∂b1⋮∂aN∂bM
因此,如果我们取第一行和第一列,则该元素表示向量 b 的第一个值如何随向量 a 中的第一个值变化
在第二行第一列中,我们看到向量 b 的第二个值如何随向量 a 中的第一个值变化,以此类推。
这意味着,对于任何给定的位置向量 a,我们可以将雅可比矩阵本身视为一个变换矩阵,它仅对位置向量 a 处的无限小区域有效
最后,Jacobian行列式描述了变换前后面积的变化。因此可以用行列式替换前面的范围变化项
(基本上完全没看懂,先看看怎么应用吧)
看看雅可比矩阵来描述转换到均匀圆盘的变化量
写成向量形式
(xy)=T(rθ)=(rcosθrsinθ)
计算雅可比行列式
∂(rθ)∂T(rθ)=∣JT∣=(∂r∂x∂r∂y∂θ∂x∂θ∂y)=(cosθsinθ−rsinθrcosθ)=r
替换掉变化量, 可以得到
p(x,y)=r1p(r,θ)
它告诉我们,直角坐标系中的均匀概率密度与极坐标系中的r成正比
正确采样联合概率密度函数
要正确转换二维分布,最后一个问题是正确采样联合概率密度函数
到目前为止,我们只讨论了不相关变量的转换
在有两个随机变量的情况下,给定它们的联合 PDF,我们可以这样做:我们首先计算一个变量的边缘密度函数,然后计算另一个变量的条件密度函数
我们将使用这些边际和条件密度函数,而不是单个变量的 PDF,因为只有在它们独立时才能保证有效
但是我们需要对它们执行的步骤是和之前一样的:对它们求积分,对不定积分求逆,并将它们用于采样
换句话说,我们要做的是:首先对一个随机变量进行抽样,然后对另一个进行抽样,因为第二个变量的抽样可能取决于第一个变量返回的结果
边缘概率密度是啥?举个例子,如果在 x 和 y 的所有可能组合中,我们有 50% 的机会看到 x=1,那么对于 x = 1,基于 p(x,y) 的 x 的边际密度将为 0.5
首先联合pdf的随机变量X和Y有范围[aX,bX)和[aY,bY)
将pX(x)看作p(x,y)在x点时,y可能取值的平均密度
我们可以通过整合所有其他函数来获得其中一个的边际密度函数,例如
pX(x)=∫aYbYp(x,y)dy
接着,相对于x,y的条件概率密度是
p(y∣x)=pX(x)p(x,y)
例子:Unifom Disk 正式解决方案
再来一遍,这次我们用最好的方法来推导分布变换
我们知道采样域的总面积为π,并且我们知道pdf必须在采样域上积分为1,因此我们知道任何一个点的联合概率密度应该是pi1
p(x,y)=π1
从之前计算的jacobian行列式我们知道了,分布转换时会有个大小为r的系数
p(r,θ)=rp(x,y)
因此,我们希望
p(r,θ)=πr
最后,我们计算r的边缘概率密度
pR(r)=∫02πp(r,θ)dθ=∫02ππrdθ=πr∫02πdθ=πr(2π−0)=2r
在r条件下,θ的条件概率密度是
p(θ∣r)=pR(r)p(r,θ)=2π1
对边缘概率密度和条件概率密度分别应用Inversion Method
r∈[0,1]
因此积分上下限是0到1
P(r)=∫01pR(r)dr=∫012rdr=r2
反函数
P−1(r)=r
同理,θ的定义域是
θ∈[0,2π]
对条件概率密度积分
P(θ)=∫02πp(θ∣r)dθ=∫02π2π1dθ=2π1(2π−0)=1
它是常数函数,这意味着直接转换分布也不会有问题
结论:
{rθ=PR−1(ξ1)=ξ1=PΘ−1(ξ2)=2πξ2
例子:Unifom Hemisphere
假设所有点都落在半球表面,也就是球半径为1
x2+y2+z2=1
定义域
θ∈[0,π2),ϕ∈[0,2π)
球面坐标系与直角坐标系转换:
⎩⎨⎧xyz=rsinθcosϕ=rsinθsinϕ=rcosθ
雅可比行列式:
∂r∂x∂r∂y∂r∂z∂θ∂x∂θ∂y∂θ∂z∂ϕ∂x∂ϕ∂y∂ϕ∂z=sinθcosϕ sinθsinϕcosθrcosθcosϕrcosθsinϕ−rsinθ−rsinθsinϕrsinθcosϕ0=r2sinθcos2θcos2ϕ+r2sin3θsin2ϕ+r2sinθcos2θsin2ϕ+r2sin3θcos2ϕ=r2sinθ(cos2θcos2ϕ+sin2θsin2ϕ+cos2θsin2ϕ+sin2θcos2ϕ)=r2sinθ(sin2θ(sin2ϕ+cos2ϕ)+cos2θ(sin2ϕ+cos2ϕ))=r2sinθ(sin2θ+cos2θ)=r2sinθ
因此,在球坐标系下,联合概率密度是
p(r,θ,ϕ)=2πr2sinθ
因为我们假设是单位半球,因此r永远为1
计算θ边缘概率密度
pΘ(θ)=∫02π2πsinθdϕ=2πsinθ(∫02πdϕ)=sinθ
计算θ的cdf
PΘ(θ)=∫−∞θsinθdθ=∫0θsinθdθ=−cosθ0θ=1−cosθ
计算θ的cdf的反函数
PΘ−1(θ)=cos−1(1−ξ)
因为ξ∈[0,1),所以可以用ξ替换掉1−ξ
计算对于θ来说,ϕ的条件概率密度是
pΦ(ϕ∣θ)=pΘ(θ)p(θ,ϕ)=2π1
计算ϕ的cdf
PΦ(ϕ)=∫0ϕ2π1dϕ=2πϕ
计算ϕ的cdf的反函数
PΦ−1(ϕ)=2πξ
因此概率分布转换是
{θϕ=cos−1ξ1=2πξ2
又因为
cosθ=ξ1
而且众所周知,
sin2θ+cos2θ=1
所以
sinθ=1−cos2θ=1−ξ12
带入直角坐标系转球面坐标系
⎩⎨⎧xyz=1−ξ12cos(2πξ2)=1−ξ12sin(2πξ2)=ξ1
例子:Diffuse BRDF
首先,让我们再再再回顾一下渲染方程里的反射部分
∫Ωfr(x,ω→v)L(x←ω)cosθωdω
假设现在BRDF是Lambertian,它实际上是个常数πR
cosine项也是可知的,它取决于ω
最麻烦的部分是光照部分L(x←ω),我们不知道间接光会从哪里来,这个参数甚至还是递归的
我们完全不知道有关L的信息,那就只能假设光线会从四面八方均匀射入,令它等于常数k
∫ΩπRkcosθωdω
这样,被积函数的形状仅取决于cosθω,给定pdf:
p(ω)=ccosθ
首先计算pdf,由于采样点只会落到半球上,因此整个半球上的cdf是1
∫Ωp(ω)dω=1
众所周知,任意球面的微分面积是
dA=(rsinθdϕ)(rdθ)=r2(sinθdθdϕ)
众所周知,立体角与球面面积的转换是
Ω=r2A
因此
dω=r2dA=sinθdθdϕ
带回去
∫Ωp(ω)dω∫02π∫02πccosθsinθdθdϕc∫02π∫02π21sin2θdθdϕ21c∫02π(−cos2θ02π)dϕ2c∫02πdϕc=π1=1=1=1=1=1
我们之前算过了雅可比矩阵,这里就直接用了,而且我们依然假设是单位球,半径为1,联合概率密度是
p(θ,ϕ)=πcosθsinθ
计算θ边缘概率密度
pΘ(θ)=∫02ππcosθsinθdϕ=πcosθsinθ2π=2sinθcosθ=sin2θ
计算θ边缘概率密度的cdf
PΘ(θ)=∫−∞θsin2θdθ=∫0θsin2θdθ=∫0θ21sin2θd2θ=21(−cos2θ0θ)=21(1−cos2θ)=21(1−(1−2sin2θ))=sin2θ
它的反函数是
PΘ−1(θ)=sin−1(ξ)
计算相对于θ来说,ϕ的条件概率密度
pΦ(ϕ)=pΘ(θ)p(θ,ϕ)=2π1
和上面一致,直接写结果了
PΦ−1(ϕ)=2πξ
概率分布转换
{θϕ=sin−1(ξ)=2πξ2
又因为
sin2θ+cos2θξ1+cos2θcosθ=1−ξ1=1=1
带入直角坐标系转球面坐标系
⎩⎨⎧xyz=ξ1cos(2πξ2)=ξ1sin(2πξ2)=1−ξ1