码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-12-29 00:53:02      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:一个   轻松   变化   数学   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 嗯, 想一波先. 框架是没问题了, 这就跟写代码一样, 逻辑结构, 模块划分已经搭起来了, 然后就是慢慢去找别人的代码来复制粘贴的过程, 先想一波哈.

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

标签:一个   轻松   变化   数学   em算法   帮助   矩阵   计算   如何   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!