本文目录导读:
隐马尔可夫模型(HMM)是一个非常经典的统计模型,主要用于处理时间序列数据或序列标注问题,它的核心思想是:系统存在一组隐藏的状态,我们无法直接观测到这些状态,但可以观测到由这些状态按一定概率生成的观测值。
透过现象看本质”。
下面我分几个步骤,用通俗的语言和实际例子,告诉你HMM怎么用。
核心步骤:一个HMM的完整用法通常包含三步
使用HMM解决实际问题,基本遵循以下流程:
- 定义问题:确定什么是“隐藏状态”,什么是“观测值”。
- 模型学习(训练):从现有的数据中,学习出HMM的三个关键参数(A, B, π)。
- 模型应用(预测/解码):用训练好的模型,去解决实际问题。
最经典的例子:词性标注
假设你想用HMP来做词性标注(给一句话中的每个词标出它是名词、动词还是形容词)。
第一步:定义问题
- 隐藏状态:每个单词的词性(如:名词N, 动词V, 形容词Adj, 介词P等),这是我们想知道的,但看不到的。
- 观测值:你看到的每个具体的单词(如:“cat”, “eat”, “the”, “fish”)。
- Q1. 初始概率分布 (π):一句话开始时,第一个词是名词、动词等的概率有多大?“名词”开头的概率远大于“动词”开头。
- Q2. 状态转移概率矩阵 (A):从一个词性转移到下一个词性的概率,一个名词后面跟动词的概率很高(“猫 吃”),但一个动词后面跟另一个动词的概率就很低(“吃 跑”)。
- Q3. 观测概率矩阵 (B):在某个隐藏状态下,生成某个具体单词的概率,在“名词”状态下,生成“猫”的概率很高,生成“吃”的概率很低。
第二步:模型学习(训练)
你需要一个已经标注好词性的语料库,
猫/N 吃/V 鱼/N
我/N 喜欢/V 你/N
- 学习 π:统计语料中所有句子第一个词的词性,比如有100个句子,其中80个第一个词是名词,(名词) = 0.8。
- 学习 A:统计语料中所有相邻单词词性的转移情况,在“N→V”这个转移发生了100次,而“N→N”只发生了10次,那么A(从N到V) = 100/110 = 0.91,A(从N到N) = 10/110 = 0.09。
- 学习 B:统计在每个词性下,每个单词出现的频率,在所有名词中,“猫”出现了50次,而总共有1000个名词,那么B(名词 → “猫”) = 50/1000 = 0.05。
核心算法:训练HMM参数最常用的是Baum-Welch算法(也叫EM算法),它是一种无监督或半监督学习算法。
第三步:模型应用(预测/解码)
你有了一个训练好的HMM(π, A, B),你收到一句新的话:“猫 吃 鱼”。
你想知道它的词性序列是什么?这就是解码问题。
- 输入:观测序列
[“猫”, “吃”, “鱼”] - 目标:找到最可能的隐藏状态序列
核心算法:最常用的是Viterbi算法(维特比算法),它是一种动态规划算法,能高效地找到最可能的路径。
Viterbi算法大致过程(简化版):
- 开始:第一个词“猫”,查B矩阵,看它在“名词”和“动词”下出现的概率,再结合π,可以算出第一个词是“N”的概率最大。
- 第二步:第二个词“吃”,Viterbi算法会计算所有可能的路径(N→V, N→N, V→V等),并保留概率最大的那条路径,它会算出最可能的路径是“N→V”。
- 第三步:第三个词“鱼”,类似地,它会计算所有路径,最终找到全局最优的路径:“N → V → N”。
最终输出:猫/N 吃/V 鱼/N
其他常见应用场景
| 应用领域 | 隐藏状态 | 观测值 | 核心目标 |
|---|---|---|---|
| 语音识别 | 音素或声学状态 | 声波信号(MFCC特征) | 根据声波推测最可能的音素序列 |
| 生物信息学 | 基因序列的功能区域(如外显子、内含子) | DNA碱基序列(A,T,C,G) | 识别基因中的编码区 |
| 手写识别 | 笔画或字母 | 笔迹轨迹的坐标点 | 根据轨迹识别出写的是什么字 |
| 金融预测 | 市场状态(牛市、熊市、震荡) | 股价涨跌序列 | 预测未来市场状态或股价走势 |
| 异常检测 | 正常/异常状态 | 系统日志、传感器数据 | 检测系统是否出现异常行为 |
三个核心算法对应三大问题
要使用HMM,你需要掌握三个基本算法,它们分别解决三类问题:
- 评估问题(Forward-Backward Algorithm,前向-后向算法):给定一个模型(π, A, B)和一个观测序列,计算这个观测序列出现的概率,判断哪个模型更符合当前的观测数据。
- 解码问题(Viterbi Algorithm,维特比算法):最常用,给定模型和观测序列,找出最有可能的隐藏状态序列(即我们要预测的“本质”)。
- 学习问题(Baum-Welch Algorithm,鲍姆-韦尔奇算法,属于EM算法):给定观测序列,估计出最合适的模型参数(π, A, B),这是训练模型时用的。
几点重要提醒
- HMM的假设:它假设当前隐藏状态只依赖于前一个状态(马尔可夫性),并且观测值只依赖于当前状态(独立性假设),在很多复杂问题中,这些假设不一定成立,这是HMM的一个局限。
- HMM vs. 深度学习:在2010年左右,HMM是序列建模的主力,但后来循环神经网络(RNN,如LSTM) 和Transformer(如BERT、GPT)因为能捕捉更长的依赖关系,在很多任务(如语音识别、机器翻译)上大幅超越了HMM,不过HMM在可解释性、小样本数据、低资源场景下仍有优势,而且它的思想(隐变量、概率图模型)是现代深度学习的基础之一。
- 库和实现:在Python中,你可以使用
hmmlearn库来快速使用HMM,它提供了高斯HMM、多项式HMM等常用变体,简化了训练和预测过程。
一句话总结HMM怎么用:
先定义好你的“隐藏状态”和“观测值”,然后用hmmlearn库(或自己实现Baum-Welch算法)从数据中学习模型,最后用Viterbi算法找出观测序列背后最可能的隐藏状态序列(一句话中每个单词的词性)。