HMM的Baum-Welch算法和Viterbi算法公式推导细节

前言

上一篇博文中,我简单地介绍了隐马尔科夫模型HMM,并且重点介绍了HMM的三个问题中的第一个,即概率计算问题。首先回顾一下这三个问题都是什么以及解决每个问题的主流算法:

  1. 概率计算问题即模型评价问题——前向算法和后向算法
  2. 学习问题即参数估计问题——Baum-Welch算法
  3. 预测问题即解码问题——Viterbi算法

在上一篇概率计算问题的最后,我列出了几个用前向概率和后向概率表示的一些有意义的概率值和期望的计算,它们的直接意义就是用于表示学习问题和预测问题公式推导中复杂的中间结果的表示。所以,要想彻底搞懂Baum-Welch算法和Viterbi算法算法,就必须清楚地明白这些概率和期望到底是怎么计算出来的。

然而,本博文并不打算将这两个算法全部的公式推导写下来,那太繁杂了。如果想窥探这两个算法的细节,直接看李航博士的《统计学习方法》对应的内容就好了。本文只是将这两个算法推导中的一些隐晦的地方做一个通俗的解释,希望能给像我一样数学功底一般的朋友带来帮助。

Baum-Welch算法

Baum-Welch算法是为了解决HMM的参数估计问题而提出的,而且是没有标注也就是HMM的状态序列未知的参数估计问题。具体来说,就是已知观测序列 O=(o1,o2,...,oT) ,估计模型参数 λ=(A,B,π) ,使得在该模型下观测序列概率 P(O|λ) 最大。由于状态序列未知,因此这可以看做是一个含有隐变量的参数估计问题,解决这一问题的经典算法就是EM算法。Baum-Welch算法就是EM算法在隐马尔科夫模型学习中的具体体现。下面简单叙述一下该算法。

首先按照EM算法,我们需要先写出Q函数。Q函数是完全数据的对数似然函数关于给定模型参数和观测变量的前提下对隐变量的条件概率分布的期望。如下:

Q(λ,λ¯)=IlogP(O,I|λ)P(I|O,λ¯)

我们写出Q函数之后后面就要对它进行极大化,也就是说EM算法的M步骤。既然是最大化,那么只要保证不影响最终的结果,对Q函数进行对于最大化来说没有影响的常数因子乘除是可以的。我们注意到Q函数的后部分
P(I|O,λ¯)=P(O,I|λ¯)P(O|λ¯)

P(O|λ) 便是概率计算问题中我们解决的问题,对于固定的模型参数来说它是一个常量,因此我们为了后边计算方便可以在上面原先的Q函数的基础上乘以它,使得Q函数成为:
Q(λ,λ¯)=IlogP(O,I|λ)P(O,I|,λ¯)

为什么要这么做呢?这是为了后面将概率计算问题中有意义的一些概率计算公式直接套进去。

又因为完全数据可以写成这样:

