原文地址
http://www.52nlp.cn/hmm-learn-best-practices-one-introduction
一、介绍
我们通常都习惯寻找一个事物在一段时间里的变化模式(规律),比如计算机中的指令序列,句子中的词语顺序和口语单词中的音素序列等待。事实上任何领域中的一系列时间都有可能产生有用的模式。
一个简单的例子,有人试图通过一片海藻推断天气,民间传说“湿透的”海藻意味着潮湿阴雨,而“干燥的”海藻意味着阳光灿烂。通过综合昨天的天气及相应观察到的海藻状况,我们有可能更好的预测今天的天气。
首先,将介绍产生概率模式的系统,如晴天及雨天间的天气波动。
然后是这样的系统,预测的状态并不是观察到的-其底层系统是隐藏的,观察的序列将是海藻而隐藏的系统将是实际的天气。
最后利用已经建立的模型解决一些实际的问题。
二、生成模式
1、确定性模式
像交通信号灯,灯的颜色依次是红色-黄色-绿色,每一个状态都唯一的依赖于前一个状态,该系统是确定的,状态转移是完全已知的。
2、非确定性模式
对于天气状况,晴天,雨天和多云,这三个状态之间的变化是不确定的,但我们依然希望对这个系统建模以便生成一个天气变化模式。
一种做法是假设模型的当前状态仅仅依赖于前面的几个状态,这被称为马尔科夫假设,它极大地简化了问题,但这是粗糙的假设,可能丢失了些非常重要的信息。
一个马尔科夫过程是状态间的转移仅依赖于前n个状态的过程。这个过程被称之为n阶马尔科夫模型,其中n是影响下一个状态选择的(前)n个状态。最简单的马尔科夫过程是一阶模型,仅与前一个状态有关,注意下一个状态的选择由相应的概率决定,并不是确定性的。
对于有M个状态的一阶马尔科夫模型,共有M^2个状态转移,因为任何一个状态都有可能是所有状态的下一个转移状态。每一个状态转移都有一个概率值,称为状态转移概率。可以用一个状态转移矩阵表示,这些概率并不随时间变化而不同,这是一个非常重要但尝尝不符合实际的假设。
一个一阶马尔科夫过程如下:
状态:三个状态 pi向量:初始化概率 状态转移矩阵
任何一个可以用这种方式描述的系统都是一个马尔可夫过程。
三、隐藏模式
1、马尔科夫过程的局限性
一个山间的隐士,也许不能直接获取天气的观测情况,但是他有一些水藻。而水藻的状态和天气的状态有一定的概率关系,天气和水藻的状态是紧密相关的。所以我们有两种状态,观察的状态(水藻的状态)和隐藏的状态(天气的状态)。希望设计一种算法,在不能够直接观察天气的情况下,通过水藻和马尔科夫假设来预测天气。
一个更实际的问题是语音识别,声音受声带、喉咙大小、舌头位置等很多东西的影响,一套语音识别系统检测的声音就是来自于跟人发音时身体内部物理变化所引起的不断改变的声音。
语音识别装置工作的原理是将内部的语音产出看作是隐藏的状态,而将声音结果作为一系列观察的状态。这两个例子中,隐藏状态的数目与观察状态的数目可以是不同的,天气有三个状态,海藻的湿润等级可以有四个。
观察到的状态序列与隐藏过程有一定的概率关系,使用隐马尔科夫模型对这样的过程建模。这个模型包含了一个底层隐藏的随时间改变的马尔科夫过程,以及一个与隐藏状态某种程度相关的可观察到的状态集合。
2、隐马尔可夫模型(HMM)
天气例子的隐藏状态和观察状态,假设隐藏状态(实际的天气)由一个简单的一阶马尔科夫过程描述。
使用一个隐马尔科夫模型(HMM)对这些例子建模。这个模型包含两组状态集合和三组概率集合:
隐藏状态:一个系统的(真实)状态,可以由一个马尔科夫过程进行描述
观察状态:可视的状态,如海藻的湿度
pi向量:包含了模型在t=1时一个特殊的隐藏状态的概率
状态转移矩阵:包含了一个隐藏状态到另一个隐藏状态的概率
混淆矩阵:包含了给定隐马尔科夫模型的某一个特殊的隐藏状态,观察到某个观察状态的概率。
因此,一个隐马尔科夫模型是在一个标准的马尔科夫过程中引入一组观察转台,以及其与隐藏状态间的一些概率关系。
四、隐马尔科夫模型
1、定义
一个隐马尔科夫模型是一个三元组(pi,A,B)
这里状态转移矩阵和混淆矩阵的每一个概率都是时间无关的,实际上这是马尔科夫模型不现实的一个假设。
2、应用
一旦一个系统可以作为HMM描述,就可以解决三个基本问题。
一是给定HMM求观察序列的概率(评估),二是搜索最有可能生成一个观察序列的隐藏状态序列(解码),三是给定观察序列生成一个HMM
a)评估
比如有一些描述不同系统的隐马尔科夫模型及一个观察序列。想知道哪一个HMM最有可能产生了这个给定的观察序列。例如,对于海藻来说,有“夏季”和“冬季”两个模型,根据海藻的湿度来确定当前的季节。
使用前向算法来计算给定隐马尔科夫模型后的一个观察序列的概率,和真实的对比,选择最合适的模型。
语音识别中,当一大堆数目的马尔科夫模型被使用,并且每一个模型都对一个特殊的单词进行建模时。一个观察序列从一个发音单词中形成,并且通过寻找对于此观察序列最有可能的隐马尔科夫模型识别这个单词。
b)解码
给定观察序列搜索最可能的隐藏状态序列。
只能感觉到海藻的状态,但是更想知道天气的情况。
使用Viterbi算法确定已知观察序列及HMM下最可能的隐藏状态序列。
Viterbi算法的另一广泛应用是自然语言处理的词性标注。在词性标注中,句子中的单词是观察状态,词性(语法类别)是隐藏状态。在给定的上下文中找到每个单词最可能的词性标注。
c)学习
根据观察序列生成隐马尔可夫模型。
根据一个观察序列,以及与其相关的一个隐藏状态集,估计一个最合适的HMM,也就是确定对已知序列描述最合适的(pi,A,B)三元组。
当矩阵A和B不能够直接被(估计)测量时,前向-后向算法被用来进行学习(参数估计)。
由一个向量和两个矩阵(pi,A,B)描述的隐马尔可夫模型对于实际系统有着巨大的价值。
五、前向算法
1、穷举搜索
给定隐马尔可夫模型,在模型参数(pi,A,B)已知的情况下,找到观察序列的概率。
如知道天气和海藻数度状态的隐马尔可夫模型,还有还早的湿度状态观察序列,假设连续三天海藻湿度是干燥、湿润、湿透,,而这三天每一天都可能是晴天、多云或下雨。
网格中的每一列都显示了可能的天气状态,并且每一列的每个状态都与相邻列中的每一个状态相连。而其状态间的转移都已状态转移矩阵提供一个概率。在每一列下面都是某个时间点上的观察状态,给定任一个隐藏状态所得到观察状态的概率是由混淆矩阵提供。
可以看出,一种计算观察序列的方法是找到每一个可能的隐藏状态,并且将这些隐藏状态的观察序列相加。
这就得到了三天连续为干燥、湿润、湿透的概率
2、使用递归降低问题复杂度
局部概率是到达网络中的某个中间状态时的概率。如t=2时位于“多云状态”的局部概率可通过如下路径计算得出。
最后的观察状态,其局部概率包含了通过所有可能的路径到达这些 状态的概率,对这些最终局部概率求和等价于对于网络中所有可能的路径概率求和(即穷举),也就球出了给定观察序列概率。
我们的目标是计算给定隐马尔可夫模型HMM下的观察序列的概率
首先通过计算局部概率降低计算整个概率的复杂度,局部概率表示的是t时刻到达某个状态s的概率。t=1是时,利用初始概率和观察概率计算局部概率;而t>1时的局部概率可以利用t-时的局部概率。
因此这个问题是递归的,用这种方式时间复杂度要小得多。
使用前向算法来计算给定隐马尔可夫模型(HMM)后的一个观察序列的概率。这种算法可以直接用来确定对于已知的一个观察序列,在一些隐马尔可夫模型中哪一个HMM最好的描述了它–先用前向算法评估每一个HMM,在选取其中概率最高的一个。
六、维特比算法
寻找最可能的隐藏状态序列
对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,我们常常希望能找到生成此序列最可能的隐藏状态序列。
1.穷举搜索
还是用下面这张图说明隐藏状态和观察状态之间的关系。
可以列出所有可能的隐藏状态序列并且计算对于每个组合相应的观察序列的概率来找到最可能的隐藏状态序列。最可能的隐藏状态序列是使下面这个概率最大的组合:
Pr(观察序列|隐藏状态的组合)
穷举计算找到最可能的序列是极为昂贵的,与前向算法类似,可以利用这些概率的时间不变性来降低计算复杂度。
2.使用递归降低复杂度
给定一个观察序列和一个隐马尔可夫模型(HMM),考虑用递归寻找最有可能的隐藏状态序列。
首先定义局部概率,它表示的是时刻t时到达某个状态最可能的路径的概率,而不是所有路径概率的总和。
然后在t=1和t=n(>1)时计算这些局部概率。
在t=T时每一个状态都有一个局部概率和一个局部最佳路径。这样就可以确定全局最佳路径。
先计算t=1时刻的局部概率,然后计算t>1时刻的局部概率,考虑计算t时刻到达状态x的最可能的路径,将通过t-1时刻A,B,C中的某一个。
选择各个路径选择最大的概率。
维特比算法提供了一种有效的计算方法来分析隐马尔科夫模型的观察序列,并捕获最可能的隐藏状态序列。他利用递归减少计算量,并利用整个序列的上下文来做判断,从而对包含噪声的序列也能进行良好的分析。
关于维特比算法,需要着重强调的一点是,它不是简单的对于某个给定的时间点选择最可能的隐藏状态,而是基于全局序列做决策。因此,如果在观察序列中有一个“非寻常”的时间发生,对于维特比算法的结果影响不大。
这在语音处理中特别有价值,譬如当某个单词发音的一个中间音素出现失真或丢失的情况时,该单词也可以被识别出来。
七、前向-后向算法
根据观察序列生成隐马尔可夫模型
与HMM模型相关的“有用”的问题是评估(前向算法),用来测量一个模型的相对适用性,和解码(维特比算法),用来推测模型隐藏的部分在做什么(“到底发什么了什么”)。可以看出他们都依赖于隐马尔可夫模型(HMM)参数这一先验知识——状态转移矩阵,混淆(观察矩阵),以及pi向量(初始化概率)。
然而许多情况下,这些参数都不能直接计算,而要需要进行估计,这就是隐马尔可夫模型中的学习问题。前向-后向算法就可以以一个观察序列为基础来进行这样的估计,而这个观察序列来自于一个给定的集合,它所代表的是一个隐马尔可夫模型中的一个已知的隐藏集合。
一个例子可能是一个庞大的语音处理数据库,其底层的语音可能由一个马尔科夫过程基于已知的音素建模的,而其可以观察的部分可能由可识别的状态(可能通过一些矢量数据表示)建模的,但是没有(直接)的方式来获取隐马尔科夫模型(HMM)参数。
前向-后向算法首先对于隐马尔可夫模型的参数进行一个初始的估计,然后通过对于给定的数据评估这些参数的价值并减少它们所引起的错误来重新修订这些HMM参数。它是以一种梯度下降的形式来寻找一种错误测度的最小值。
之所以称其为前向-后向算法,主要是因为对于网络中的每一个状态,它既计算到达此状态的“前向概率”(给定当前模型的近似估计),又计算生成此模型最终状态的后向概率。
要理解前向-后向算法,首先要理解两个算法,后向算法和EM算法。
1、后向算法
如果理解了前向算法,后向算法也是比较好理解的。
后向变量(局部概率)表示的是已知隐马尔可夫模型λ和t时刻位于隐藏状态Si这一事实,从t+1时刻到终止时刻的局部观察序列的概率。与前向算法类似,我们可以从后向前(故称之为后向算法)递归地计算后向变量。
1)初始时,令t=T时刻所有状态的后向变量为1
2)归纳,递归计算每个时间点,t=T-1,T-1。。。时的后向变量。
EM算法是1977年提出的求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行MLE估计,是一种非常简单实用的学习算法。这种方法可以应用于处理缺损数据,截尾数据,带有讨厌数据等所谓的不完全数据。
直观地理解EM算法,它也可被看作为一个逐次逼近算法:事先并不知道模型的参数,可以随机的选择一套参数或者事先粗略地给定某个初始参数λ0,确定出对应于这组参数最可能的状态,计算每个训练样本的可能结果的概率,在当前的状态下再由样本对参数修正重新估计参数λ,并在新的参数下重新确定模型的状态,这样,通过多次的迭代,循环直至某条件。