HMM - (补充) 参数求解之 F/B 算法细节
回顾
上篇通过EM算法思想来求解 HMM 的参数 \(\theta=(\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 \rightarrow X $ 发射概率矩阵
\(Z \rightarrow 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 算是稍微明白了许多.
HMM - (补充) 参数求解之 F/B 算法细节的更多相关文章
- 文本主题模型之LDA(二) LDA求解之Gibbs采样算法
文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...
- flink 批量梯度下降算法线性回归参数求解(Linear Regression with BGD(batch gradient descent) )
1.线性回归 假设线性函数如下: 假设我们有10个样本x1,y1),(x2,y2).....(x10,y10),求解目标就是根据多个样本求解theta0和theta1的最优值. 什么样的θ最好的呢?最 ...
- 那些有关求解next数组的算法
next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strl ...
- day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号
python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...
- HMM模型学习笔记(前向算法实例)
HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...
- Deep Learning 学习笔记(7):神经网络的求解 与 反向传播算法(Back Propagation)
反向传播算法(Back Propagation): 引言: 在逻辑回归中,我们使用梯度下降法求参数方程的最优解. 这种方法在神经网络中并不能直接使用, 因为神经网络有多层参数(最少两层),(?为何不能 ...
- HMM模型学习笔记(维特比算法)
维特比算法(Viterbi) 维特比算法 编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比 ...
- C# 二元一次方程参数求解
本文记录了关于求直线斜率及纵截距值的简单方法,只是简单的记录下求解思路,最终还需根据具体项目进行优化. 设直线方程式为:y=kx+b 编程思想: 1.代入y1与x1的值,得到:y1=kx1+b 2.代 ...
- 神经网络(9)--如何求参数: backpropagation algorithm(反向传播算法)
Backpropagation algorithm(反向传播算法) Θij(l) is a real number. Forward propagation 上图是给出一个training examp ...
- Paxos算法细节详解(一)--通过现实世界描述算法
Paxos分析 最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bit ...
随机推荐
- 在python中通过模型api
前言 首先我选择的siliconflow(硅基流动)平台来调用它的api,无为啥,就是因为我点击了别人的邀请链接它送了我14块余额,那个人同样也获得14块余额 这时候,就不得不说一下我的邀请链接了ht ...
- vue element 动态增加表单并进行表单验证
表单验证:需要注意的一点是: 普通表单验证单项依靠的是prop-而动态生成的表单要用:prop 书写的语法是:prop="'moreNotifyObject.' + index +'.not ...
- Redis 大 Key 分析利器:支持 TOP N、批量分析与从节点优先
背景 Redis 大 key 分析工具主要分为两类: 1. 离线分析 基于 RDB 文件进行解析,常用工具是 redis-rdb-tools(https://github.com/sripathikr ...
- CF2018C Tree Pruning
分析 好像官方题解是反向求解的,这里提供一个正向求解的思路,即直接求出最后所有叶节点到根的距离相同为 \(x\) 时需要删除的结点数 \(ans_x\) . 如果我们最后到根的相同距离为 \(x\), ...
- 使用 SK 进行向量操作
先祝大家 2025 新年好. 在 2024 年落地的 LLM 应用来看,基本上都是结合 RAG 技术来使用的.因为绝大多数人跟公司是没有 fine-turning 的能力的.不管是在难度还是成本的角度 ...
- php用token做登录认证
https://blog.csdn.net/qq_20869933/article/details/133201967 作用: PHP 使用token验证可有效的防止非法来源数据提交访问,增加数据操作 ...
- Ai 文本生成式大模型 基础知识
提示工程-RAG-微调 工程当中也是这个次序 提示词工程 RAG 微调 先问好问题 再补充知识 最后微调模型 RAG相关技术细节 选择合适的 Chunk 大小对 RAG 流程至关重要. Chunk 过 ...
- 【P7&Loongson】支持部分中断/异常处理
概况 常规单发射5级流水线cpu.新增支持指令{mtc0, mfc0, eret, syscall, break, bgezal, bltzal}:新增异常处理{Int, AdEL, AdES, Ov ...
- linux ubuntu mysql 默认密码
前言 linux ubuntu安装mysql Ubuntu 安装 MySQL 后,在 /etc/mysql 目录下有个 debian.cnf,这里存储着默认的密码. [client] host = l ...
- golang定时器函数 每隔几分钟执行一个函数
延时调用 AfterFunc go function() func function() { // TODO 具体逻辑 // 每5分钟执行一次,递归调用自己 time.AfterFunc(5*time ...