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

认识

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

对于观测样本:

x1,x2,x3,...xn

存在相对应的 Latent 变量:

z1,z2,z3,...zn

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

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

case 扔硬币

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

A: P()=μ1; p()=1μ1

B: P()=μ2; p()=1μ2

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

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

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

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

Viterbi 算法 求解

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

可用前面的 EM 算法求解

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

预测

需求: 计算 p(,,,,,)

求解: 考虑所有的状态 s , 即: sp(,,,,,|s)p(s) => 可用DP算法求解 (动态规划)

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

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

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

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

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

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

case2 词性分析

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

隐变量 : 主 + 谓 + 宾

观测值 : 我 + 想 + 你

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

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

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

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

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

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

HMM 参数估计

θ=(A,B,π)

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

π 表示初始状态, 如: π=[0.8,b,c,d,e]

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

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

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

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

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

最好的 Z 状态 - 枚举法

Z 就是隐变量.

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

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

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

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

p(x,z)=[p(z1=1)p(z2=1|z1=1)p(z3=1|z2=1)p(z4=1|z3=1)p(z5=1|z4=1)][p(x1|z1=1)p(x2|z2=1)p(x3|z3=1)p(x4|z4=1)p(x5|z5=1)]

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

p(x,z)=[p(z1=1)p(z2=3|z1=1)p(z3=2|z2=3)][p(x1|z1=1)p(x2|z2=3)p(x3|z3=2]

....

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

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

对于离散型的, 即一个状态对应 一个向量, 可用用 不同的(均值, 方差) 的高斯分布来进行估计 发射概率, 每一个状态就对应一个高斯分布而已. 参数是 (μ,Σ) 也都是学出来的 (就是模型的 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, 这样问题就变成了, 寻找最优路径, 关于找路径, 可以用 动态规划算法求解的哦. 先定义个一变量:

δk(j)

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

δk+1(j)

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

δk+1(j)=max (

δk(1)+log p(zk+1=j|zk=1),

δk(2)+log p(zk+1=j|zk=2),

δk(3)+log p(zk+1=j|zk=3),

​ ...

δk(m)+log p(zk+1=j|zk=n),

)

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

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

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

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

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

posted @   致于数据科学家的小陈  阅读(693)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航