HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)
HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)
回顾 HMM
上篇介绍了HMM这样的一种时序类模型, 即描述了一些观测现象的产生, 是由我们很难观测到的 "隐变量因子", 产生的, 同时这些隐变量因子之间的变化也有一个状态转移概率的过程.
HMM 的推导过程, 也就两个部分, Z 过程 (推断过程) 和 Estimation(参数估计)过程.
上篇对于 Z 过程, 有通过类似于 枚举法 和 一种 DP (动态规划) 算法来求解最好的 Z, 其前提假设是模型的参数 (初始状态, 状态转移概率矩阵, 发射概率) 已知 下来求解的. 嗯. 推导思路过程有点类似之前的 XGBoost 算法, 也是先假定, 再推导, 在证明假设前提这样的套路, 过程又用到了 EM算法来求解.
如果我是面试官, 问HMM, 这相当于将 EM 和 DP 算法 同时问了, 这样的问题就很有质量哦.
12月底恰好tableau老铁跟我分享动态规划,果然数学系就是不一样, 用爬n阶楼梯来说明, 斐波那契数. DP的核心思想就是将问题规模不断缩小求解, 不同于递归哈, 后面可以单独举个 DP 栗子.
so, 本篇就来整一波, 如何进行参数求解.
\(\theta = (\pi, A, B)\)
假设有5个状态, 同样是扔2个硬币
\(\pi\) 表示初始状态, 如: \(\pi = [0.8, b, c, d, e]\)
A 表示两个状态的转移矩阵; 是一个 5x5 的方阵
B 表示发射概率 (隐含规则->观测的概率值); 是一个 5x2 的矩阵
如果是词性分析, 则矩阵就非常大了, 如果观测是连续型 则需要用 概率分布来描述了.
对于, HMM, 要求解出这3个参数, 主要有两个步骤, 或者说是2个关键点:
- 给定模型的参数, 找出最适合的 Z => Inference (推断过程)
- 估计模型参数的 \(\theta\) => Parameter Estimation (估计过程)
Complete VS lncomplete "Z"
Z 就是隐变量, X 是对应的观测值.
-
X 已知, Z 已知, 则通过简单的 频率 统计即可求解出参数
-
X 已知, Z 未知, 则通过 EM 算法求解. (E 步更新发射概率, M 步更新参数值, 这样循环交替直到收敛, 即得参数
发射概率
就是 隐变量 z1 -> x1 (观测值) 的概率. 可参考EM篇的扔硬币, 上帝视角, 事先知道 试验结果是由 哪个硬币产生的, 或知道概率. (如第1次是 "正", 我知道有 70% 概率来自 A 硬币, 30%概率来自 B硬币, 这个概率矩阵 [0.7, 0.3] 就是 发射概率)
转移概率
描述状态之间的变化规律. 如还是扔硬币, 每次对 A, B 硬币的选择策略不同, 如 AAB, ABA ... 的场景, 可通过转移概率矩阵来描述.
ps: 老铁昨天问我是数论强, 还是分析强...嗯, 我只想说, 作为文科生(商科), 只是熟练使用数学工具而已....
另外想分享一点工具论, 在我眼里, 数学符号, 公式, 代码, 其实本质都是一样的, 就是一个靠谱的工具, 目标都是为了对现实世界的另一种刻画. 当然世界很大, 可以感性认知, 也可理性认知, 探索的过程是其乐无穷的. 我感觉自己内心还是一个文艺青年的特征, 追求内心的感受, 也有故作伤春悲秋....不说这些了..
Complete "Z"
假设有 3个观测样本, Z 是已知时:
s1:
z : 1, 1, 2, 2, 2, 3
x : a, b, a, c, c, b
s2:
z : 2, 1, 3, 3, 2
x : a, a, c, b, a
s3:
z : 1, 1, 3, 2
x : b, a, a, c
在 z 已知道的这种 上帝视角 下, 求解 参数 (初始状态, 状态转移矩阵, 发射概率) 就是词频统计, 然后归一化作为概率值 , 非常容易的.
为了方便简单演示, 假设样本空间 就是上面这3个样本, 观测值和其隐变量状态都是已知的.
首先来估计 \(\pi\) (初始状态) 即每一个样本(向量 1x3) 的第一状态分量的频数统计, (约定先行后列哦)
状态1 | 状态2 | 状态3 | |
---|---|---|---|
频次 | 2 | 1 | 0 |
然后再 归一化 得到 初始状态 (向量) :
\(\pi = [\frac {2}{3}, \frac {1}{3}, \frac {0}{3}]\)
接着来估计 A (状态转移矩阵), 状态与状态间的, 即 3x3 的矩阵. 同时, 状态要 横向来看, 统计是 先行后列
---> | 状态1 | 状态2 | 状态3 |
---|---|---|---|
状态1 | 2 | 1 | 2 |
状态2 | 1 | 2 | 1 |
状态3 | 0 | 2 | 1 |
按行 进行归一化即可得到概率 (严格来说, "频率" 应该更适合, 但我们通常都是用 样本估计总体, 也说得通哈)
---> | 状态1 | 状态2 | 状态3 |
---|---|---|---|
状态1 | 2/5 | 1/5 | 2/5 |
状态2 | 1/4 | 2/4 | 1/4 |
状态3 | 0/3 | 2/3 | 1/3 |
最后来估计 B (发射概率矩阵), 即每个状态下, 每个观测值的概率, 即可 3x3 的矩阵 (统计也是约定, 先行后列哈)
---> | a | b | c |
---|---|---|---|
状态1 | 3 | 2 | 0 |
状态2 | 3 | 0 | 3 |
状态3 | 1 | 2 | 1 |
同样 按行 做归一化可得到 发射概率矩阵 B:
---> | a | b | c |
---|---|---|---|
状态1 | 3/5 | 2/5 | 0/5 |
状态2 | 3/6 | 0/6 | 3/6 |
状态3 | 1/4 | 2/4 | 1/4 |
因此, 在已知 Z 的情况下, 要做的就是直接统计出了 模型的参数: 初始概率状态(向量), 状态转移概率 (矩阵), 发射概率 (矩阵). 站在上帝视角, 果然爽歪歪. 此处突然想到了基本经济社会问题. 就是, 你所掌握资源越多, 就越有发言权, 做事情成功的概率必然很大和相对轻松.
Incomplete "Z"
而我们身处的现实世界, 几乎是没有上帝视角的. 它只存在于理论的乌托邦世界. 于是在现世的洪流, 我们通常只是看到 观测到的现象, 而无法得知现象背后的上帝,是如何扔骰子的, 即便如此, 我们依旧去进行一个逼近, 利用智慧, 嗯, 说得有高大上, 这里其实就用到 EM 算法来进行一个参数估计即可.
\((x, z) - 简单统计 - \theta\) 而,
$ (x, ) - how - \theta$
F/B 算法 ( Forward And Backward)
就要要计算出 \(p(z_k | x)\) 即 在 给定 x 的情况下, 可以计算 任意时刻状态下的 z 的期望
通过 F/B 算法, 可以计算出: \(p(z_k = 1 |x), p(z_k = 2 |x), ....p(z_k = m |x)\)
也就是说, 通过 观测 X, 计算出了 Z, 然后简单统计则可 估计出模型的参数, 再来捋一波条件
-
F / B : \(p(z|x)\)
-
Forward : 用来计算 \(p(z_k | x_{1...k})\)
-
Backward : 用来计算 \(p(x _{k+1, ...n} | z_k)\)
如何将它们关联起来呢, , 涉及条件概率, 同时也会想到贝叶斯公式 呀.
\(p(z_k|x) = \frac {p(z_k, x)}{p(x)}\)
这里的 x 表示所有的 n 个样本嘛, 因此为了和 F, B 产生联系, 可以将 x 进行划分 (展开).
\(p(z_k, x) = p(z_k, x_{1...k}, x_{k+1...n})\)
\(=p(z_k, x_{1...k}) \ p(x_{k+1...n} | z_k, x_{1..k})\)
可以省略掉 \(x_{1...k}\) 考虑条件独立的情况下, 其对条件概率是没有影响的.
\(=p(z_k, x_{1...k}) \ p(x_{k+1...n} | z_k)\)
为啥是 条件独立成立?
因为, directional separation 性质: (嗯, 就可理解为条件独立的一种更高级的一个性质), 用处就是帮助我们来判断多个变量中, 有哪一些变量之间, 是有条件独立的性质的, 或者是把很多的变量看作一个集合.
我们在谈条件独立的时候, 通常是以单个变量来参照的. 然而涉及多个变量, 则需用的 D-separation 性质了呀. 嗯....举个栗子, 假设我有两波变量, 然后通过 D-separation 性质, 可以帮我们判断, 其中一波变量, 是否对其条件概率产生了影响. 算是一个更加泛化的一个条件独立性质.
在本例中, 我们把 X, 拆分成了 \(x_{1...k-1}, \ x_k, \ x_{k+1...n}\) 在 D-separation 性质中, \(x_k\) 这个分割点被称为 Block , 如果当 存在变量 (可以多个) x - Block - y 且指向关系是 x -> Block -> y 的时候, 则可以认为, x(变量集合) 是条件独立于 Block 的. 因此可以省略掉. (具体 D-separation 性质证明, 后面再补一波百度吧, 先用上再说)
最终 \(p(z_k, x) = p(z_k, x_{1...k}) \ p(x_{k+1...n}|z_k)\) 即通过计算 Forward 和 Backward 完成最终求解.
重要信息,再重复一遍: 我们为了计算 \(p(z|k)\) 其实只需要计算出 Forward 和 Backward 即可, 这也就是 通过 X 计算出了 Z, 从而依上 complete 的简单统计, 求解出模型参数
然后关如何去定义 Z 的个数, 其实是一个超参数, 有点类似于 EM算法中, 最开始 E部的初始值, 人工可以根据经验来控制的.
小结
然后好像有点大篇幅的在弄 F/B 算法, 而开篇主要想阐明参数估计的核心是 EM算法, 那体现在何处呢? 我们捋一波求解参数的过程:
首先, 我们是要通过在给定 X 的情况下, 求解出 Z 的期望, 这个求解过程用到了 F/B 算法;
其次, 我们通过已知 (X, Z) 来求解出了参数 \(\theta\)
这, 不就是 EM 算法的 E步 和 M 步了呀.
最后, 其实还遗留了一个问题, 就是如何求解 F/B 嗯, 想一波先. 框架是没问题了, 这就跟写代码一样, 逻辑结构, 模块划分已经搭起来了, 然后就是慢慢去找别人的代码来复制粘贴的过程, 先想一波哈.