分布式处理与计算:随机模拟和统计推断
现代机器学习(特别是大规模数据场景)中,往往用随机模拟和统计推断配合进行处理:
- 用统计推断建立模型:比如用EM算法算出一个高斯混合模型(GMM),找到了数据的分布规律(参数)。
- 用随机模拟验证或使用模型:得出规律后,我们需要生成几百万个模拟数据来测试这个模型好不好用;或者在实际业务中,利用这个算出来的分布规律,随机模拟用户未来的点击行为。
- 分布式加速:无论是模拟生成上亿个随机数,还是对海量数据进行EM算法迭代,单机都算不动,必须依靠 Spark 把数据和计算拆分到多台机器上并行处理。
随机模拟是已知公式,让Spark集群算出上亿级别的模拟样本; 统计推断是已知这上亿个样本,让Spark集群算出背后的公式参数。 相关的方法主要如下:
- 三种随机数生成法: 分布函数的逆写得出来 → 逆分布法; 写不出来但能找到试投密度 和常数 → 拒绝接受法(舍选法Ⅱ); 分布在有限区间且密度有上界 → 舍选法Ⅰ(矩形打点)
- 逆分布法公式: ,。指数分布 。
- 拒绝接受法: 接受条件 ;接受率 , 越小效率越高。
- EM 四步: 选初值 → E 步算 Q 函数(隐变量的条件期望)→ M 步极大化 Q 更新参数 → 迭代到收敛。
- 遗传模型迭代式: , 四类次数 125/18/20/34、总数 197
- GMM 三个更新式: 、、 用响应度 加权;响应度是后验概率。
- 分布式 EM: 充分统计量可加,各节点局部求和、全局汇总更新参数
一、逆分布法(反函数法)
计算机只会生成均匀分布的随机数,而我们生成符合对应分布的随机数需要进行一个映射关系的处理,逆分布法是最直接的一种随机数生成方法。
当随机变量所服从的分布函数已知,并且这个分布函数的逆函数有显式解的时候,就可以直接用它来产生服从该分布的随机数。一旦分布函数的逆写不出来,这个方法就用不了,得改用后面的拒绝接受法。
原理:
设随机变量 的分布函数是 ,又设 服从 上的均匀分布,那么随机变量 就服从以 为分布函数的那个分布。也就是只要能把均匀分布的随机数”喂”进逆分布函数,出来的就是目标分布的随机数。
算法步骤:
- 产生一个服从均匀分布 的随机数;
- 令 ,那么 就是服从目标分布 的随机数。
例子一:指数分布
要产生 个服从指数分布 的随机数。指数分布的概率密度函数与分布函数分别是
令 ,反解出
与 同分布(都是 ),结果也可以写成
例子二:标准 Laplace 分布
要产生 个服从标准 Laplace 分布的随机数。Laplace 分布(双指数分布)的概率密度函数为
对它积分,可得累积分布函数为分段形式:
令 分别在两段上反解,就得到逆函数:
按这个式子把均匀随机数代进去,就得到 Laplace 分布的随机数。
二、拒绝接受法(舍选法Ⅱ)
当要生成的随机数的分布没有分布函数,或者分布函数的逆没有显式解时,逆分布法就失效了,这时候用拒绝接受法。
适用条件:能够找到另一个概率密度函数 ,它与目标密度 有相同的定义域;同时能找到一个常数 ,使得在整个定义域上都满足
这里 是试投密度(建议分布),属于容易直接抽样的分布(比如均匀分布、正态分布)。
算法步骤:
- 产生一个密度函数为 的随机数 ,再产生一个服从均匀分布 的随机数;
- 如果满足 那么就令 (接受);否则丢弃,返回上一步继续迭代。
推导思路:令接受条件成立的那个事件,可以证明”被接受的 “的条件分布恰好就是目标分布 。具体地,取任意区间,计算” 落在该区间且被接受”的概率,会发现它正比于 ,归一化之后就是 。
拒绝接受算法的效率由接受率决定,而接受率正好是 。也就是说,常数 越小(越接近 1),接受率越高,算法效率越高; 越大,被丢弃的样本越多。
三、舍选法Ⅰ
舍选法Ⅰ是拒绝接受法在一种简单情形下的特例
适用条件:要生成的随机数的分布取值于一个有限区间 ,并且它的密度函数 有上界 ,即对所有 都有 。
算法步骤:
- 在区间上生成 ,再生成 ;
- 如果 ,就接受,令 ;否则返回步骤 1 重来。
这实际上就是在矩形框 里”打点”,落在密度曲线 下方的点就保留、其横坐标即为所求随机数。它也可以套进拒绝接受法的框架来看:
- 产生随机数 (取自均匀分布)以及 ;
- 如果 ,则令 ;否则返回上一步继续迭代。
两种写法本质是同一件事,只是把 换了个记法。
四、最大期望算法(EM 算法)
EM(Expectation-Maximization) 算法用来求含 隐变量 的概率模型的参数极大似然估计。当似然函数因为存在隐变量而难以直接极大化时,EM 通过”E 步补隐变量的期望、M 步再极大化”两步交替迭代,逐步逼近最优解。
算法步骤:
-
选初值:选择参数的初值 ,开始迭代;
-
E 步:记 为第 次迭代得到的参数估计值。
在第 次迭代的 E 步,计算 Q 函数
其中 是在给定观测数据 和当前估计值 下,隐变量 的条件概率分布;
-
M 步:求使 极大化的 ,把它作为第 次迭代的参数估计值
-
迭代:重复第 2、3 步,直至收敛(参数或对数似然的变化足够小)。
例子一:遗传模型(genetic linkage model)
设一次实验可能出现四个结果,发生概率分别为
现在进行了 197 次试验,四种结果的发生次数分别为 125、18、20、34。要求出分布中参数 的一个好的估计。
引入隐变量:第一类结果的概率 可以拆成 和 两部分,于是把观测到的 125 拆成两块 和 ,对应概率分别为 和 ,其中 就是看不到的隐变量。
完全似然函数可以写成(带隐变量 )
对数似然(去掉与 无关的常数)为
E 步:在当前估计 下, 是二项分布的条件期望,即把 125 按两部分概率比例分:
M 步:对 (即上面对数似然把 换成 )求 的偏导并令其为 0
解得迭代公式
反复用这两步迭代, 就会收敛到极大似然估计。
例子二:混合高斯模型(Gaussian Mixture Model, GMM)
假设观测数据 由高斯混合模型生成:
其中 是第 个分模型的混合系数,满足 、; 是第 个高斯分模型的密度。要用 EM 算法估计参数 。
定义隐变量 :
有了观测数据 和未观测数据 ,完全数据就是 。于是完全数据的似然函数为
对应的完全数据对数似然为
E 步:确定 Q 函数。把 换成它的条件期望 (称为”响应度”,即第 个观测由第 个分模型生成的后验概率):
把 和 代入,就得到 Q 函数的具体表达式。
M 步:对各参数求偏导并令其为 0,得到更新公式:
E 步、M 步交替迭代到收敛,就得到 GMM 的参数估计。
分布式 EM 算法
在高斯混合模型下,当数据量 很大时,可以把 EM 做成分布式的。
在 E 步把数据分散到各个节点,每个节点在本地算出各自数据的条件概率(响应度) 以及对应的期望充分统计量(如 、、);
到 M 步再把各节点的这些充分统计量汇总相加,统一更新全局参数 。
由于充分统计量是可加的,这种”各节点局部求和 + 全局汇总”的方式与单机 EM 结果完全一致,却能利用 Spark 这类框架并行处理海量数据。
分享到社交平台
将本文分享给你的朋友们
Zhongye