在这一节中,我们将会介绍我们的第一个序列标注算法,即隐马尔可夫模型(Hidden Markov Model),并展示如何将其应用于词性标注。简单回顾一下,一个序列标注器的任务是为序列中的每个单元分配一个标签,从而将一个观察序列(sequence of observations)映射到一个相同长度的标签序列。HMM 是一个经典模型,它引入了序列建模的许多关键概念,我们将在更多现代模型中再次看到这些概念。
HMM 是一个概率序列模型:给定一个单元序列(单词、字母、语素和句子等任何东西),它会计算所有可能的标签序列服从的概率分布,并选择最佳的那个标签序列。
HMM 是一种加强版的马尔可夫链。马尔可夫链(Markov chain)模型可以告诉我们关于随机变量或者随机状态(states)序列的概率,其中每一个值都可以从一些集合中取。这些集合可以是词、标签,或者代表任何东西的符号,例如天气。马尔可夫链做了一个非常强的假设,即如果我们想预测该序列未来的某个状态,那么唯一重要的是当前状态。在当前状态之前的所有状态都对未来没有影响,只有当前状态会影响未来状态。这就好像要预测明天的天气一样,你可以根据今天的天气来预测,但你不能根据昨天的天气。
更正式地说,考虑一个状态变量序列
图 8.8a 显示了一个马尔可夫链,用于为一个天气事件序列分配概率,其中的词汇表包括 HOT
、COLD
和 WARM
。图中的节点表示状态,而边表示状态转移及其概率。转移是一种概率:从一个状态出发的所有弧线的值的和必须为 1。图 8.8b 显示了一个用于给词序列
从形式上看,马尔可夫链是由以下部分组成的:
|
|
---|---|
转移概率矩阵(transition probability matrix)$A$,每一个 |
|
状态所服从的初始概率分布(initial probability distribution),$\pi_i$ 表示马尔可夫链从状态 |
在继续之前,请使用图 8.8a 中的样本概率($\pi = [0.1, 0.7, 0.2]$)来计算以下每个序列的概率:
(8.4)
hot hot hot hot
(8.5)
cold hot cold hot
这些概率的差异告诉了你一个被编码在图 8.8a 中的关于真实世界的天气事实,那么这个事实是什么?
8.4.2 隐马尔可夫模型(The Hidden Markov Model)
当我们需要计算一个观察事件序列的概率时,马尔可夫链是很有用的。然而,在许多情况下,我们感兴趣的事件是隐藏的(hidden):我们并不能直接观察它们。例如,我们不能直接观察到文本中的词性标签。相反,我们看到的是单词,并且必须从单词序列中推断出标签。我们称这些标签为隐藏的,因为它们没有被观察到。
隐马尔可夫模型(hidden Markov model)(HMM)同时支持可观察事件(如我们在输入中所看到的词)和我们认为在概率模型中具有因果关系的隐藏事件(如词性标签)。HMM 是由以下几个部分组成的:
|
|
---|---|
转移概率矩阵(transition probability matrix)$A$,每一个 |
|
由 |
|
观察值似然(likelihoods)序列,也称为发射概率(emission probabilities),每一个表示从状态 |
|
状态所服从的初始概率分布(initial probability distribution),$\pi_i$ 表示马尔可夫链从状态 |
一阶隐马尔可夫模型包含两个简化的假设。首先,与一阶马尔可夫链一样,一个特定状态的概率只取决于前一个状态:
其次,一个输出观察值
让我们先看看 HMM 标注器的组成部分,然后再看如何用它来进行标注。一个 HMM 有两个组成部分,即概率
矩阵
例如,在 WSJ 语料库中,MD 出现了 13124 次,其中后面跟着 VB 的情况出现了 10471 次,所以其 MLE 估计为
让我们先通过一个标注任务例子看看这些概率是如何被估计和使用的,然后我们再回到解码算法。
在 HMM 标注中,概率是通过统计标注训练语料库来估计的。在这个例子中,我们将使用标注好的 WSJ 语料库。
发射概率
在 WSJ 语料库中出现的 13124 次 MD 中,其对应词是 will 的有 4046次:
我们在第四章中见过这种贝叶斯模型;请记住,这个似然项不是在问“will 这个词最可能的标签是什么?” 那将是后验概率
图 8.9 表示有着 3 个状态(译者注:VB、MD、NN,即词性标签,观察值 $o_i$ 指的是词,如 will)的 HMM 标注器,解释了 HMM 的转移概率
对于任何包含隐变量的模型,如 HMM,确定与观察值序列相对应的隐变量序列的任务被称为解码(decoding)。更正式来说:
解码:给定一个 HMM
$\lambda = (A, B)$ 和一个观察值序列$O = o_1, o_2, \ldots, o_T$ 作为输入,找出最有可能的状态序列$Q = q_1 q_2 q_3 \ldots q_T$ 。
对于词性标注,HMM 解码的目标给定
$$\hat{t}{1:n} = \argmax{t_1 \ldots t_n} P(t_1 \ldots t_n | w_1 \ldots w_n) \tag{8.12}$$
我们在 HMM 中实际会使用贝叶斯法则来计算:
$$\hat{t}{1:n} = \argmax{t_1 \ldots t_n} \dfrac{P(w_1 \ldots w_n | t_1 \ldots t_n) P(t_1 \ldots t_n)}{P(w_1 \ldots w_n)} \tag{8.13}$$
此外,我们继续简化公式 8.13,直接去掉分母
$$\hat{t}{1:n} = \argmax{t_1 \ldots t_n} P(w_1 \ldots w_n | t_1 \ldots t_n) P(t_1 \ldots t_n) \tag{8.14}$$
HMM 标注器又做了两个简化假设。第一个假设是,一个词出现的概率只取决于它自己的标签,而与邻近的词和标签都无关:
第二个假设,即 bigram 二元假设,指一个标签的概率只取决于前一个标签,而不是整个标签序列:
将公式 8.15 和公式 8.16 代入公式 8.14 中,得到以下用于计算二元标注器下最有可能的标签序列的公式:
$$\hat{t}{1:n} = \argmax{t_1 \ldots t_n} P(t_1 \ldots t_n | w_1 \ldots w_n) \approx \argmax_{t_1 \ldots t_n} \prod_{i=1}^n \overbrace{P(w_i|t_i)}^{发射概率} \overbrace{P(t_i|t_{i-1})}^{转移概率} \tag{8.17}$$
公式 8.17 的两部分正好对应于我们刚才定义的发射概率
HMM 的解码算法是如图 8.10 所示的维特比(Viterbi)算法。作为动态规划的一个例子,Viterbi 算法类似于第二章的动态规划最小编辑距离算法。
Viterbi 算法首先建立一个概率矩阵或者叫网格(lattice),其中每列为每个观察值
网格中的每个单元格,$v_t(j)$,表示给定的 HMM
译者注:注意 HMM
$\lambda = (A, B)$ ,其中$A$ 为状态转移概率$P(q_i | q_{i-1})$ ,$B$ 为发射概率$P(o_t | q_i)$ 。在词性标注中,观察值$o$ 就是词,状态$q$ 就是词性标签。
我们通过在前面所有可能的状态序列中取最大值
在公式 8.19 中,三个相乘的因子分别是
前一个时刻的前一个 Viterbi 路径概率 | |
---|---|
前一个状态 |
|
给定当前状态 |
下面我们以标注句子 Janet will back the bill 为例,目标是得到正确的标签序列(另见图 8.11):
(8.20)
Janet/NNP will/MD back/VB the/DT bill/NN
假设我们的 HMM 由图 8.12 和 8.13 中的两个表来定义。图 8.12 列出了隐藏状态(词性标签)之间相互转换的概率
图 8.14 是图 8.11 的详细版本,即用于计算观察值序列“Janet will back the bill”的最佳隐藏状态序列的 Viterbi 网格。
有 <s>
项中得到),与给定该单元格标签时词 Janet 的观察值似然的乘积。这一列中的大部分单元格都是零,因为 Janet 这个词不可能是这些标签中的任何一个。读者应该可以在图 8.14 中看到这一点。
接下来,更新 will 列中的每个单元格。对于每个状态,我们根据公式 8.19 来计算
译者注:说白了,就是前一列所有单元格的值,分别乘以相应的标签转移概率,取最大值,再乘上相应的发射概率。为什么公式 8.19 是先乘发射概率再取最大值的?两种方法是一样的,因为发射概率是固定的,可以提出来。
特别注意:虽然上面提到
$N=5$ 即 5 个状态列(state columns),但是这个$N$ 和公式 8.19 中的$N$ 是不同的。在这个例子中,公式 8.19 中的$N$ 是 7,即有 7 个状态(词性标签)。所以该公式中,$i$ 和$j$ 都指的是状态(词性标签),而$t$ 指的是观察值(词)。