HMM

回顾

上篇通过EM算法思想来求解 HMM 的参数 ( heta=(pi, A,B)) 即 初始状态概率(向量), 状态转移概率(矩阵), 发射概率矩阵. 在上帝视角, 即已知隐变量 Z , 则通过简单的词频统计, 再归一化 就求解参数了.

而问题在于我们不是上帝, 只能通过观测值 X , 通过 F/B 算法 来求解出 Z, 即:

(p(z_k|x) = frac {p(z_k, x)}{p(x)}) 这是求解目标

这里的 x 表示所有的 n 个样本嘛, 因此为了和 F, B 产生联系, 可以将 x 进行划分 (展开).

Forward: (p(z_k | x_{1...k}))

Backward: (p(x_{k_1...n} | z_k))

(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}))

条件概率: P(a, b) = P(a)P(b|a) = P(b) P(a|b)

可以省略掉 (x_{1...k}) 考虑条件独立的情况下, 其对条件概率是没有影响的, 参考: D-separation性质

(=p(z_k, x_{1...k}) p(x_{k+1...n} | z_k)) 最核心公式

框架搭建起来了, 然而如何去求解这个公式, 还没有搞好, 于是这篇就来整一波计算 F/B 的细节.

Forward 算法求解

(X: x_1, x_2, x_3, ...x_n) 每个观测是一个向量哦

(Z : z_1, z_2, ...z_k ..z_n) 每个隐变量是一个值

$Z ightarrow X $ 发射概率矩阵

(Z ightarrow Z) 转移概率矩阵

**需求: ** (p(z_k, x_{1...k})) 这个 概率值 (注: (z_k) 是个标量, (x_{1..k}) 是个向量)

要求解这个问题, 还是要用 动态规划 , 即把大的问题, 不断拆解为更小的问题来求解, 最直观的拆解, 即:

(p(z_k, x_{1...k}) 拆解为: p(z_{k-1}, x_{1..k-1}))

在动态规划的框架下呢,

相当于 (p(z_k, x_{1...k}) = 某式子 * p(z_{k-1}, x_{1...k-1}))

因为, 这是它的子问题. 怎么做呢, 嗯首先, 观察一波右边, 看哪些变量是没有出现在左边的, 比如 (x_{1...k-1}) 其实是包含在左边式子中的, 而 (z_{k-1}) 是没有出现在左边式子的.

即我们要想办法, 将左边的式子, 称为有包含右边的 (z_{k-1}) 项的, 方式就是求和, 如果是连续型, 就进行积分 呀.

(p(z_k, x_{1...k}) = sum limits _{z_{k-1}} p(z_{k-1}, z_k, x_{1...k}))

注意 (sum) 的下标是 (z_{k-1}) 跟前面对 X 进行分段是有类似的思想

然后, 后面的工作就是要将这个式子, 如何转换为 (某式子 * p(z_{k-1}, x_{1...k-1})) 的形式. 同上一样, 对 X 进行拆分:

(=sum limits _{z_{k-1}} p(z_{k-1}, z_k, x_{1...k-1}, x_k))

(=sum limits _{z_{k-1}} p(z_{k-1}, x_{1...k-1}) p(z_k | z_{k-1}, x_{1...k-1}) p(x_k | z_k, z_{k-1}, x_{1...k-1}))

就是利用联合概率公式 P(a, b, c) = P(a) P(b|a) P(c|a, b) 注意是有向的哈, 根据之前的有向图是一样的.

这里来仔细分析一波这个求和里面的 公式:

  • (p(z_{k-1)}, x_{1...k-1})) 是咱要的 子问题

  • (p(z_k|z_{k-1}, x_{1...k-1})) 如果不考虑 (x_{1...k-1}) 则变为 (p(z_k | z_{k-1})) 就是咱熟悉的 状态转移矩阵

  • (p(x_k | z_k, z_{k-1}, x_{1...k-1} )) 如果不考虑 (z_k, x_{1...k-1}) 则变为 (p(x_k | z_k)) 就是咱熟悉的 发射概率矩阵

