隐马尔可夫模型(Hidden Markov Model,HMM) 是传统的机器学习模型,在自然语言处理和模式识别中,运用广泛。虽然有RNN和LSTM的提出,作为机器学习的传统模型,还是有必要深入了解。
HMM模型中,包含两种序列,分别为状态序列和观测序列。其中状态序列我们不可见,而观测序列可见,并且观测序列以概率的形式,由状态序列生成。比如语音识别中,我们听到的声音,和其背后的文字的关系。计算机能听到语音,但是它看不到语音所表达的文字,所以需要用机器学习模型让其自行“脑补”。还有词义标注等等,应用很多。
直观的理解上就是,HMM实际上包含三个参数,,分别表示(转移概率矩阵),(观测状态生成的概率矩阵)以及(初始状态矩阵)。假设我们已经得到了这个参数,那我们就可以用这个模型随机地生成一段序列。当然这个不是最主要的,最主要的是要解决三个基本问题:
1.评估观察序列概率,即我们假设有了模型,当得到一条新的观测序列,那么这条观测序列出现的概率是多少?
2.模型参数学习问题,即我们得到了一些可以学习的观测序列,那么如何去估计模型的参数?
3.预测问题,也称为解码问题或者推断问题,即当我们假设有了模型,如何通过得到的观测序列,去推断其状态序列?
引用这一篇的模型定义(https://www.cnblogs.com/pinard/p/6945257.html):
假设是所有可能的隐藏状态的集合,是所有可能的观测状态的集合,即:
, (1)
其中是可能的隐藏状态数,是可能的观测状态数。
对于一个长度为的序列,是对应的状态序列,是对应的观察序列,即:
, (2)
其中,任意一个隐藏状态,任意一个观察状态
HMM模型做了两个很重要的假设如下:
1.齐次马尔科夫链假设。即任意时刻的隐藏状态只依赖于它前一个隐藏状态。
如果在时刻的隐藏状态是,在时刻的隐藏状态是, 则从时刻到时刻的HMM状态转移概率可以表示为:
(3)
这样转移概率就组成了上述的马尔科夫链的状态转移矩阵:
(4)
2. 观测独立性假设。即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态。如果在时刻的隐藏状态是 而对应的观察状态为, 则该时刻观察状态在隐藏状态下生成的概率为,满足:
(5)
3.初始状态概率。即在初始状态,的隐藏状态的概率分布:
,且 (6)
由此,组成了上述的HMM模型的参数,,其中为状态转移概率矩阵,为观测状态概率矩阵,为初始状态概率矩阵。
假设我们已知HMM的模型参数,,那么如何求解对应观测序列的概率呢?即求解的概率。
那么我们首先可能想到的办法就是,我们可以利用状态序列和观测序列的联合概率,进行求解,即把边缘概率转换成联合概率的求和。
其中:
(齐次马尔科夫链假设)
(8)
对应的,给定某个确定的状态序列(假设这个序列的各个状态都是知道的用来表示,后续的序列表示,都会进行省略,即认为是有值的,是属于某个状态状态的,是有值的,是属于某个观测的)那么,对应的观察序列的出现概率是:
(各个观测值直接条件独立)
( 观测独立性假设)
(9)
回到(7)式,就可以看到,这样是对所有的状态序列进行遍历,来求解对应观测序列的概率,这样的一个问题在于,每个状态都包含N种可供选择的状态数,所以所有的状态就有种组合,而且每次计算都要计算所以复杂度为,那这种指数级增长的复杂度肯定是不可取的。所以引出下面的前向后向算法。
还是上面的问题,我们要求解的概率,可以转换成如下形式:
注***写法上进行了省略,等同于,为了书写简便, 这个变量表示包含某个状态,即,观测同理,没有把每个变量的状态值写出来,下同。
(第2项是齐次马尔科夫链假设,第3项是观测独立性) (11)
其中表示,从第1个到第个所有的观测序列,那中间的时刻也是同理,我们把(11) 改成,以此类推,我们就能得到
能够发现就是对应的状态转移概率,表示为状态到观测的生成概率。所以这就可以利用动态规划去求解。在这里定义表示为,即表示为在时刻,对应的状态为的前向概率(有特定的状态,没有写出来,实际上),在所以就又如下计算公式:
这样,我们就能利用动态规划去一步一步地生成每一步的概率,我们可以利用公式(13)从从后向前生成。
(14)
从递推公式可以看出,前向算法的复杂度为
至此,前向算法就讲解完毕了。
还是上面的问题,我们要求解的概率,可以转换成如下形式:
通过上述推导,我们可以知道,如果利用第一个状态的和序列的联合概率,也能求出对应的序列的概率,那么后续怎么继续计算呢?我们继续把公式(16)的拿出来,进行一般化:
(D-Separation) (第2项是齐次马尔科夫链假设,第3项是观测独立性) (17)
那么通过这个推导,我们就能看到 和之间的递推关系,正好是状态转移矩阵,正好是状态到观测的转移矩阵。在这里令表示为,即表示为,在时刻,状态为的后向概率,(有特定的状态,没有写出来,实际上)。所以有如下递推公式:
同样的,我们从后往前推,所以要知道由于时刻的时候,整个序列都已经确定了,所以的概率设为1。
这样就能从陆续推导,对应的复杂度也为。
至此,后向算法也讲解完毕。
观测序列的概率可以用前向后向算法进行估计,但是前向后向算法的最终目的是什么?
在后续,需要参数学习的时候,我们需要求解的概率,即需要求解在给定序列的情况下,在时刻,对应的状态的概率(有特定的状态,没有写出来,实际上,为了方便书写)
表示正比于,也就是和有着正比关系,所以我们可以通过计算后者,来间接计算前者,然后继续将其拆分:
(20)
可以看到,上面已经出现了前向后向算法的雏形:
1.中还多了一个的条件,通过D-Seperation(分隔定理)或者齐次马尔科夫链假设,可以发现实际上条件和之间是相互独立的。
2.就是前面讨论的前向算法,所以可以再次简化成下式:
(21)
能看到就是后向概率和前向概率的乘积
通过这样的方式,就可以回头计算的概率了,假设我们要求即,给定序列和参数的条件下,第t个时刻,状态值为的概率为:
至此,通过这种方式,就能算法每个时刻,不同状态值的概率。
通过上述讲解,我们了解到
1.前向算法求解观测概率的推导
2.后向算法求解观测概率的推导
3.前向后向算法对定序列和参数的条件下第t个时刻,不同状态值的求解。
从上面可以看出,并不是上来就.前向算法和.后向算法 推推推的,是他们的出现也是为第3点服务的。
至此,前向后向算法就见解完毕了。欢迎交流,互相学习!