资讯详情

资讯详情

模式识别中的马尔可夫链与隐马尔可夫模型:从转移矩阵到序列解码

简介《模式识别》电子书PDF版配套讲义面向人工智能、机器学习初学者及模式识别课程学习者用于系统梳理马尔科夫模型与隐马尔可夫模型的核心知识框架。资源包内共1个PPT文件整体约5.79MB以幻灯片形式组织章节要点、概念定义、概率矩阵与实例图示便于课堂展示或自学时按页查阅。内容从马尔科夫性、马尔科夫链与马尔科夫过程切入说明转移概率矩阵中Pij的含义及齐次链的判定并展开隐马尔可夫模型的状态、观察值、转移概率与观察值概率等要素同时结合语音识别、图像识别、自然语言处理和生物信息学等应用场景借助缸中彩球抽取的经典实验解释观察值序列的生成方式与“缸间转移不可直接观察”等约束。已有1593人学习适合需要快速建立HMM概念脉络、对照课件复习模式识别基础的读者。1. 从「看一眼就认出来」说起模式识别到底在解决什么问题早上出门你能在人群里一眼认出熟人听半句话就知道是谁在说话。这件事对人来说毫不费力可换成机器就变成了一个正经的研究课题——模式识别。通俗地说模式识别就是让机器从一堆原始数据里找出规律再给它们分门别类这段声音属于哪个人这张图里是猫还是狗这串观测背后藏着什么状态。它关心的不是某一次判断有多准而是「同类的东西为什么能被认成同类」这件事本身有没有一套可复用的方法。搞懂这条主线再看模式识别电子书里那些看着吓人的公式就不会觉得是在看天书了。2. 马尔可夫性为什么「将来只和现在有关」模式识别处理的数据很大一部分是「有顺序」的一段语音是一帧接一帧的一段文本是一个词接一个词的一段监控是一秒接一秒的。描述这类数据有个天然难题——序列越长可能的组合就越多把所有历史都塞进模型参数量会直接失控。马尔可夫性就是第一次「剪枝」它不打算记住全部历史只打算记住「此刻在哪」。这一刀砍下去很多原本算不动的问题突然就能算了代价是模型变「健忘」了。2.1 「健忘」的过程一句话说清马尔可夫性按模式识别电子书里的说法如果一个过程的「将来」仅依赖「现在」而不依赖「过去」这个过程就具有马尔可夫性也叫马尔可夫过程。写成式子就是 X(t1) f( X(t) )——下一时刻的状态只由当前时刻的状态决定再往前的信息一概不问。打个比方你下班开车回家堵不堵主要看此刻这条路的路况。你不需要把早上八点出门时走的是哪条街、中午去过哪里全部回忆一遍才能判断下一个路口顺不顺。当前路况这一个变量已经把「接下来会怎样」的大部分信息装进去了。这里要强调一句马尔可夫性是假设不是定理。它说的是「我们决定这样建模」而不是「世界本来就是这样」。现实里很多事情明显不满足它比如一个人说话前面说过的话会影响后面说什么长距离的依赖是存在的。所以这个假设用起来要小心它换来的是计算上的极大简化付出的是对长期记忆的丢失。工程上大量模型是「先假设它成立再看效果」效果好就留着效果差就换更复杂的结构。为什么这个假设这么值钱因为状态的取值是有限的、可枚举的把整段历史压成一个当前状态之后模型要存的参数从「随序列长度指数膨胀」变成「一张固定的表」。这张表就是后面要讲的转移概率矩阵。2.2 从马尔可夫过程到马尔可夫链离散化之后世界变简单了马尔可夫过程是个大筐时间和状态都可以是连续的。而马尔可夫链是它最规矩的一个特例时间和状态都离散。教材里的记法是 {Xn X(n), n 0,1,2,…}意思是我们在时间点 0、1、2、3……上对这个过程做一次次观察得到一个状态序列。状态空间记作 I {a1, a2, …}也就是所有可能状态的集合数量有限、一个个能数出来。「离散」这两个字要拆开看时间离散是说我们只在固定节拍上取一次样比如每天记录一次天气状态离散是说状态只能落在几个固定的格子里比如只允许「晴、阴、雨」三种不允许「半晴半阴 37.5%」这种中间态。两个条件都满足才叫马尔可夫链。链的核心是一个条件概率Pij(m, mn) P{ Xmn aj | Xm ai }。读出来就是——已知第 m 个时刻处在状态 ai那么第 mn 个时刻落到状态 aj 的概率是多少。这里 m 是起点n 是跨了几步i 和 j 分别是起点和终点的状态编号。链上还分「齐次」和「非齐次」。当上面这个概率和起始时刻 m 无关只跟「隔了几步」有关时就叫齐次马尔可夫链。通俗地说就是转移规律不随日历翻页而改变今天从晴天转阴天的概率和下个月从晴天转阴天的概率是同一个数。平时说的马尔可夫链默认都是指齐次马尔可夫链因为一旦允许规律随时间漂移参数就变成无穷多个根本没法估。2.3 转移概率矩阵把一张状态图压缩成一张表把所有两两之间的转移概率排成方阵就是转移概率矩阵。模式识别电子书里给了一个天气的例子直接搬过来最清楚今天 \ 明天晴天阴天下雨晴天0.5000.2500.250阴天0.3750.2500.375下雨0.2500.1250.625读法是按行读第一行说的是「今天晴天」的前提下明天是晴、阴、雨各自的概率第二行换成「今天阴天」第三行换成「今天下雨」。行是起点列是终点这个方向千万别记反。这张表有个硬性约束每一行加起来必须正好等于 1。道理很朴素——从任何一个状态出发下一刻必然转移到所有可能状态中的某一个概率总和当然是 1。原文里那个求和式表达的就是这件事。如果某一行加起来是 0.9 或者 1.1那不是模型有性格是写错了。用一小段代码就能把这件事验一遍顺手算算「隔两天」的转移概率import numpy as np # P[i][j]今天处于状态 i明天转到状态 j 的概率 P np.array([ [0.500, 0.250, 0.250], # 晴天 - 晴 / 阴 / 雨 [0.375, 0.250, 0.375], # 阴天 - 晴 / 阴 / 雨 [0.250, 0.125, 0.625], # 下雨 - 晴 / 阴 / 雨 ]) print(P.sum(axis1)) # 每行之和正常应输出 [1. 1. 1.] print(np.linalg.matrix_power(P, 2)) # 两步转移从今天直接看到后天axis1表示按行求和用来做自检matrix_power(P, 2)是矩阵自乘一次结果的第 i 行第 j 列就是「今天状态 i隔两步之后落到状态 j」的概率。这个自乘不是随便写的它对应一句直观的话走两步的所有中间路线把概率各自乘起来再加总正好等于矩阵乘法的定义。想算三步就自乘两次以此类推。实际建模时这类矩阵最常见的错误不是算错而是漏状态本来有三种状态只写了两种的转移剩下那一份概率无处安放行和就对不上。我见过不止一次有人盯着一个「概率总和 0.95」的矩阵查了半天代码最后发现是状态表少了一个类别。3. 隐马尔可夫模型看得见的是球看不见的是缸马尔可夫链有个隐含前提状态是能直接看见的。今天晴天还是下雨抬头就知道。可现实里大量场景不是这样——你听到的是声波看不到发音器官的动作你看到的是屏幕上的像素不知道图像背后的物体类别。状态明明存在却躲在幕后。隐马尔可夫模型就是为这种「看得见结果、看不见原因」的局面准备的。3.1 双重随机过程HMM 为什么比马尔可夫链多一层模式识别电子书里对它的概括很干脆HMM 的状态是不确定或不可见的只有通过观测序列的随机过程才能表现出来观察到的事件与状态并不是一一对应而是通过一组概率分布相联系。因此它是一个双重随机过程由两部分叠起来一层是马尔可夫链负责描述状态之间怎么转移用转移概率刻画另一层是一般随机过程负责描述状态和观察值之间的关系用观察值概率刻画。打个比方想象你隔着一层帘子听另一个人在屋里从几个坛子里抓球。你能听见他每次报出的颜色红、蓝、红、红、蓝……但你不知道他这一次伸进的是哪个坛子也不知道坛子之间是怎么换的。坛子的切换有自己的规律马尔可夫链那一层每个坛子里各种颜色的球比例不同观察值概率那一层两层随机性叠在一起最后只把颜色序列交到你手上。这就是它比马尔可夫链「多一层」的地方链只回答「下一个状态是什么」HMM 要同时回答「下一个状态是什么」和「这个状态会吐出什么样的观察值」。多出来的这一层让模型更贴近现实也让计算难度上了一个台阶——你手上的数据只是一串颜色要反推坛子序列中间隔着一层看不见的东西。3.2 缸和球的实验把 HMM 五个要素摆到桌面上原文用的是一个很经典的实验设定值得一步一步走一遍。设有 N 个缸每个缸里装了很多彩球球的颜色由一组概率分布描述。实验这样进行根据初始概率分布随机选中 N 个缸中的一个作为起点按这个缸里球颜色的概率分布随机摸出一个球记下颜色为 O1然后把球放回缸中按描述缸之间转移的概率分布随机选出下一个缸重复上一步最后得到一串颜色 O1, O2, …这就是观察值序列 O。把这个过程拆成参数其实就五样东西缺一不可要素含义在缸球实验里对应什么状态数 N隐藏状态一共有几个一共有几口缸观察值集合可能观测到什么球可能有哪几种颜色初始分布第一步落在各状态的概率一开始选中每口缸的概率状态转移矩阵状态之间怎么换从这口缸换到那口缸的概率观察概率每个状态吐出各种观察值的概率每口缸里各色球的比例第 2 步里「把球放回缸中」这个动作很多人读的时候一扫而过其实它是整个模型能成立的关键。放回意味着每口缸的颜色比例在实验过程中保持不变每次摸球的概率分布是同一套如果不放回摸走一个红球缸里红球就少一个下次摸到红的概率就变了观察概率会随时间漂移模型立刻复杂一大截。所以这个细节不是多余的礼貌而是模型假设的一部分。3.3 三条约束为什么缸不能被直接看见原文特意点出了这个实验的三条约束值得逐条掰开第一条不能被直接观察缸间的转移。你能看到的只有颜色看不到手伸向了哪个缸。这正是「隐」字的来源。第二条从缸中所选取的球的颜色和缸并不是一一对应的。如果一一对应——红球必来自一号缸、蓝球必来自二号缸——那么看一眼颜色就知道缸隐藏状态当场暴露问题退化成普通的马尔可夫链HMM 也就没有存在的必要了。正因为有交叉才需要靠概率去推断。第三条每次选取哪个缸由一组转移概率决定而不是临时随便挑。也就是说缸的切换本身是有规律的随机过程不是无规律的乱跳。这三条约束放在一起构成了 HMM 的「难点」也是「价值点」。举个真实感强一点的例子做语音识别时发音的口型、舌位这些「状态」是看不见的能被麦克风录下来的只有波形同一个音可能对应不同波形不同音也可能长得像。这跟「看不见缸、球色与缸不一一对应、换缸有概率规律」是同一个结构。也正因如此HMM 才会被用在语音识别、图像识别、自然语言处理、生物信息学这些领域——它们的共同点是真正想知道的那个东西藏着手上只有它的「影子」。4. HMM 里的三类问题评估、解码、学习模型摆好了接下来自然要问拿它能算什么教材里通常把 HMM 的用法归成三类问题名字听起来唬人其实每一类都对应一个人话版本的提问。4.1 评估这串观察值出现的可能性有多大第一个问题是给定一套参数某串观察值出现的概率是多少。比如手上有几套不同的模型参数分别代表几种可能的场景然后来了一串新的颜色序列想知道它更像哪一套。比较的依据就是「在这套参数下这串观察值出现的概率」谁算出来大就认为谁更合理。难点在于不能硬算。要算这串观察值的概率得把所有可能的隐藏状态路径都考虑进去——每一种走法贡献一份概率全部加起来才是答案。状态一多、序列一长路径数量就是天文数字直接枚举必然崩。教材给出的解法是递推从左往右一步一步走每一步只保留「走到当前位置、且此刻处在某个状态」的累计概率下一步在这批数上继续推。这样计算量就从指数级降到跟序列长度成正比。这套递推在很多教材里有个专门的名字前向算法名字不必背思路值得记把「把所有路径加起来」改写成「一层一层往前推」。这类「用递推换掉枚举」的技巧在模式识别里反复出现认得它就够用了。4.2 解码最可能的隐藏状态序列是哪条第二个问题更贴近直觉观察值我有了参数我也有那最可能的隐藏状态序列是什么回到缸球实验就是你听了一串颜色想猜对方依次摸的是哪几口缸。语音识别里这一层对应的就是从声波反推音素序列。这里最容易踩的坑是贪心每一步都选当前概率最大的状态。听起来合理实际上经常翻车。因为某一步看起来最像的状态可能和下一步根本接不上——转移概率极低整条路径的概率被拖垮。局部最优不等于全局最优这是血泪级的常识。稳妥的做法是动态规划走到每一步时对每一个可能的当前状态记下「以它为结尾的最佳路径」及其累计概率走到下一步时只在这批「最佳前缀」上延伸而不是把所有历史路径重新翻一遍。这样每一步的计算量是状态数的平方量级整条最优路径最后再回溯出来。教材里管这个叫维特比算法同样名字不必记记住「保住每一步的最优前缀最后回溯」这个动作就行。4.3 学习参数从哪里来第三个问题是转移矩阵、观察概率、初始分布这些数字究竟从哪儿来答案分两种情形。一种是有标注数据每一段观察值都知道对应的隐藏状态序列。这时候统计就行——数一数从状态 i 转到状态 j 出现了多少次除以从 i 出发的总次数就是转移概率的估计再数一数状态 i 吐出观察值 k 的次数除以状态 i 出现的总次数就是观察概率的估计。直白得像数豆子。另一种是没有标注数据只有一串串观察值隐藏状态完全不知道。这才是常态也是难点。这时候只能靠迭代先随便给一组初始参数用它推断每条观察值背后「大概」是什么状态序列再用推断出来的序列重新统计参数然后再推断、再统计一轮一轮磨。这套做法的脾气很像玄学——对初值敏感容易停在局部最优迭代几十轮后数值不再明显变化就收手。有人抱怨「同一个模型跑两次结果不一样」多数时候就是初值不同导致的。还有一个绕不开的人为选择状态数 N 设几个。这个数不是从数据里自动学出来的得人来定。设少了模型表达不了真实结构设多了参数爆炸、过拟合训练集上漂亮、新数据上崩盘。实践中常见的做法是拿几个不同的 N 各跑一遍看哪个在验证数据上表现稳。5. 常见误区马尔可夫过程、马尔可夫链和 HMM 到底差在哪这几个词在教材里经常前后脚出现长得又像初学的时候混成一团很正常。下面四条是最容易拧巴的地方逐条拆开。5.1 误区一把马尔可夫过程和马尔可夫链混着叫易混点两个名字只差一个字定义里又都出现「马尔可夫」很多人读到后面就默认它们是同一件事。为什么混因为马尔可夫链确实是马尔可夫过程的一种逻辑上是包含关系。教材先讲过程、再讲链中间只隔了几行字很容易读串。怎么区分看时间和状态是不是都离散。马尔可夫过程是个宽泛的筐时间可以连续、状态也可以连续只要满足「将来只依赖现在」就算马尔可夫链是其中时间和状态双双离散的特例而且一旦离散就能写成转移概率矩阵能算。一个判断口诀能画成一张「行是今天、列是明天」的表就是链画不出来只是过程。5.2 误区二把观察值当成状态易混点在缸球实验里球色是观察值缸是状态。有人做着做着就开始用球色去代表缸把两者当成一回事。为什么混因为观察值太好用、太显眼了数据里就它看得见而状态是虚的脑子里没有实体抓手自然就抓了看得见的那个。怎么区分问一句「这个东西我是不是直接测到的」。直接测到的是观察值测不到、要靠推断的是状态。原文那条约束说得很清楚球的颜色和缸不是一一对应的。如果一一对应两者可以互换一旦不一一对应把它们混同就等于把模型的整个价值抹掉了。做语音识别时尤其容易犯这个错 waveform 是观察值音素是状态把波形当成音素去数后面全都错。5.3 误区三把转移概率和观察概率搞反易混点两个都是概率都写成矩阵都跟状态有关经常在写代码时把行列含义对调。为什么混因为它们描述的是同一批状态的两个不同侧面而且很多教材为了排版紧凑两个矩阵挨着放形状还都是二维的。怎么区分看这个概率「跨不跨状态」。转移概率描述的是状态到状态的跳转行是起始状态、列是目标状态观察概率描述的是某个状态吐出某个观察值的可能性行是状态、列是观察值。一句话记转移概率的列还是状态观察概率的列是你能看见的东西。写代码时把两个矩阵的行列注释清楚能省掉大量排查时间。5.4 误区四以为隐藏状态一定「有意义」易混点很多人以为 HMM 学出来的每个状态都能对应到一个具体、可命名的东西比如「这是元音 a」「这是元音 i」。为什么混教学例子里的缸、晴雨、音素都太干净了容易让人以为状态天生自带标签。怎么区分状态是模型内部造出来的中间变量它的含义是训练过程「分配」出来的不是世界直接给的。用无标注数据学出来的状态很可能只是一个统计上的聚类你能说清它对应的观察值分布长什么样却未必能给它起一个漂亮的名字。这不影响它有用——只要能提升预测效果这个状态就有存在价值。反过来如果强行给每个状态安一个解释往往是在自欺。6. 什么时候用 HMM什么时候别轻易使用判断能不能用其实就三个问题状态看不看得见、状态之间有没有转移规律、样本够不够。情形是否适合原因状态隐藏、只能观测到间接信号且信号有先后顺序适合正好对上双重随机过程的结构状态可以直接测到不适合直接建马尔可夫链就够多一层是浪费观察值之间强烈依赖很久以前的信息谨慎马尔可夫性假设会被打破长程依赖容易丢样本极少、状态数都定不下来不适合参数估不准迭代学习容易停在无意义的结果上只做一次性分类、数据没有顺序不适合没有序列结构HMM 的优势用不上举个具体的例子。假设要做一个手势识别的小系统摄像头拍到的是手部轮廓的一串帧想判断做的是「挥手」「画圈」还是「握拳」。状态可以设成几个手势阶段观察值是每帧提取出来的轮廓特征。这个场景符合条件阶段看不见、帧有先后、阶段之间有转移规律。但如果改成对一批静态照片分类每张照片彼此独立、没有时间顺序那用 HMM 就是拿锤子拧螺丝——换成普通的分类模型更省事。还有一种情况要格外小心序列很长而且真正起作用的信息隔得很远。比如一段几分钟的语音开头的信息影响结尾的判断。标准 HMM 的马尔可夫性在这一刻就成了短板硬套上去模型会「忘事」。这种时候要么缩短序列分段处理要么换用能记住更长历史的模型不要指望调参数能救回来。我第一次拿 HMM 做序列任务时栽在一个特别蠢的地方状态数凭感觉设了 3 个训练集上的指标好得离谱换一批数据直接崩了。后来才明白那不是模型学得好是它把训练样本背下来了。从那以后我每次拿到一串序列数据都强制自己先走一遍这三个问题状态看得见吗、状态之间会不会互相影响、样本够不够撑起这个状态数。三个都答完了再决定要不要上 HMM以及状态数到底定几个。这套笨办法救过我不少次也希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →