「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战 」
[本文为《 Speech and Language Processing 》8.4翻译 同时加入了一些些译者自己的思考]
一、马尔可夫链
马尔可夫假设(Markov assumption):当预测未来时,过去并不重要,只有现在才重要。
P ( q i = a ∣ q 1 . . . q i − 1 ) = P ( q i = a ∣ q i − 1 ) ( 8.3 ) P(q_i = a|q_1...q_{i-1}) = P(q_i = a|q_{i−1})\qquad(8.3) P ( q i = a ∣ q 1 ... q i − 1 ) = P ( q i = a ∣ q i − 1 ) ( 8.3 )
一个马尔可夫链主要由以下几部分组成:
公式 备注 Q = q 1 q 2 . . . q N q_1q_2 ...q_N q 1 q 2 ... q N N个状态的集合 A = a 11 a 12 . . . a N 1 . . . a N N a_{11}a_{12} ...a_{N1} ...a_{NN} a 11 a 12 ... a N 1 ... a NN A表示转移概率矩阵,a i j a_{ij} a ij 代表从状态i到状态j的可能性 π = π 1 , π 2 , . . . , π N π = π_1,π_2,...,π_N π = π 1 , π 2 , ... , π N 状态所服从的初始概率分布,π i π_i π i 表示马尔可夫链在状态i开始的概率。如果有些状态j的π j = 0 π_j=0 π j = 0 ,则说明这些状态不可能作为马尔可夫链的初始状态o, ∑ i = 1 n π i = 1 \sum_{i=1}^{n}π_i=1 ∑ i = 1 n π i = 1
举例:天气事件序列
state =[hot、cold、warm]
π = [0.1, 0.7, 0.2] //表示马尔可夫链初始状态是状态1(hot)的可能性为0.1
转移矩阵A:
| state (i \ j)|hot |cold|warm|
| --- | --- ||--- | --- |
| hot | 0.6 || 0.1| 0.3 |
| cold| 0.1 ||0.8 | 0.1 |
| warm | 0.3 ||0.1 | 0.6 |
Q:请使用如上的概率来计算以下每个序列的概率
hot hot hot hot
cold hot cold hot
二、隐马尔可夫模型(The Hidden Markov Model )
我们可以很方便的用马尔可夫链来计算一个观察事件序列的概率,但是在有些情况下,我们所感兴趣的事情是隐藏的,我们不能直接观察出来,比如在文本中,我们能够直接观察到单词,但是我们无法直接得知单词的词性标签,必须从单词的序列中推断出单词的标签,我们称这些标签为隐藏的,因为他们无法被直接观察到,
隐马尔可夫模型同时支持可观察事件(如我们在输入中看到的词)
和我们认为在概率模型中具有因果关系的隐藏事件(如词性标签)
2.1 HMM组成部分
HMM由以下几个部分组成:
公式 备注 Q = q 1 q 2 . . . q N q_1q_2 ...q_N q 1 q 2 ... q N N个状态的集合 A = a 11 a 12 . . . a N 1 . . . a N N a_{11}a_{12} ...a_{N1} ...a_{NN} a 11 a 12 ... a N 1 ... a NN A(transition probability matrix)表示转移概率矩阵,a i j a_{ij} a ij 代表从状态i到状态j的可能性,使得对任意i来说, ∑ j = 1 n a i j = 1 \sum_{j=1}^{n}a_{ij}=1 ∑ j = 1 n a ij = 1 O = o 1 o 2 . . . o T O = o_1o_2 ...o_T O = o 1 o 2 ... o T 由T个观察值组成的序列,每个观察值都来源于一个脑信号数字 B = b i ( o t ) B = b_i(o_t) B = b i ( o t ) 观察值似然序列,也称为发射概率(emission probabilities),代表了从状态 q i q_i q i 能产生观察值 o t o_t o t 的概率 π = π 1 , π 2 , . . . , π N π = π_1,π_2,...,π_N π = π 1 , π 2 , ... , π N 状态所服从的初始概率分布,π i π_i π i 表示马尔可夫链在状态i开始的概率。如果有些状态j的π j = 0 π_j=0 π j = 0 ,则说明这些状态不可能作为马尔可夫链的初始状态o, ∑ i = 1 n π i = 1 \sum_{i=1}^{n}π_i=1 ∑ i = 1 n π i = 1
一阶隐性马尔可夫模型包含两个简化的假设 词汇表V = v 1 , v 2 , . . . , v V V = v_1, v_2,..., v_V V = v 1 , v 2 , ... , v V
与一阶马尔可夫链一样,一个特定状态的概率只取决于前一个状态:
P ( q i ∣ q 1 … q i − 1 ) = P ( q i ∣ q i − 1 ) ( 8.6 ) P(q_i | q_1 \ldots q_{i-1}) = P(q_i | q_{i-1})\qquad(8.6) P ( q i ∣ q 1 … q i − 1 ) = P ( q i ∣ q i − 1 ) ( 8.6 )
一个输出观察值 o i o_i o i 的概率只取决于产生该观察值的状态 q i q_i q i ,而不取决于任何其他状态和其他观察值:
P ( o i ∣ q 1 , … , q i , … , q T , o 1 , … , o i , … , o T ) = P ( o i ∣ q i ) ( 8.7 ) P(o_i | q_1, \ldots, q_i, \ldots, q_T, o_1, \ldots, o_i, \ldots, o_T) = P(o_i | q_i)\qquad(8.7) P ( o i ∣ q 1 , … , q i , … , q T , o 1 , … , o i , … , o T ) = P ( o i ∣ q i ) ( 8.7 )
2.2 HMM标注器组件
HMM有两个组件:矩阵A和矩阵B
矩阵A:标签转移概率 P ( t i ∣ t i − 1 ) P(t_i|t_{i-1}) P ( t i ∣ t i − 1 ) ,表示在给定前一个标签的情况下,出现当前标签的可能性。例如,情态动词后面很可能是一个基本形式的动词,即 VB,如 race ,所以我们会期望这种概率会很高。我们通过统计一个语料库中第一个和第二个出现的次数,来计算这个转移概率的最大似然估计。
P ( t i ∣ t i − 1 ) = C ( t i − 1 , t i ) C ( t i − 1 ) ( 8.8 ) P(t_i|t_{i-1}) = \dfrac{C(t_{i-1}, t_i)}{C(t_{i-1})}\qquad(8.8) P ( t i ∣ t i − 1 ) = C ( t i − 1 ) C ( t i − 1 , t i ) ( 8.8 )
词性标记集:
www.ibm.com/docs/zh/wca…
例如,在 WSJ 语料库中,MD 出现了 13124 次,其中后面跟着 VB 的情况出现了 10471 次,所以其 MLE 估计为
P ( V B ∣ M D ) = C ( M D , V B ) C ( M D ) = 10471 13124 = 0.80 ( 8.9 ) P(VB|MD) = \dfrac{C(MD, VB)}{C(MD)}=\dfrac{10471}{13124}=0.80\qquad(8.9) P ( V B ∣ M D ) = C ( M D ) C ( M D , V B ) = 13124 10471 = 0.80 ( 8.9 )
词性标注任务举例
在 HMM 标注中,概率是通过统计标注训练语料库来估计的。在这个例子中,我们将使用标注好的 WSJ 语料库。
发射概率 B B B ,P ( w i ∣ t i ) P(w_i|t_i) P ( w i ∣ t i ) ,表示给定一个标签t i t_i t i (例如 MD),其对应词是某个给定词w i w_i w i (如 will )的概率。该发射概率的 MLE 是
P ( w i ∣ t i ) = C ( t i , w i ) C ( t i ) ( 8.10 ) P(w_i|t_i) = \dfrac{C(t_i, w_i)}{C(t_i)}\qquad(8.10) P ( w i ∣ t i ) = C ( t i ) C ( t i , w i ) ( 8.10 )
在 WSJ 语料库中出现的 13124 次 MD 中,其对应词是 will 的有 4046次:
P ( w i l l ∣ M D ) = C ( M D , w i l l ) C ( M D ) = 4046 13124 = 0.31 ( 8.11 ) P(will|MD) = \dfrac{C(MD, will)}{C(MD)}=\dfrac{4046}{13124}=0.31\qquad(8.11) P ( w i ll ∣ M D ) = C ( M D ) C ( M D , w i ll ) = 13124 4046 = 0.31 ( 8.11 )
请记住,这个似然项不是在问“will 这个词最可能的标签是什么?” 那将是后验概率 P ( M D ∣ w i l l ) P(MD|will) P ( M D ∣ w i ll ) ,相反P ( w i l l ∣ M D ) P(will|MD) P ( w i ll ∣ M D ) 回答的是一个略显反常的问题:“如果我们要生成一个 MD,那么这个情态动词有多大可能是 will ?”
如图
类比马尔可夫链,这里有三个状态VB(动词)、MD(情态动词)、NN(名词),观察值o i o_i o i 表示的是词,如"will"、"back"等
、如图可看出转移概率矩阵A A A 和观察值似然B B B
对于包含隐藏变量的模型,如HMM,解码指的就是确定与观察值序列相对应的隐藏值序列的任务,即
解码 :给定一个 HMM λ = ( A , B ) \lambda = (A, B) λ = ( A , B ) 和一个观察值序列 O = o 1 , o 2 , … , o T O = o_1, o_2, \ldots, o_T O = o 1 , o 2 , … , o T 作为输入,找出最有可能的状态序列 Q = q 1 q 2 q 3 … q T Q = q_1 q_2 q_3 \ldots q_T Q = q 1 q 2 q 3 … q T 。
对于词性标注,HMM 解码的目标给定 n n n 个词的序列 w 1 … w n w_1 \ldots w_n w 1 … w n ,选择最有可能的标签序列 t 1 … t n t_1 \ldots t_n t 1 … t n :
t ^ 1 : n = arg max t 1 … t n P ( t 1 … t n ∣ w 1 … w n ) ( 8.12 ) \hat{t}_{1:n} = \argmax_{t_1 \ldots t_n} P(t_1 \ldots t_n | w_1 \ldots w_n)\qquad(8.12) t ^ 1 : n = arg max t 1 … t n P ( t 1 … t n ∣ w 1 … w n ) ( 8.12 )
我们在 HMM 中实际会使用贝叶斯法则来计算:
t ^ 1 : n = arg max t 1 … t n P ( w 1 … w n ∣ t 1 … t n ) P ( t 1 … t n ) P ( w 1 … w n ) ( 8.13 ) \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)}\qquad(8.13) t ^ 1 : n = arg max t 1 … t n P ( w 1 … w n ) P ( w 1 … w n ∣ t 1 … t n ) P ( t 1 … t n ) ( 8.13 )
我们继续简化上一个公式,直接去掉分母 P ( w 1 n ) P(w_1^n) P ( w 1 n ) (Luna:因为我们已知这个单词序列,所以它的可能性为1,可以直接去掉)
t ^ 1 : n = arg max t 1 … t n P ( w 1 … w n ∣ t 1 … t n ) P ( t 1 … t n ) ( 8.14 ) \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)}\qquad(8.14) t ^ 1 : n = arg max t 1 … t n P ( w 1 … w n ∣ t 1 … t n ) P ( t 1 … t n ) ( 8.14 )
HMM标注器又做了两个简化:
一个词出现的概率只取决于它自己标签的概率,而与它相邻的词没有关系
P ( w 1 … w n ∣ t 1 … t n ) ≈ ∏ i = 1 n P ( w i ∣ t i ) ( 8.15 ) P(w_1 \ldots w_n | t_1 \ldots t_n) \approx \prod_{i=1}^n P(w_i | t_i) \qquad(8.15) P ( w 1 … w n ∣ t 1 … t n ) ≈ ∏ i = 1 n P ( w i ∣ t i ) ( 8.15 )
一个标签出现的概率只取决于它前一个标签,而与整个标签序列无关
P ( t 1 … t n ) ≈ ∏ i = 1 n P ( t i ∣ t i − 1 ) ( 8.16 ) P(t_1 \ldots t_n) \approx \prod_{i=1}^n P(t_i | t_{i-1})\qquad(8.16) P ( t 1 … t n ) ≈ ∏ i = 1 n P ( t i ∣ t i − 1 ) ( 8.16 )
由这两个简化我们可以得出从二元组标注器得到最有可能的标签序列公式:
t ^ 1 : n = arg max t 1 … t n P ( t 1 … t n ∣ w 1 … w n ) ≈ arg max t 1 … t n ∏ i = 1 n P ( w i ∣ t i ) ⏞ 发射概率 P ( t i ∣ t i − 1 ) ⏞ 转移概率 ( 8.17 ) \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})}^{转移概率}\qquad(8.17) t ^ 1 : n = arg max t 1 … t n P ( t 1 … t n ∣ w 1 … w n ) ≈ arg max t 1 … t n ∏ i = 1 n P ( w i ∣ t i ) 发射概率 P ( t i ∣ t i − 1 ) 转移概率 ( 8.17 )
2.3 维特比算法(The Viterbi Algorithm )
HMM 的解码算法是如下图所示的维特比(Viterbi )算法。作为动态规划的一个例子,Viterbi 算法类似于slp3第二章的动态规划最小编辑距离算法。
Viterbi 算法首先建立一个概率矩阵或者叫网格 (lattice ),其中每列为每个观察值 o t o_t o t ,每行为状态图中的每个状态。因此,在单个组合自动机中,每列(观察值o t o_t o t )对于每个状态 q i q_i q i 都有一个单元格。下图显示了 Janet will back the bill 这个句子对应的网格 lattice。
网格中的每个单元格,v t ( j ) v_t(j) v t ( j ) ,表示给定的 HMM λ \lambda λ 在“看到”前 t t t 个观测值,并通过最可能的状态序列 q 1 , … , q t − 1 q_1, \ldots, q_{t-1} q 1 , … , q t − 1 后,处于状态 j j j 的概率。每个单元格 v t ( j ) v_t(j) v t ( j ) 的值都是通过递归的方式计算的,即每次都取到达该单元格的最可能的路径。从形式上看,每个单元格表示的概率是
v t ( j ) = max q 1 , … , q t − 1 P ( q 1 … q t − 1 , o 1 , o 2 … o t , q t = j ∣ λ ) ( 8.18 ) v_t(j) = \max_{q_1, \ldots, q_{t-1}} P(q_1 \ldots q_{t-1}, o_1, o_2 \ldots o_t, q_t = j | \lambda)\qquad(8.18) v t ( j ) = max q 1 , … , q t − 1 P ( q 1 … q t − 1 , o 1 , o 2 … o t , q t = j ∣ λ ) ( 8.18 )
我们通过在前面所有可能的状态序列中取最大值 max q 1 , … , q t − 1 \max_{q_1, \ldots, q_{t-1}} max q 1 , … , q t − 1 来表示最可能的路径。像其他动态规划算法一样,Viterbi 算法递归地填充每个单元格。鉴于我们已经计算出了在时间 t − 1 t-1 t − 1 时处于每个状态的概率,所以我们可以取到达当前单元格的所有扩展路径中的概率最大值作为当前时间 t t t 的概率值。对于在时间 t t t 时的给定状态 q j q_j q j ,其值 v t ( j ) v_t(j) v t ( j ) 的计算方法是
v t ( j ) = max i = 1 N v t − 1 ( i ) a i j b j ( o t ) ( 8.19 ) v_t(j) = \max_{i=1}^N v_{t-1}(i) a_{ij} b_j(o_t) \qquad(8.19) v t ( j ) = max i = 1 N v t − 1 ( i ) a ij b j ( o t ) ( 8.19 )
公式 备注 v t − 1 ( i ) v_{t-1}(i) v t − 1 ( i ) 前一个时刻的Viterbi 路径概率 a i j a_{ij} a ij 前一个状态 q i q_i q i 到当前状态 q j q_j q j 的转移概率 b j ( o t ) b_j(o_t) b j ( o t ) 给定当前状态 j j j ,观察值 o t o_t o t 的状态观察值似然
举例:Janet will back the bill,目标是得到正确的标签序列:
Janet/NNP will/MD back/VB the/DT bill/NN
上图(8.11)显示了每个单词可能的标签,并从这些隐藏状态中突出展示了句子对应的正确的词性序列。并且把词性(状态)被实现为单词(观测值)概率为0的状态用灰色展示(比如DT不可能->Janet)
那么接下来我们来具体分析:
图8.12表示状态之间的转移概率a i j a_{ij} a ij 矩阵:
即前一个时刻是MD后一个时刻是VB的可能性是0.7968
P ( V B ∣ M D ) = 0.7968 P(VB|MD)=0.7968 P ( V B ∣ M D ) = 0.7968
图8.13表示b i ( o t ) b_i(o_t) b i ( o t ) 概率,即给定标签时观察值 的似然
图8.14是图8.11的详细版本,即用于计算观察值序列“Janet will back the bill”的最佳隐藏状态序列的 Viterbi 网格。
有 N = 5 N=5 N = 5 个状态列。我们从第 1 列(对应于词 Janet )开始,将每个单元格的 Viterbi 值设置为转移概率 π \pi π (状态 i i i 的初始概率,我们可以从图 8.12 的 <s> 项中得到)即P ( N N P ∣ s t a r t ) = 0.2767 P(NNP|start)=0.2767 P ( NNP ∣ s t a r t ) = 0.2767 (标签NNP作为start的概率是0.2767),以及我们可以看到给定该单元格标签时,词 Janet 的观察值似然值。这一列中的大部分单元格都是零v 1 ( 7 ) = P ( J a n e t ∣ D T ) = 0 v_1(7)=P(Janet|DT)=0 v 1 ( 7 ) = P ( J an e t ∣ D T ) = 0 ,因为 Janet 这个词不可能是这些标签中的任何一个。读者应该可以在图 8.14 中看到这一点。
接下来,更新 will 列中的每个单元格。对于每个状态,我们根据公式 8.19 来计算 v i t e r b i [ s , t ] viterbi[s,t] v i t er bi [ s , t ] ,取前一列中通往当前单元的所有路径的扩展值的最大值。我们已经给出了 MD、VB 和 NN 单元格的值。每个单元格都取前一列 7 个单元格的最大值,再乘以相应的转移概率;在这个例子中,它们中的大多数都是零。然后再乘以相应的观察值概率,并取其中最大值。在这个例子中,最终的数值(译者注:即最大值 ),2.772e-8,来自前一列的 NNP 状态。读者可以继续完成图 8.14 中剩余的单元格,并回溯看看 Viterbi 算法是否返回了正确的状态序列 NNP MD VB DT NN。