logP(O,I|λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT1iTbiT(oT)

于是Q函数可以写成:
Q(λ,λ¯)=Ilogπi1P(O,I|,λ¯)++I(t=1T1log aitit+1)P(O,I|,λ¯)

+I(t=1Tlog bit(ot))P(O,I|,λ¯)

此时我们看到待估计的参数刚好分别出现在三个项中,所以只需对各个项分别极大化。然后直接极大化我们无法对公式进行细致描述,因此需要将以上Q函数形式修改一下,变成下面这样:
Q(λ,λ¯)=i=1NlogπiP(O,i1=i|,λ¯)+i=1Nj=1Nt=1T1log aijP(O,it=i,it+1=j|,λ¯)

+j=1Nt=1Tlog bj(ot)P(O,it=j|,λ¯)

可以看到,我们将三项中分别的对 I 的求和进行了划分。由于隐变量I=(i1,i2,...,iT)。原来的求和需要遍历所有 I 的取值,然后进行求和,然而这基本是不可能完成的任务。改写后,我们将遍历的空间进行了划分,同时很好地将P(O,I|,λ¯)部分改写后也融入到求和其中。比如第一项,对 I 的遍历等价于先固定状态i1,使其分别取值所有可能的状态(共有N个可取的离散状态),而 i2,...,iT 仍然像原来一样随便取值。这样,就把 I 空间划分成了N个更小的空间。然后再把这N个空间的结果相加,等价于原来对空间I进行遍历。

而且,改写之后, P(O,I|,λ¯) 部分变的可以表示了。如果对Q函数的三项分别求极大,在计算后会发现,最后的结果可以用前一篇博文末尾的一些有意义的概率来表示。这也就是之前对Q函数进行修改的原因。

OK,Baum-welch算法就介绍到这里。

Viterbi算法

Viterbi算法应用于HMM的识别问题,也称解码问题。它通过应用了动态规划的思想避免了复杂度很高的运算,为识别时效性提供了强有力的支持。这个算法并不难理解,这里只是对其一个细节进行阐述。

Viterbi算法实际上解决 P(I|O,λ) 最大化的问题,给定观测序列求其最可能对应的状态序列。算法首先需要导入两个变量 δ ψ δ 是在时刻t状态为i的所有单个路径 (i1,i2,...,it) 中概率的最大值:

δt(i)=maxi1,i2,...,it1P(it=i,it1,...,i1,ot,...,o1|λ)

由定义可得变量 δ 的递推公式:
δt+1(i)=maxi1,i2,...,itP(it+1=i,it,...,i1,ot+1,...,o1|λ)

=max1jN[δt(j)aji]bi(ot+1)

算法在设定初始值 δ1(i)=πibi(oi) 之后就不断迭代,终止情况是:
P=max1jNδT(i)

算法的主体就是这样,那么现在问题来了。识别问题我们要解决 P(I|O,λ) 最大的问题,到这里Viterbi算法怎么成了 P(I,O|λ)

个人觉得,还是应为 P(I,O|λ)=P(I|O,λ)P(O|λ) ,而 P(O|λ) 相对最大化问题而言是个常数,可以省去。但是为什么要省去呢?这是因为 δt+1(i) 的迭代过程中 δt(i) 要和 aji 相乘,而 aji 是转移概率,表示为:

aji=P(it+1=qi|it=qj)

再经过齐次马尔科夫假设,可以扩展为:
aji=P(it+1=qi|it=qj,o1,o2,...,ot)

这样其才能和 δt(j) 相乘。仅此而已。

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 使用HMM算法可以在Matlab中进行语音识别训练,并统计识别率结果。 首先,我们需要准备训练数据集和测试数据集。训练数据集应包含多个与识别目标相关的语音样本,而测试数据集则用于评估训练模型的识别能力。 接下来,我们可以使用Matlab的相关工具包(如Voicebox)来实现HMM算法HMM算法是一种统计模型,它将语音信号建模为具有潜在状态序列的隐马尔可夫链。每个状态都与声学特征相关联。在这里,我们使用HMM模型来表示不同的语音单位,如音素或单词。 在训练阶段,我们可以使用训练数据集来估计HMM模型的参数,包括状态转移概率、初始概率和状态发射概率。这些参数可以使用基于EM算法Baum-Welch算法进行估计。 训练完成后,我们可以使用测试数据集来评估模型的性能。对于每个测试样本,我们将其输入到已经训练好的HMM模型中,并利用Viterbi算法获得最可能的状态序列。然后,我们将该序列与实际标签进行比较,并计算准确率作为识别率结果。 最后,我们可以使用Matlab的统计工具来统计识别率结果。例如,可以计算平均识别率、标准差等指标,并生成相应的报告或图表。 总的来说,使用HMM算法在Matlab中进行语音识别训练并统计识别率结果,可以帮助我们评估模型的准确性和性能。通过改进训练数据质量、优化模型参数等方法,我们可以进一步提高语音识别的效果。 ### 回答2: HMM(隐马尔可夫模型)是一种常用于语音识别的概率模型。在Matlab中,我们可以使用HMM工具箱或自己编写代码来实现HMM算法进行语音识别的训练和识别率结果统计。 首先,我们需要准备训练数据和测试数据。训练数据由一系列已知的语音样本组成,而测试数据包含一系列待识别的语音样本。 接下来,我们可以使用HMM工具箱中的函数或自己编写代码来训练HMM模型。训练过程就是通过最大似然估计来估计HMM模型的参数,包括状态转移概率矩阵、观测概率矩阵和初始状态概率向量。这些参数反映了语音信号中不同状态之间的转移和观测概率。 一旦HMM模型训练完成,我们可以使用该模型对测试数据进行识别。具体来说,对于每个测试样本,我们可以使用前向算法计算观测序列在每个状态下的概率。然后,根据这些概率和状态转移概率矩阵,可以使用维特比算法找到概率最大的状态序列,即识别结果。 最后,我们可以统计识别结果的准确率。对于测试数据集中的每个样本,我们知道其真实标签,因此可以将识别结果与真实标签进行比较,并计算准确率,即正确识别的样本数量除以总样本数量。 总结起来,在Matlab中使用HMM算法进行语音识别训练和识别率结果统计的步骤包括准备数据、训练HMM模型、使用模型进行识别和计算准确率。这些步骤可以通过HMM工具箱或自行编写代码来实现。 ### 回答3: 在使用HMM(Hidden Markov Model,隐马尔可夫模型)算法进行语音识别训练时,可以通过在Matlab中进行统计来得到识别率结果。 首先,我们需要准备一些语音样本数据作为训练集和测试集。训练集将用于训练HMM模型的参数,测试集将用于测试训练后的模型的识别能力。 在Matlab中,可以使用HMM工具箱进行HMM模型的训练和识别。该工具箱提供了一些函数来进行HMM相关的操作。 首先,我们需要将语音数据进行特征提取。常用的特征提取方法包括MFCC(Mel Frequency Cepstral Coefficients,梅尔频率倒谱系数)和PLP(Perceptual Linear Prediction,感知线性预测)。这些特征提取方法可以将语音信号转换为一系列数值特征,以便HMM算法能够对其进行处理。 接下来,我们可以使用HMM工具箱中的函数来进行HMM模型的训练。训练过程中,需要设置HMM模型的状态数、观测符号集以及训练样本数据。训练完成后,会得到HMM模型的参数,包括状态转移矩阵、发射概率矩阵等。 然后,我们可以使用训练后的HMM模型来进行语音识别测试。测试过程中,我们将测试集的语音信号通过特征提取得到数值特征,然后使用HMM模型对其进行识别。根据HMM模型的识别结果与真实标签进行对比,计算识别率。 最后,我们可以将得到的识别率结果进行统计分析。比如可以计算平均识别率、最高识别率、最低识别率等。 综上所述,通过在Matlab中使用HMM算法进行语音识别训练,并对识别率结果进行统计分析,我们可以得到对模型性能的评估和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值