分布式处理与计算:随机模拟和统计推断

2618 个字
13 分钟
分布式处理与计算:随机模拟和统计推断

现代机器学习(特别是大规模数据场景)中,往往用随机模拟和统计推断配合进行处理:

  • 用统计推断建立模型:比如用EM算法算出一个高斯混合模型(GMM),找到了数据的分布规律(参数)。
  • 用随机模拟验证或使用模型:得出规律后,我们需要生成几百万个模拟数据来测试这个模型好不好用;或者在实际业务中,利用这个算出来的分布规律,随机模拟用户未来的点击行为。
  • 分布式加速:无论是模拟生成上亿个随机数,还是对海量数据进行EM算法迭代,单机都算不动,必须依靠 Spark 把数据和计算拆分到多台机器上并行处理。

随机模拟是已知公式,让Spark集群算出上亿级别的模拟样本; 统计推断是已知这上亿个样本,让Spark集群算出背后的公式参数。 相关的方法主要如下:

  • 三种随机数生成法: 分布函数的逆写得出来 → 逆分布法; 写不出来但能找到试投密度 gg 和常数 cc → 拒绝接受法(舍选法Ⅱ); 分布在有限区间且密度有上界 → 舍选法Ⅰ(矩形打点)
  • 逆分布法公式: X=F1(U)X = F^{-1}(U),UU(0,1)U\sim U(0,1)。指数分布 X=1λlnUX=-\tfrac{1}{\lambda}\ln U
  • 拒绝接受法: 接受条件 Uf(Y)cg(Y)U \le \dfrac{f(Y)}{c\,g(Y)};接受率 =1c=\dfrac{1}{c},cc 越小效率越高。
  • EM 四步: 选初值 → E 步算 Q 函数(隐变量的条件期望)→ M 步极大化 Q 更新参数 → 迭代到收敛。
  • 遗传模型迭代式: z(i)=125θ(i)2+θ(i)z^{(i)} = 125\cdot\dfrac{\theta^{(i)}}{2+\theta^{(i)}},θ(i+1)=z(i)+34z(i)+72\theta^{(i+1)} = \dfrac{z^{(i)}+34}{z^{(i)}+72} 四类次数 125/18/20/34、总数 197
  • GMM 三个更新式: μk\mu_kσk2\sigma_k^2αk\alpha_k 用响应度 γ^jk\hat\gamma_{jk} 加权;响应度是后验概率。
  • 分布式 EM: 充分统计量可加,各节点局部求和、全局汇总更新参数

一、逆分布法(反函数法)#

计算机只会生成均匀分布的随机数,而我们生成符合对应分布的随机数需要进行一个映射关系的处理,逆分布法是最直接的一种随机数生成方法。

当随机变量所服从的分布函数已知,并且这个分布函数的逆函数有显式解的时候,就可以直接用它来产生服从该分布的随机数。一旦分布函数的逆写不出来,这个方法就用不了,得改用后面的拒绝接受法。

原理:

设随机变量 XX 的分布函数是 F(x)F(x),又设 UU 服从 [0,1][0,1] 上的均匀分布,那么随机变量 X=F1(U)X = F^{-1}(U) 就服从以 FF 为分布函数的那个分布。也就是只要能把均匀分布的随机数”喂”进逆分布函数,出来的就是目标分布的随机数。

算法步骤:

  1. 产生一个服从均匀分布 UU(0,1)U \sim U(0,1) 的随机数;
  2. X=F1(U)X = F^{-1}(U),那么 XX 就是服从目标分布 FF 的随机数。

例子一:指数分布#

要产生 nn 个服从指数分布 Exp(λ)\text{Exp}(\lambda) 的随机数。指数分布的概率密度函数与分布函数分别是

f(x)=λeλx,F(x)=1eλx(x0)f(x) = \lambda e^{-\lambda x}, \quad F(x) = 1 - e^{-\lambda x} \quad (x \ge 0)

U=F(X)=1eλXU = F(X) = 1 - e^{-\lambda X},反解出

X=1λln(1U)X = -\frac{1}{\lambda}\ln(1 - U)

1U1-UUU 同分布(都是 U(0,1)U(0,1)),结果也可以写成 X=1λlnUX = -\dfrac{1}{\lambda}\ln U

例子二:标准 Laplace 分布#

要产生 nn 个服从标准 Laplace 分布的随机数。Laplace 分布(双指数分布)的概率密度函数为

f(x)=12exf(x) = \frac{1}{2} e^{-|x|}

对它积分,可得累积分布函数为分段形式:

