HMM与Viterbi算法

HMM作为一个生成式概率图模型,可以被用来处理序列标注的问题,如分词、词性标注,以及命名实体标注。

它把分词问题转为字的分类问题(序列标注问题)——由字构词,不依赖事先编制好的词表,但仍然需要分好词的训练语料 ,单字S,开始B-中间M-结尾E , 已知观察序列求对应的形式化序列

HMM描述的是一个从 隐状态序列(如实体标记,所属集合是N种标签) 生成 可观测结果(如可读文本,所属集合是M个汉字) 的过程

第一假设是第 t 个时刻的隐状态只跟前一时刻 t - 1 时刻的隐状态有关,计算一个转移概率 —— N * N 的转移概率矩阵

第二个假设是观测独立,任意时刻观测 $o_t$ 只依赖 当前时刻的 隐状态 $i_t$, 计算一个发射概率—— N * M 的发射概率矩阵

那么如何用HMM来解决序列标注问题呢?

首先是通过监督学习的方式获取参数,即首先有一些文本和标注对应的现有数据,然后训练一个HMM来拟合这些数据。最简单的方式是直接用极大似然估计来估计参数

假设我们已经通过建模学习到了初始概率、转移概率和发射概率这三大参数,就可以通过文本倒推出标记

很显然,从HMM的假设和计算过程可以看出,求得的只是当前时刻的最优标注,不一定能得出全局最优序列路径 —— 解决: 维特比算法


维特比算法使用了动态规划算法来解决类似HMM和CRF的预测问题,找到概率最大路径,即文本处理中最优的实体标注序列。

它的简单原理可理解为:在每一个时刻,计算当前时刻落在每种隐状态的最大概率,并记录这个最大概率是从前一时刻哪一个隐状态转移过来的,最后再从结尾达到最大概率的那个隐状态回溯,就可以得到最有可能的最优路径。

有两个 N * M 的矩阵,第一个行 i 表示隐状态,列 j 表示时刻,矩阵单元表示第 j 时刻落到隐状态 i 的最大可能概率;第二个矩阵记录的是这个最大可能概率是从第 i - 1 时刻的哪一个隐状态 i 转移过来的, 即 最大可能概率的转移路径

关键在于计算最大可能概率。需要用到第一个矩阵,与HMM中的另外三个矩阵进行运算获得。

最优路径:假设有一条最优路径在 t 时刻通过一个隐状态 $i_t$ , 那么从 $i_t$ 到最优路径终点 $i_T$ 相对于 这段距离里所有可能出现的路径,也必须是最优的。

因此:从最后一步达到的最大概率的隐状态,根据第二个矩阵记录的转移状态向前回溯至第一时刻,就可以找到最优路径了。由此可以看出,第一个矩阵只用到了最后一列,在实际中可以用不断覆盖的方式的减少存储占用。

很显然,相对于HMM,Viterbi算法增加了一个时刻的概念,我的理解是这样其实是在求平均值…所以算法的复杂度为 $O(TN^2)$

在实际的预测中,为了防止计算结果的下溢,将乘法变为取对数之后的加法

学习来源及git源码