从上篇已经知道了, 在模型已经的情况下, 是很容易计算 发射概率和状态转移的, 因此, 我们现在又要来考虑, 上面 如果不考虑的变量, 是否对咱的条件概率产生影响. 判断是方式依然是 D-separation 规则:

  • 对于 (p(z_k|z_{k-1}, x_{1...k-1})) 涉及的元素, (x_{1...k-1}, z_{k-1}, z_k) 恰好是满足" tail to tail " 因此 (x_{1...k-1}) 不影响结果

  • 对于 (p(x_k | z_k, z_{k-1}, x_{1...k-1})) 涉及, (x_{1...k-1}, z_{k-1}, z_k, x_k) 这恰好是"tail to head"因此 (x_{1...k-1}, z_{k-1})不影响结果

(p(z_k, x_{1...k}) = sum limits _{z_{k-1}} p(z_{k-1}, x_{1...k-1}) p(z_k | z_{k-1}) p(x_k | z_k))

后两项是状态转移矩阵 和 发射概率矩阵, 知道模型参数下, 是非常容易计算的, 现就关注:

类似EM算法的 E 步, 计算的时候, 也可手工初始化一个值来进项不断迭代计算的

(p(z_{k-1}, x_{1...k-1})) 这个就是典型的 动态规划 了.

如果把上边 (p(z_k, x_{1...k})) 看为是 (alpha_k(z_k)) , 则 (p(z_{k-1}, x_{1...k-1})) 就是 (alpha_{k-1} (z_{k-1})) .... 这样的一个动态过程, 其复杂度是 (O(n*m^2))

动态规划的思想是, 将大的问题拆解为子问题, 即把之前的计算的过程保存下来, 再反复使用哦.

Backward 算法求解

前边的 Froward 算法是用来计算 (p(z_k | x_{1...k})) 的概率值.

此处 Backward 算法则是来计算 (p(x_{k+1...n} | z_k)) 的概率值.

求解思路也是一样的, 不过要注意这里是 backward 即是从后面往前, 进行子问题拆分, 即:

(p(x_{k+1...n} | z_k) = 某个项 * p(x_{k+1...}| z_{k+1}))

(=sum limits _{z_{k+1}} p(x_{k+2...n}, x_{k+1}, z_{k+1} |z_k))

**同上一样的拆分方法 即 **P(a, b, c) = P(a) P(b|a) P(c|a, b)

(=sum limits _{z_{k+1}}p(z_{k+1}|z_k) p(x_{k+1}|z_{k+1}, z_k) p(x_{k+2...n} |z_{k+1}, z_k, x_{k+1}))

同样用 D-separation 的性质来进行 判断看是否能无关变量

(=sum limits _{z_{k+1}} p(x_{k+2...n} |z_{k+1}) p(x_{k+1}|z_{k+1}) p(z_{k+1}|z_k))

得到跟之前一样的形式, 即这3项分别为: 子问题, 发射概率, 转移矩阵

然后同样对子问题: (p(x_{k+2..n}|z_{k+1})) 进行动态规划求解.

至此, 我们已经能知道, 在已知 X 的前提下, 对任意状态 Z_k 是可以求解的, 即 (p(z_k|x)) , Forward * Backward 核心思想还是 EM算法呀. 这样对于 HMM 算法的参数求解, 针对已知 X, Z 直接统计即可; 在知道 X, 不知 Z 的情况下, 通过 EM 算法求解即可, 核心技巧是 F/B 算法, 而本篇对 F/B 算法的细节也做了推导, 其核心还是 发射概率, 状态转移还有动态规划求解, 至此, HMM 算是稍微明白了许多.

原文地址:https://www.cnblogs.com/chenjieyouge/p/12121832.html