F(x)={12ex,x<0112ex,x0F(x) = \begin{cases} \dfrac{1}{2}e^{x}, & x < 0 \\[2mm] 1 - \dfrac{1}{2}e^{-x}, & x \ge 0 \end{cases}

U=F(X)U = F(X) 分别在两段上反解,就得到逆函数:

X={ln(2U),0<U<12ln(2(1U)),12U<1X = \begin{cases} \ln(2U), & 0 < U < \tfrac{1}{2} \\[2mm] -\ln\big(2(1-U)\big), & \tfrac{1}{2} \le U < 1 \end{cases}

按这个式子把均匀随机数代进去,就得到 Laplace 分布的随机数。


二、拒绝接受法(舍选法Ⅱ)#

当要生成的随机数的分布没有分布函数,或者分布函数的逆没有显式解时,逆分布法就失效了,这时候用拒绝接受法。

适用条件:能够找到另一个概率密度函数 g(x)g(x),它与目标密度 f(x)f(x) 有相同的定义域;同时能找到一个常数 cc,使得在整个定义域上都满足

f(x)cg(x)f(x) \le c\,g(x)

这里 gg试投密度(建议分布),属于容易直接抽样的分布(比如均匀分布、正态分布)。

算法步骤:

  1. 产生一个密度函数为 gg 的随机数 YY,再产生一个服从均匀分布 UU(0,1)U \sim U(0,1) 的随机数;
  2. 如果满足 Uf(Y)cg(Y)U \le \frac{f(Y)}{c\,g(Y)} 那么就令 X=YX = Y(接受);否则丢弃,返回上一步继续迭代。

推导思路:令接受条件成立的那个事件,可以证明”被接受的 YY“的条件分布恰好就是目标分布 ff。具体地,取任意区间,计算”YY 落在该区间且被接受”的概率,会发现它正比于 f\int f,归一化之后就是 ff

P(接受Y=y)=f(y)cg(y),P(接受)=1cP(\text{接受} \mid Y=y) = \frac{f(y)}{c\,g(y)}, \qquad P(\text{接受}) = \frac{1}{c}

拒绝接受算法的效率由接受率决定,而接受率正好是 1c\dfrac{1}{c}。也就是说,常数 cc 越小(越接近 1),接受率越高,算法效率越高;cc 越大,被丢弃的样本越多。


三、舍选法Ⅰ#

舍选法Ⅰ是拒绝接受法在一种简单情形下的特例

适用条件:要生成的随机数的分布取值于一个有限区间 [a,b][a,b],并且它的密度函数 f(x)f(x) 有上界 MM,即对所有 xx 都有 f(x)Mf(x) \le M

算法步骤:

  1. 在区间上生成 X1U(a,b)X_1 \sim U(a,b),再生成 X2U(0,M)X_2 \sim U(0, M);
  2. 如果 X2f(X1)X_2 \le f(X_1),就接受,令 X=X1X = X_1;否则返回步骤 1 重来。

这实际上就是在矩形框 [a,b]×[0,M][a,b] \times [0,M] 里”打点”,落在密度曲线 ff 下方的点就保留、其横坐标即为所求随机数。它也可以套进拒绝接受法的框架来看:

  1. 产生随机数 X1X_1(取自均匀分布)以及 UU(0,1)U \sim U(0,1);
  2. 如果 Uf(X1)MU \le \dfrac{f(X_1)}{M},则令 X=X1X = X_1;否则返回上一步继续迭代。

两种写法本质是同一件事,只是把 X2=MUX_2 = M\cdot U 换了个记法。


四、最大期望算法(EM 算法)#

EM(Expectation-Maximization) 算法用来求含 隐变量 的概率模型的参数极大似然估计。当似然函数因为存在隐变量而难以直接极大化时,EM 通过”E 步补隐变量的期望、M 步再极大化”两步交替迭代,逐步逼近最优解。

算法步骤:

  1. 选初值:选择参数的初值 θ(0)\theta^{(0)},开始迭代;

  2. E 步:记 θ(i)\theta^{(i)} 为第 ii 次迭代得到的参数估计值。

    在第 i+1i+1 次迭代的 E 步,计算 Q 函数

    Q(θ,θ(i))=EZY,θ(i)[logP(Y,Zθ)]=ZlogP(Y,Zθ)P(ZY,θ(i))Q(\theta, \theta^{(i)}) = E_{Z\mid Y,\theta^{(i)}}\big[\log P(Y,Z \mid \theta)\big] = \sum_{Z} \log P(Y,Z\mid\theta)\, P(Z\mid Y,\theta^{(i)})

    其中 P(ZY,θ(i))P(Z\mid Y,\theta^{(i)}) 是在给定观测数据 YY 和当前估计值 θ(i)\theta^{(i)} 下,隐变量 ZZ 的条件概率分布;

  3. M 步:求使 Q(θ,θ(i))Q(\theta,\theta^{(i)}) 极大化的 θ\theta,把它作为第 i+1i+1 次迭代的参数估计值

    θ(i+1)=argmaxθQ(θ,θ(i))\theta^{(i+1)} = \arg\max_{\theta} Q(\theta, \theta^{(i)})

  4. 迭代:重复第 2、3 步,直至收敛(参数或对数似然的变化足够小)。

例子一:遗传模型(genetic linkage model)#

设一次实验可能出现四个结果,发生概率分别为

12+θ4,1θ4,1θ4,θ4,0θ1\frac{1}{2} + \frac{\theta}{4},\quad \frac{1-\theta}{4},\quad \frac{1-\theta}{4},\quad \frac{\theta}{4}, \qquad 0 \le \theta \le 1

现在进行了 197 次试验,四种结果的发生次数分别为 125、18、20、34。要求出分布中参数 θ\theta 的一个好的估计。

引入隐变量:第一类结果的概率 12+θ4\tfrac{1}{2} + \tfrac{\theta}{4} 可以拆成 12\tfrac{1}{2}θ4\tfrac{\theta}{4} 两部分,于是把观测到的 125 拆成两块 y1=125zy_1 = 125 - zzz,对应概率分别为 12\tfrac{1}{2}θ4\tfrac{\theta}{4},其中 zz 就是看不到的隐变量。

完全似然函数可以写成(带隐变量 zz)

L(θ)(12)125z(θ4)z(1θ4)18(1θ4)20(θ4)34L(\theta) \propto \left(\frac{1}{2}\right)^{125-z}\left(\frac{\theta}{4}\right)^{z}\left(\frac{1-\theta}{4}\right)^{18}\left(\frac{1-\theta}{4}\right)^{20}\left(\frac{\theta}{4}\right)^{34}

对数似然(去掉与 θ\theta 无关的常数)为

logL(θ)(z+34)logθ+(18+20)log(1θ)\log L(\theta) \propto (z + 34)\log\theta + (18+20)\log(1-\theta)

E 步:在当前估计 θ(i)\theta^{(i)} 下,zz 是二项分布的条件期望,即把 125 按两部分概率比例分:

z(i)=E[zθ(i)]=125θ(i)412+θ(i)4=125θ(i)2+θ(i)z^{(i)} = E\big[z \mid \theta^{(i)}\big] = 125 \cdot \frac{\tfrac{\theta^{(i)}}{4}}{\tfrac{1}{2} + \tfrac{\theta^{(i)}}{4}} = 125 \cdot \frac{\theta^{(i)}}{2 + \theta^{(i)}}

M 步:对 QQ(即上面对数似然把 zz 换成 z(i)z^{(i)})求 θ\theta 的偏导并令其为 0

θ[(z(i)+34)logθ+38log(1θ)]=z(i)+34θ381θ=0\frac{\partial}{\partial\theta}\Big[(z^{(i)}+34)\log\theta + 38\log(1-\theta)\Big] = \frac{z^{(i)}+34}{\theta} - \frac{38}{1-\theta} = 0

解得迭代公式

θ(i+1)=z(i)+34z(i)+34+38=z(i)+34z(i)+72\theta^{(i+1)} = \frac{z^{(i)} + 34}{z^{(i)} + 34 + 38} = \frac{z^{(i)} + 34}{z^{(i)} + 72}

反复用这两步迭代,θ\theta 就会收敛到极大似然估计。

例子二:混合高斯模型(Gaussian Mixture Model, GMM)#

假设观测数据 y1,y2,,yNy_1, y_2, \dots, y_N 由高斯混合模型生成:

P(yθ)=k=1Kαkϕ(yμk,σk2)P(y\mid\theta) = \sum_{k=1}^{K} \alpha_k\, \phi(y\mid\mu_k,\sigma_k^2)

其中 αk\alpha_k 是第 kk 个分模型的混合系数,满足 αk0\alpha_k \ge 0kαk=1\sum_k \alpha_k = 1;ϕ(yμk,σk2)\phi(y\mid\mu_k,\sigma_k^2) 是第 kk 个高斯分模型的密度。要用 EM 算法估计参数 θ={αk,μk,σk2}\theta = \{\alpha_k, \mu_k, \sigma_k^2\}

定义隐变量 γjk\gamma_{jk}:

γjk={1,第 j 个观测来自第 k 个分模型0,否则\gamma_{jk} = \begin{cases} 1, & \text{第 } j \text{ 个观测来自第 } k \text{ 个分模型} \\ 0, & \text{否则} \end{cases}

有了观测数据 yjy_j 和未观测数据 γjk\gamma_{jk},完全数据就是 (yj,γj1,,γjK)(y_j, \gamma_{j1}, \dots, \gamma_{jK})。于是完全数据的似然函数为

P(y,γθ)=k=1Kαknkj=1N[ϕ(yjμk,σk2)]γjk,nk=j=1NγjkP(y,\gamma\mid\theta) = \prod_{k=1}^{K} \alpha_k^{\,n_k} \prod_{j=1}^{N} \Big[\phi(y_j\mid\mu_k,\sigma_k^2)\Big]^{\gamma_{jk}}, \qquad n_k = \sum_{j=1}^{N}\gamma_{jk}

对应的完全数据对数似然

logP(y,γθ)=k=1K{nklogαk+j=1Nγjk[log12πlogσk12σk2(yjμk)2]}\log P(y,\gamma\mid\theta) = \sum_{k=1}^{K}\Big\{ n_k\log\alpha_k + \sum_{j=1}^{N}\gamma_{jk}\Big[\log\tfrac{1}{\sqrt{2\pi}} - \log\sigma_k - \tfrac{1}{2\sigma_k^2}(y_j-\mu_k)^2\Big]\Big\}

E 步:确定 Q 函数。把 γjk\gamma_{jk} 换成它的条件期望 γ^jk\hat\gamma_{jk}(称为”响应度”,即第 jj 个观测由第 kk 个分模型生成的后验概率):

γ^jk=αkϕ(yjμk,σk2)l=1Kαlϕ(yjμl,σl2)\hat\gamma_{jk} = \frac{\alpha_k\,\phi(y_j\mid\mu_k,\sigma_k^2)}{\sum_{l=1}^{K}\alpha_l\,\phi(y_j\mid\mu_l,\sigma_l^2)}

γ^jk\hat\gamma_{jk}nk=jγ^jkn_k=\sum_j\hat\gamma_{jk} 代入,就得到 Q 函数的具体表达式。

M 步:对各参数求偏导并令其为 0,得到更新公式:

μk=j=1Nγ^jkyjj=1Nγ^jk,σk2=j=1Nγ^jk(yjμk)2j=1Nγ^jk,αk=j=1Nγ^jkN=nkN\mu_k = \frac{\sum_{j=1}^{N}\hat\gamma_{jk}\,y_j}{\sum_{j=1}^{N}\hat\gamma_{jk}}, \qquad \sigma_k^2 = \frac{\sum_{j=1}^{N}\hat\gamma_{jk}(y_j-\mu_k)^2}{\sum_{j=1}^{N}\hat\gamma_{jk}}, \qquad \alpha_k = \frac{\sum_{j=1}^{N}\hat\gamma_{jk}}{N} = \frac{n_k}{N}

E 步、M 步交替迭代到收敛,就得到 GMM 的参数估计。

分布式 EM 算法#

在高斯混合模型下,当数据量 y1,,yNy_1,\dots,y_N 很大时,可以把 EM 做成分布式的。

E 步把数据分散到各个节点,每个节点在本地算出各自数据的条件概率(响应度) γ^jk\hat\gamma_{jk} 以及对应的期望充分统计量(如 γ^jk\sum \hat\gamma_{jk}γ^jkyj\sum \hat\gamma_{jk}y_jγ^jkyj2\sum \hat\gamma_{jk}y_j^2);

M 步再把各节点的这些充分统计量汇总相加,统一更新全局参数 αk,μk,σk2\alpha_k, \mu_k, \sigma_k^2

由于充分统计量是可加的,这种”各节点局部求和 + 全局汇总”的方式与单机 EM 结果完全一致,却能利用 Spark 这类框架并行处理海量数据。

分享到社交平台

将本文分享给你的朋友们

分布式处理与计算:随机模拟和统计推断
https://zhongye1.github.io/posts/分布式处理与计算/分布式处理与计算随机模拟与统计推断/
作者
Zhongye
发布于
2026-07-06
版权声明
CC BY-NC-SA 4.0

评论

Profile Image of the Author
Zhongye
南漂中
公告
新的博客站!旧站点传送门 👇
音乐
专辑封面

音乐

暂无播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章数
143
分类数
14
标签数
184
总字数
417,111
运行天数
0
最后更新
0 天前
总访问量
42296
访客数
29212

目录