HMM 和 CRF 的概念理解不那么简单,文章简单梳理下两者的区别和原理。
1. HMM
隐马尔科夫模型的训练参数有:初始状态概率矩阵、转移概率矩阵、发射概率矩阵。如果我们进行的是有监督学习,那么就需要从训练集中通过统计得到上述几个矩阵。假设:我们的训练集有三种状态:A、B、C, 观测值有:\(w_1\)、\(w_2\)、\(w_3\)、\(w_4\)。
初始状态概率是统计在训练集中,每个状态出现初始位置的概率。
比如:通过统计得到训练样本中 A 状态出现在首位有 3 次,B 状态出现在首位有 4 次,C 状态出现在首位有 5 次,则这三个状态组成的初始状态概率矩阵为:
A:3/(3+4+5)
B:4/(3+4+5)
C:5/(3+4+5)
如下图所示:
转移概率矩阵统计训练样本中 \(y_i\) 到 \(y_j\) 出现的次数除以所有次数得到每一个状态到其他任意状态的转移概率,如下公式:
例如:A 状态后面跟着 A 状态的情况出现了 5 次,A 状态后面跟着 B 状态的情况出现了 6 次,A 状态后面跟着 C 状态的情况出现了 7 次。则 :
- A->A 的转移概率:5/(5+6+7)
- A->B 的转移概率:6/(5+6+7)
- A->C 的转移概率:7/(5+6+7)
再得到 B->A、B->B、B->C、C->A、C->B、C->C 的转移概率,就可以获得 HMM 的转移概率矩阵。如下图所示(数字无意义):
接着我们再从训练数据中统计出发射概率矩阵。该矩阵用于记录某一个状态产生某一个观测值的概率是多少。公式表示如下:
例如:无论任何状态共可能出现 4 种观测值。状态 A 对应的字 \(w_1\) 出现了 10 次,状态 A 对应的字 \(w_2\) 出现了 20 次、状态 A 对应的字 \(w_3\) 出现了 15次、状态 A 对应的字 \(w_4\) 出现了 5 次,则:
- A->w1 的发射概率:10/(10+20+15+5)
- A->w2 的发射概率: 20/(10+20+15+5)
- A->w3 的发射概率: 15/(10+20+15+5)
- A->w4 的发射概率: 5/(10+20+15+5)
接着再把 B 状态下、C 状态下出现 w1、w2、w3、w4 的概率统计出来,就得到了发射概率矩阵。如下图所示:
此时,在有监督学习情况下,我们的参数就根据训练样本学习得到了。假设:我们得到了观测序列(如下图所示),我们的目标是得到使得观测序列出现概率最大的状态序列。
我们每个观测值对应的状态值有 3 种,所以产生该观测序列的可能的状态序列有 \(3^8\) 种,我们需要将每种可能的序列的概率值计算出来,选出最大的作为模型最终的输出序列。
如何计算每个序列的概率值呢?HMM 有两个假设:
- 齐次马尔科夫假设,即:状态值只和前一个状态有关;
- 观测独立性假设,即:观测值只和当前状态有关。
也就是说,其在计算概率时,会受到这两个假设的影响,考虑的是局部的因素。假设:我们得到的状态序列如下:
则该状态序列产生观测值序列的概率计算如下:
x = (\(w_2\)、\(w_4\)、\(w_3\)、\(w_2\)、\(w_1\)、\(w_2\)、\(w_3\)、\(w_4\))
y = (A、B、B、A、C、B、A、C)
HMM 就需要计算 p(x, y),即:x 和 y 的联合概率。为啥是联合概率,这和 HMM 的两个假设有关。每个状态的预测仅仅依赖前一个状态和当前观测值。此时,我们就不太容易对条件概率建模。换个思路,如果状态序列的预测依赖于整个观测序列,此时就能够表示条件概率 p(y|x) 。HMM 这里只能在两个假设的约束下,计算观测序列和状态序列共同出现的概率。这也是我们经常说,HMM 是对联合概率建模。
显然,按照上面公式这样计算,随着状态值得增多,序列的变长,计算量也会呈现指数级增加。HMM 的解码问题可以使用维特比算法来解决,效率比穷举高不少。
我们了解了 HMM 用于序列标注问题的基本过程,接下来我们分析下这个过程,看能够总结出一点结论:
- HMM 是概率模型,对联合概率建模,属于生成式模型。生成模型需要了解样本的分布。朴素贝叶斯模型也属于生成式模型,它也需要在了解样本分布之后才能做出预测。生成模型需要枚举出所有可能的状态序列结果。
- HMM 状态的预测(标签的预测)只和当前的观测值,以及上一个状态有关。换言之,就是由这两者来确定当前的状态(标签)。但是,我们知道状态不仅仅和当前的观测值相关,也和观测值的上下文可能都存在关系,例如:一个词的上下文不同,其词性可能在动词和名词之间变换。
- 再者,齐次马尔科夫假设使得 HMM 具有有向的依赖,HMM 可能效果也会大打折扣。也就是说,HMM 的一系列假设条件限制了其发挥的空间。优点就是模型变得简单,计算效率较高。
2. CRF
我们这里说的 CRF 特指的是线性链条件随机场(Linear Chain CRF),这是 CRF 的一种特殊的形式。线性链条件随机场的定义如下:
- 观测值 X = (\(x_1\)、\(x_2\) … \(x_n\))
- 状态值 Y = (\(y_1\)、\(y_2\) … \(y_n\))
- 在给定随机变量 X 的条件下,计算随机变量 Y 的条件概率,我们把 P(Y|X) 叫做条件随机场。
线性链条件随机场如下图所示:
从这个图里,我们可以看到 CRF 和 HMM 的不同之处:
- HMM 在状态序列那里是有箭头的,这是由于其存在齐次马尔科夫假设。而在 CRF 这里是不存在箭头的,这也说明了 CRF 并不存在齐次马尔科夫假设。从这里,我们也知道为啥 HMM 叫做概率有向图模型,而 CRF 则是概率无向图模型。
- HMM 做了观测独立性假设,每一个状态只会受到当前位置的观测值影响。CRF 则抛弃该假设,即:每个状态得出都和整个观测序列 X 有关,而不是某一个观测值。
- CRF 是在计算 P(Y|X) ,这里的 X 是一个整体条件,即:在整个观测序列的条件下,计算 Y。回顾下 HMM,我们就会发现 HMM 都是在计算某个观测值 x 条件下的 y。形象一点说,HMM 更像是通过局部信息来得到 y, 而 CRF 则是通过整体来得到 y 。由于 CRF 是对条件概率建模,所以我们把这种模型也称作判别模型。
接下来,我们考虑下计算问题。假设:x 是所有观测序列中的一种,y 是所有状态序列中的一种。如何计算 p(y|x),如下公式:
- \(s_l\) 叫做状态特征函数,也有叫做发射特征函数,由模型(BiLSTM、Bert)计算得出。
- \(t_k\) 叫做转移特征函数,相当于对发射特征函数的结果进行约束,如果某些预测满足某些条件,例如:动词后面接动词,则该条件不满,则不会对应的预测状态加分。
- 通过两部分函数,得到观测序列的总分数。接下来通过归一化计算得到 x 属于 y 的概率有多少。
【再补充、修正】