HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)

HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)

回顾 HMM

上篇介绍了HMM这样的一种时序类模型, 即描述了一些观测现象的产生, 是由我们很难观测到的 "隐变量因子", 产生的, 同时这些隐变量因子之间的变化也有一个状态转移概率的过程.

HMM 的推导过程, 也就两个部分, Z 过程 (推断过程) 和 Estimation(参数估计)过程.

上篇对于 Z 过程, 有通过类似于 枚举法 和 一种 DP (动态规划) 算法来求解最好的 Z, 其前提假设是模型的参数 (初始状态, 状态转移概率矩阵, 发射概率) 已知 下来求解的. 嗯. 推导思路过程有点类似之前的 XGBoost 算法, 也是先假定, 再推导, 在证明假设前提这样的套路, 过程又用到了 EM算法来求解.

如果我是面试官, 问HMM, 这相当于将 EM 和 DP 算法 同时问了, 这样的问题就很有质量哦.

12月底恰好tableau老铁跟我分享动态规划,果然数学系就是不一样, 用爬n阶楼梯来说明, 斐波那契数. DP的核心思想就是将问题规模不断缩小求解, 不同于递归哈, 后面可以单独举个 DP 栗子.

so, 本篇就来整一波, 如何进行参数求解.

θ=(π,A,B)

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

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

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

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

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

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

  • 给定模型的参数, 找出最适合的 Z => Inference (推断过程)
  • 估计模型参数的 θ => 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个样本, 观测值和其隐变量状态都是已知的.

首先来估计 π (初始状态) 即每一个样本(向量 1x3) 的第一状态分量的频数统计, (约定先行后列哦)

状态1 状态2 状态3
频次 2 1 0

然后再 归一化 得到 初始状态 (向量) :

π=[23,13,03]

接着来估计 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)θ 而,

(x,)howθ

F/B 算法 ( Forward And Backward)

就要要计算出 p(zk|x) 即 在 给定 x 的情况下, 可以计算 任意时刻状态下的 z 的期望

通过 F/B 算法, 可以计算出: p(zk=1|x),p(zk=2|x),....p(zk=m|x)

也就是说, 通过 观测 X, 计算出了 Z, 然后简单统计则可 估计出模型的参数, 再来捋一波条件

  • F / B : p(z|x)

  • Forward : 用来计算 p(zk|x1...k)

  • Backward : 用来计算 p(xk+1,...n|zk)

如何将它们关联起来呢, , 涉及条件概率, 同时也会想到贝叶斯公式 呀.

p(zk|x)=p(zk,x)p(x)

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

p(zk,x)=p(zk,x1...k,xk+1...n)

=p(zk,x1...k) p(xk+1...n|zk,x1..k)

可以省略掉 x1...k 考虑条件独立的情况下, 其对条件概率是没有影响的.

=p(zk,x1...k) p(xk+1...n|zk)

为啥是 条件独立成立?

因为, directional separation 性质: (嗯, 就可理解为条件独立的一种更高级的一个性质), 用处就是帮助我们来判断多个变量中, 有哪一些变量之间, 是有条件独立的性质的, 或者是把很多的变量看作一个集合.

我们在谈条件独立的时候, 通常是以单个变量来参照的. 然而涉及多个变量, 则需用的 D-separation 性质了呀. 嗯....举个栗子, 假设我有两波变量, 然后通过 D-separation 性质, 可以帮我们判断, 其中一波变量, 是否对其条件概率产生了影响. 算是一个更加泛化的一个条件独立性质.

在本例中, 我们把 X, 拆分成了 x1...k1, xk, xk+1...n 在 D-separation 性质中, xk 这个分割点被称为 Block , 如果当 存在变量 (可以多个) x - Block - y 且指向关系是 x -> Block -> y 的时候, 则可以认为, x(变量集合) 是条件独立于 Block 的. 因此可以省略掉. (具体 D-separation 性质证明, 后面再补一波百度吧, 先用上再说)

最终 p(zk,x)=p(zk,x1...k) p(xk+1...n|zk) 即通过计算 Forward 和 Backward 完成最终求解.

重要信息,再重复一遍: 我们为了计算 p(z|k) 其实只需要计算出 Forward 和 Backward 即可, 这也就是 通过 X 计算出了 Z, 从而依上 complete 的简单统计, 求解出模型参数

然后关如何去定义 Z 的个数, 其实是一个超参数, 有点类似于 EM算法中, 最开始 E部的初始值, 人工可以根据经验来控制的.

小结

然后好像有点大篇幅的在弄 F/B 算法, 而开篇主要想阐明参数估计的核心是 EM算法, 那体现在何处呢? 我们捋一波求解参数的过程:

首先, 我们是要通过在给定 X 的情况下, 求解出 Z 的期望, 这个求解过程用到了 F/B 算法;

其次, 我们通过已知 (X, Z) 来求解出了参数 θ

这, 不就是 EM 算法的 E步 和 M 步了呀.

最后, 其实还遗留了一个问题, 就是如何求解 F/B 嗯, 想一波先. 框架是没问题了, 这就跟写代码一样, 逻辑结构, 模块划分已经搭起来了, 然后就是慢慢去找别人的代码来复制粘贴的过程, 先想一波哈.

posted @   致于数据科学家的小陈  阅读(2049)  评论(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最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航