HMM (隐马尔可夫) 推导 (上) - Viterbi算法求解 隐变量

认识

跟 EM 算法的那部分是有些类似的思想, 引入 "隐变量" (Latent Variable).

对于观测样本:

\(x_1, x_2, x_3, ...x_n\)

存在相对应的 Latent 变量:

\(z_1, z_2, z_3, ...z_n\)

可以理解为观测值的另一种表示, 而且很难直观去观测到, 就像之前 EM 里面的扔硬币, 只能看到最后结果, 却不知道该结果是由哪个硬币产生 的.

在 HMM 中, 我们把 \(z_1, z_2, ...z_n\) 叫做 状态, 不同的状态, 生成对应的 观测值, 而状态之间是有一个状态转移(矩阵)

case 扔硬币

跟之前的 EM 一样的. 假设有2个硬币 A, B , 已知事件, 正面朝上的概率分别为 \(\mu_1, \mu_2\) 即:

\(A: \ P(正面) = \mu_1; \ p(反面) = 1-\mu_1\)

\(B: \ P(正面) = \mu_2; \ p(反面) = 1-\mu_2\)

现在开始扔硬币, 我们只能看到最终的结果, 却不知该结果是由哪个硬币产生的.

也不是乱扔, 扔也是有一定概率分布(状态转移)的, 只是不知道而已

我们重点关系如下几个问题:

  • 假设知道模型参数(就假设知道 z1->x1, z2-x1 的概率下, 如何通过 观测结果 反推 背后逻辑

Viterbi 算法 求解

  • 知道观测值, 如何进行参数估计 (此处就是通过 "正,反"的结果去估计 z 的转移概率和 \(\mu_1, \mu_2\)

可用前面的 EM 算法求解

  • 参数已知, 如何根据观测值去做 预测

预测

需求: 计算 \(p(正, 正, 正, 反, 正, 反)\)

求解: 考虑所有的状态 \(s\) , 即: \(\sum \limits_{s} p(正, 正, 正, 反, 正, 反 | s) p(s)\) => 可用DP算法求解 (动态规划)

硬币自身的产生"正面朝上" 的概率, 被称为 发射概率 (Emission Probability)

如何选择下一次扔哪个硬币的这个规律性 \(\theta\), 被称为 转移概率 (Transtion Probability)

还有最开始的一个状态, 嗯, 就叫初始状态 Initialization 吧

转移矩阵是要通过学出来, 通过EM算法来找出背后的逻辑呀

对于初始状态, 相当于第一实验, 有一个策略, 比如 0.7 概率会选择A, 0.3 概率选择B, 然后后面的则根据 \(\theta\) 参数来选择呀

可以发现, 核心的参数求解过程, 还是用的EM算法呀, 需求解出3个参数: 初始状态, 发射概率, 转移矩阵

case2 词性分析

其实我们每说一句话, 是有背后的词性逻辑的, 即语法. 只是我们平时并不关注而已, 但, 存在.

隐变量 : 主 + 谓 + 宾

观测值 : 我 + 想 + 你

  • 对于 隐变量, 即"主谓宾"的顺序, 是有规律的, 这个规律就是我们说的 状态转移矩阵

  • 而我们直接听到的是 "我想你"

于是 HMM 用在在词性分析上,

EM 部分, 所要做的事情是, 通过 我想你 这样的句子, 去 发现背后的 主谓宾词性规律

而预测部分则是, 通过算好的模型参数, 去生成新的句子.

感觉这不是就是在打造一个 聊天机器人吗

HMM 参数估计

\(\theta = (A, B, \pi)\)

假设有5个状态, 同样是扔2个硬币

\(\pi\) 表示初始状态, 如: \(\pi = [0.8, b, c, d, e]\)

A 表示两个状态的转移矩阵; 是一个 5x5 的方阵

B 表示发射概率 (隐含规则->观测的概率值); 是一个 5x2 的矩阵

如果是词性分析, 则矩阵就非常大了, 如果观测是连续型 则需要用 概率分布来描述了.

对于, HMM, 要求解出这3个参数, 主要有两个步骤, 或者说是2个关键点:

  • 给定模型的参数, 找出最适合的 Z => Inference (推断过程)
  • 估计模型参数的 \(\theta\) => Parameter Estimation (估计过程)

最好的 Z 状态 - 枚举法

Z 就是隐变量.

前提条件是模型参数已知哦.

最能想到的一种方式, 就是枚举法, 将 所有可能的 z 都枚举出来, 选择最好的一个 z 状态.

什么是最好的状态, 就是 极大似然估计最大的参数呀

具体如何选择呢, 假设 z = 1, 1, 1, 1, 1 其实就是:

\(p(x, z) = [p(z_1 = 1)p(z_2 = 1|z_1=1)p(z_3=1|z_2=1)p(z_4=1 |z_3=1) p(z_5=1|z_4=1) ] \\ * [p(x_1 |z_1=1) p(x_2|z_2=1) p(x_3|z_3=1)p(x_4|z_4=1)p(x_5|z_5=1)]\)

同样, 简化一点哈, 假设 状态有3种, z = 1,3, 2则:

\(p(x, z) = [p(z_1=1)p(z_2=3 |z_1=1)p(z_3=2|z_2=3)] * [p(x_1|z_1=1)p(x_2|z_2=3)p(x_3|z_3=2]\)

....

最后选出最大的 状态 Z 即可呀. (有点像, 求给定 z 求最大的后验概率 \(p(z|x) = \frac {p(z,x)}{p(x)}\) 分母一样, 只关心 分子p(z, x)即可, 但涉及p(x)的计算很麻烦, 而我们目的是最大化 p(z|x) => 关注 p(z, x) 即可, p(x) 是不需要考虑的)

目标导向和数学思维才是最为重要的, 注, 此阶段是假定已经知道所有模型参数的情况下来求解哦

对于离散型的, 即一个状态对应 一个向量, 可用用 不同的(均值, 方差) 的高斯分布来进行估计 发射概率, 每一个状态就对应一个高斯分布而已. 参数是 \((\mu, \Sigma)\) 也都是学出来的 (就是模型的 B),

最好的 Z 状态 - Viterbi 算法

比之前的枚举还是要好一点, Viterbi 就是一个 动态规划算法.

​ z_1 z_2 z_3 z_4 z_5 z_6 z_n

1 x x x x x x x

2 a a x x x x x

j x x a a x a x

... x x x x a x a

m x x x x x x x

列就表示 我们要求解的状态, 行表示每个状态想的所有取值

这样来看, 其实我要求最好的 z 则 是去选择 z1 ... z_n 最好的 路径, 使得这个路径的值, 即联合概率 p(x, z) 是最大的

so, 这样问题就变成了, 寻找最优路径, 关于找路径, 可以用 动态规划算法求解的哦. 先定义个一变量:

\(\delta_k (j)\)

表示一开始从 状态 z_1 到 状态 z_k 且 z_k 取值为 第j 行的那个 节点的最好路径的值

\(\delta _{k+1} (j)\)

表示 z_(k+1) 最好的状态, 跟其前一个状态 z_k 的每个取值(行) 是有关联的, 一直往前这样去 分割问题

\(\delta _{k+1} (j) = max\) (

\(\delta_{k(1)} + log \ p(z_{k+1}=j | z_k=1)\),

\(\delta_{k(2)} + log \ p(z_{k+1}=j | z_k=2)\),

\(\delta_{k(3)} + log \ p(z_{k+1}=j | z_k=3)\),

​ ...

\(\delta_{k(m)} + log \ p(z_{k+1}=j | z_k=n)\),

)

其实每一项还有一个发射概率, 可以省略, 因为每行, 其实是一样的值呀

整个过程有点跟 XGBoost 有点像. 在计算 \(\delta_1 ....\delta_n\) 每后一下的行值, 都是由前一列的值来计算出来的, 这样一直从前往后的过程, 全部循环过后呢, (就很像是在按列填充一个二维表) .

最后的评估, 其实就是从最后一列值中选择最大的值, 及其所在的节点位置, 然后从后往前进行节点的 "溯源" 就完整地画出了最优路径了呀.

由此再从前往后写出最后的 z 答案 (假设上述的 a) 则: z = 2, 2, .j..j..j)

至此, 关于 HMM 的 inference 部分就求解结束, 然后, 是关于参数估计的部分推导.

猜你喜欢

转载自www.cnblogs.com/chenjieyouge/p/12105188.html